Создание многоязычного сайта на WordPress — востребованная задача, особенно если нужно обойтись без сторонних плагинов. Многие разработчики и владельцы сайтов опасаются использовать тяжелые плагины из-за их влияния на производительность и потенциальных конфликтов. В этой статье мы разберем, как организовать базовую многоязычность на WordPress с минимальными затратами ресурсов, используя стандартные функции и небольшой пользовательский код.
Почему стоит создавать многоязычность без плагина
Плагины для многоязычности, такие как WPML или Polylang, удобны, но имеют свои недостатки:
- Увеличивают нагрузку на сайт и базу данных.
- Могут конфликтовать с другими плагинами и темами.
- Иногда слишком сложны для простых сайтов с 2-3 языками.
Если ваша задача — простой сайт с двумя-тремя языками, где не требуется сложная синхронизация контента, можно реализовать это самостоятельно.
Как организовать структуру многоязычного сайта без плагинов
Основная идея — использовать разные страницы и записи для каждой языковой версии и переключать их через меню или ссылки. Рассмотрим ключевые аспекты:
1. Создание страниц для каждого языка
Для каждого языка создаем отдельные страницы или записи в админке. Например, для страницы «О компании» создаем две страницы: «О компании» (русский) и «About Us» (английский).
Рекомендуется придерживаться единой структуры URL, например:
/ru/o-kompanii/— русская версия/en/about-us/— английская версия
Для этого можно использовать статическую структуру постоянных ссылок и добавить языковой префикс в URL.
2. Добавление языковых префиксов в URL
Чтобы WordPress корректно обрабатывал разные языки, добавим префиксы ru и en в URL. Это можно сделать с помощью настройки постоянных ссылок и дополнительных правил в файле .htaccess или функциях темы.
Пример добавления префикса языка в начале URL для страниц:
function wpgen_add_language_prefix() {
$lang = '';
if ( isset($_GET['lang']) ) {
$lang = sanitize_text_field($_GET['lang']);
} else {
$lang = 'ru'; // язык по умолчанию
}
return $lang;
}
function wpgen_language_rewrite_rules() {
add_rewrite_rule('^ru/(.+)/?$', 'index.php?pagename=$matches[1]&lang=ru', 'top');
add_rewrite_rule('^en/(.+)/?$', 'index.php?pagename=$matches[1]&lang=en', 'top');
}
add_action('init', 'wpgen_language_rewrite_rules');После добавления правил нужно обновить структуру постоянных ссылок в админке.
3. Вывод контента в зависимости от языка
В шаблонах темы можно проверять текущий язык и выводить соответствующие материалы. Например, использовать URL или параметр $_GET['lang'] для определения языка.
function wpgen_get_current_lang() {
if ( isset($_GET['lang']) && in_array($_GET['lang'], ['ru','en']) ) {
return $_GET['lang'];
}
return 'ru'; // язык по умолчанию
}
$current_lang = wpgen_get_current_lang();
if ($current_lang === 'ru') {
// вывод русской версии
} else {
// вывод английской версии
}Переключатель языков: удобный UX
Для удобства пользователей нужно добавить переключатель языков. Его можно реализовать как простое меню с ссылками на текущую страницу на другом языке.
Пример кода для вывода переключателя в шаблоне:
function wpgen_language_switcher() {
$current_url = $_SERVER['REQUEST_URI'];
$ru_url = preg_replace('#^/en/#', '/ru/', $current_url);
$en_url = preg_replace('#^/ru/#', '/en/', $current_url);
echo '<nav class="language-switcher">';
echo '<a href="' . esc_url($ru_url) . '">Русский</a> | ';
echo '<a href="' . esc_url($en_url) . '">English</a>';
echo '</nav>';
}Вставьте вызов wpgen_language_switcher() в нужное место шаблона, например, в шапку сайта.
Работа с меню и навигацией для разных языков
Рекомендуется создавать отдельные меню для каждого языка в админке WordPress. В шаблонах выводить меню в зависимости от текущего языка:
function wpgen_get_menu_location($lang) {
return $lang === 'ru' ? 'primary-ru' : 'primary-en';
}
$current_lang = wpgen_get_current_lang();
wp_nav_menu(array('theme_location' => wpgen_get_menu_location($current_lang)));
Это позволит адаптировать навигацию под каждый язык, включая переведенные пункты меню.
Пример: создание пользовательского типа записей для переводов
Если ваш сайт содержит много записей, можно создать отдельный пользовательский тип записей для каждого языка или добавить кастомное поле с языком. Рассмотрим вариант с кастомным полем:
function wpgen_add_language_meta_box() {
add_meta_box('wpgen_lang_meta', 'Язык записи', 'wpgen_lang_meta_box_callback', 'post', 'side');
}
add_action('add_meta_boxes', 'wpgen_add_language_meta_box');
function wpgen_lang_meta_box_callback($post) {
$value = get_post_meta($post->ID, '_wpgen_lang', true);
?>
<label for="wpgen_lang_field">Язык:</label>
<select name="wpgen_lang_field" id="wpgen_lang_field">
<option value="ru" <?php selected( $value, 'ru' ); ?>>Русский</option>
<option value="en" <?php selected( $value, 'en' ); ?>>English</option>
</select>
<?php
}
function wpgen_save_language_meta($post_id) {
if (array_key_exists('wpgen_lang_field', $_POST)) {
update_post_meta($post_id, '_wpgen_lang', sanitize_text_field($_POST['wpgen_lang_field']));
}
}
add_action('save_post', 'wpgen_save_language_meta');Далее при выводе записей можно фильтровать по языку:
$current_lang = wpgen_get_current_lang();
$query = new WP_Query(array(
'meta_key' => '_wpgen_lang',
'meta_value' => $current_lang,
'post_type' => 'post'
));
while ($query->have_posts()) {
$query->the_post();
the_title();
// и т.д.
}
wp_reset_postdata();SEO-аспекты многоязычности без плагинов
Чтобы поисковики корректно индексировали разные языковые версии, нужно:
- Добавить в <head> теги
hreflangдля каждой версии. - Использовать правильные URL с языковыми префиксами.
- Создавать sitemap с ссылками на все языковые версии.
Пример вывода hreflang в header.php:
<link rel="alternate" hreflang="ru" href="https://example.com/ru/" />
<link rel="alternate" hreflang="en" href="https://example.com/en/" />Заключение
Многоязычный сайт на WordPress без плагинов — вполне реализуемая задача, если не нужна сложная синхронизация и автоматизация перевода. Такой подход позволит снизить нагрузку на сайт, сохранить контроль над кодом и избежать лишних зависимостей.
Используйте языковые префиксы в URL, создавайте отдельные страницы и меню для каждого языка, добавляйте переключатель языков в интерфейс и не забывайте про SEO-правильность.
Если понадобится расширить функционал, можно дополнить данный базовый код своими модулями или постепенно внедрять специализированные плагины.
Для удобства работы с разными типами контента и мета-данными рекомендуем ознакомиться с полезными плагинами от WPSHOP, которые облегчают управление данными и оптимизацию WordPress.