Многоязычность — одна из востребованных функций для сайтов на WordPress, особенно если вы хотите охватить аудиторию из разных стран. Большинство разработчиков выбирают популярные плагины, такие как WPML или Polylang, но иногда возникают ситуации, когда плагины нежелательны: из-за нагрузки, совместимости или желания иметь полный контроль над кодом. В этой статье мы рассмотрим, как реализовать многоязычность в WordPress без плагинов, используя собственные функции, шаблоны и базу данных.
Почему стоит реализовывать многоязычность без плагинов
Плагины — удобное решение, но они:
- Увеличивают нагрузку на сайт, что может замедлить загрузку страниц.
- Иногда вызывают конфликты с темами или другими плагинами.
- Могут не полностью соответствовать вашим уникальным требованиям.
- Добавляют зависимость от сторонних разработчиков.
Собственная реализация даст вам полный контроль над функционалом и позволит оптимизировать работу под ваши задачи.
Основные подходы к созданию многоязычности без плагинов
Можно выделить несколько методов:
- Использование разных поддоменов или каталогов для каждого языка (например, ru.wpconfig.ru, en.wpconfig.ru или wpconfig.ru/ru/, wpconfig.ru/en/).
- Создание отдельных страниц и записей для каждого языка с привязкой через пользовательские поля.
- Переключение языков через параметр URL.
- Использование собственного массива с переводами для интерфейса.
В этой статье мы сосредоточимся на реализации через каталоги и пользовательские поля.
Шаг 1. Настройка структуры URL для языков
Для начала нужно решить, как будут выглядеть адреса. Самый удобный и SEO-дружественный вариант — использование подкаталогов. Например:
- https://wpconfig.ru/ru/ — русский
- https://wpconfig.ru/en/ — английский
Чтобы WordPress поддерживал такие URL, нужно добавить правила перезаписи и зарегистрировать языки.
Добавим в functions.php темы следующий код:
function wpconfig_add_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', 'wpconfig_add_language_rewrite_rules');
function wpconfig_add_query_vars($vars) {
$vars[] = 'lang';
return $vars;
}
add_filter('query_vars', 'wpconfig_add_query_vars');
Этот код позволяет WordPress распознавать параметр lang из URL и использовать его в запросах.
После добавления правил перезапишите структуру постоянных ссылок в админке (Настройки → Постоянные ссылки), чтобы правила вступили в силу.
Шаг 2. Создание страниц и записей для разных языков
Для каждой страницы создайте её копию для второго языка. Например, создайте страницу с ярлыком about для русского и about для английского в подкаталогах /ru/ и /en/.
Чтобы связать страницы между собой, используйте пользовательское поле wpconfig_lang_group. Это будет уникальный идентификатор группы перевода.
Например, если у страницы "О нас" в русском варианте wpconfig_lang_group=123, то у английской версии должна быть такая же метка.
Добавьте в functions.php функцию для получения страницы на нужном языке:
function wpconfig_get_translated_post($post_id, $lang) {
$group = get_post_meta($post_id, 'wpconfig_lang_group', true);
if (!$group) return null;
$args = [
'post_type' => get_post_type($post_id),
'meta_key' => 'wpconfig_lang_group',
'meta_value' => $group,
'posts_per_page' => 1,
'post_status' => 'publish'
];
if ($lang === 'ru') {
$args['tax_query'] = [];
} elseif ($lang === 'en') {
// можно добавить условие по языковому таксономическому термину, если есть
}
$posts = get_posts($args);
foreach ($posts as $p) {
if ($p->ID != $post_id) return $p;
}
return null;
}
Это позволит получить соответствующую страницу на другом языке при необходимости.
Шаг 3. Добавление переключателя языка в шаблон
Чтобы пользователь мог переключаться между языками, добавим простой переключатель. В файле темы, например, в header.php, вставьте следующий код:
$current_lang = get_query_var('lang') ?: 'ru';
$post_id = get_the_ID();
$other_lang = ($current_lang === 'ru') ? 'en' : 'ru';
$translated_post = wpconfig_get_translated_post($post_id, $other_lang);
if ($translated_post) {
$url = home_url('/' . $other_lang . '/' . $translated_post->post_name);
echo '<a href="' . esc_url($url) . '">' . esc_html(strtoupper($other_lang)) . '</a>';
} else {
echo '<span>' . strtoupper($other_lang) . ' (нет перевода)</span>';
}
Этот код определит текущий язык, найдет перевод страницы и выведет ссылку на него. Если перевода нет, покажет надпись.
Шаг 4. Перевод интерфейсных строк с помощью собственного массива
Для перевода элементов интерфейса (например, меню, кнопок) можно создать массив с переводами и функцию вывода.
$wpconfig_translations = [
'ru' => [
'read_more' => 'Читать далее',
'search' => 'Поиск',
],
'en' => [
'read_more' => 'Read more',
'search' => 'Search',
],
];
function wpconfig_translate($key) {
global $wpconfig_translations;
$lang = get_query_var('lang') ?: 'ru';
return $wpconfig_translations[$lang][$key] ?? $key;
}
Теперь в шаблонах можно выводить перевод так: <?php echo wpconfig_translate('read_more'); ?>
Шаг 5. Работа с меню и виджетами для разных языков
Для меню создайте в админке несколько меню, например "Меню RU" и "Меню EN", и добавьте в functions.php регистрацию двух меню:
register_nav_menus([
'wpconfig_menu_ru' => 'Меню Русский',
'wpconfig_menu_en' => 'Меню Английский'
]);
В шаблоне выводите меню в зависимости от языка:
$lang = get_query_var('lang') ?: 'ru';
$menu_location = ($lang === 'ru') ? 'wpconfig_menu_ru' : 'wpconfig_menu_en';
wp_nav_menu(['theme_location' => $menu_location]);
Это позволит иметь разные меню для каждого языка.
Шаг 6. Особенности и рекомендации по SEO
Важно настроить правильные мета-теги и hreflang для поисковых систем. В header.php добавьте:
$current_url = home_url(add_query_arg([], $wp->request));
echo '<link rel="alternate" hreflang="ru" href="' . home_url('/ru/' . get_post_field('post_name')) . '" />';
echo '<link rel="alternate" hreflang="en" href="' . home_url('/en/' . get_post_field('post_name')) . '" />';
Это поможет поисковикам правильно индексировать страницы.
Итоги и дальнейшее развитие
Реализация многоязычности без плагинов требует больше времени и усилий, но дает полный контроль над сайтом. Вы можете расширять функционал добавлением языковых таксономий, фильтрацией контента, переводом пользовательских полей и других элементов.
Если нужны дополнительные советы или примеры, обращайтесь к документации WordPress и сообществу разработчиков.