Мультиязычность — одна из самых востребованных функций для сайтов на WordPress, особенно если аудитория международная или региональная. Большинство пользователей сразу ищут готовые решения в виде плагинов, таких как WPML или Polylang. Однако иногда плагины слишком громоздкие или не подходят под специфические задачи. В этой статье я расскажу, как реализовать мультиязычность без плагинов, используя собственные функции, шаблоны и минимальный код.
Почему стоит делать мультиязычность без плагинов
Многие плагины для мультиязычности увеличивают нагрузку на сайт, замедляют загрузку страниц и усложняют управление. Кроме того, они часто требуют отдельной настройки и могут конфликтовать с другими расширениями. Реализация мультиязычности вручную позволяет:
- Минимизировать количество стороннего кода;
- Иметь полный контроль над структурой и логикой;
- Оптимизировать SEO под каждую языковую версию;
- Легко интегрировать с кастомными темами и функционалом.
Такой подход идеален для небольших сайтов и проектов с ограниченным числом языков.
Основные принципы реализации мультиязычности в WordPress без плагинов
Принцип очень простой: каждая языковая версия — это отдельная страница или пост, которые связаны между собой через пользовательские поля или таксономии. Для переключения языка мы используем URL-параметры или структуру URL типа site.com/en/, site.com/ru/.
Важные моменты, которые стоит учитывать:
- Как хранить языковую метку (например, в URL через rewrite правила или параметр ?lang=ru);
- Как связывать переводы между собой;
- Как выводить правильный контент в зависимости от выбранного языка;
- Как переключать язык на фронтенде.
Шаг 1. Настройка структуры URL для языков
Самый простой способ — использовать префикс в URL, например /ru/ для русского и /en/ для английского. Для этого можно добавить rewrite правила в файл functions.php вашей темы:
function wplink_add_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', 'wplink_add_rewrite_rules');
function wplink_add_query_vars($vars) {
$vars[] = 'lang';
return $vars;
}
add_filter('query_vars', 'wplink_add_query_vars');
Эти правила позволят WordPress понимать, что при обращении к /ru/contact/ параметр lang будет равен 'ru'. После добавления правил необходимо обновить постоянные ссылки в админке (Настройки > Постоянные ссылки).
Шаг 2. Создание пользовательского поля для связи языков
Для каждой страницы или поста создадим пользовательское поле wplink_lang, чтобы указать язык контента, и wplink_translations — массив ID связанных переводов. Это можно делать вручную в админке или через код.
Пример установки этих полей программно:
update_post_meta($post_id, 'wplink_lang', 'ru');
update_post_meta($post_id, 'wplink_translations', array(
'en' => $english_post_id,
'ru' => $post_id
));
Таким образом, у каждой страницы будет метка языка и связь с переводами.
Шаг 3. Фильтрация контента по языку
Чтобы на сайте показывался контент нужного языка, необходимо в шаблоне проверять параметр lang и фильтровать запрос. Пример функции для изменения основного запроса:
function wplink_filter_main_query_by_lang($query) {
if (!is_admin() && $query->is_main_query()) {
$lang = get_query_var('lang', 'ru'); // по умолчанию русский
$meta_query = array(
array(
'key' => 'wplink_lang',
'value' => $lang
)
);
$query->set('meta_query', $meta_query);
}
}
add_action('pre_get_posts', 'wplink_filter_main_query_by_lang');
Это ограничит выборку страниц строго нужным языком.
Шаг 4. Создание переключателя языка
Переключатель языка — важный элемент UX. Его можно сделать в виде простого меню, где ссылки ведут на соответствующие языковые версии текущей страницы.
Пример функции вывода переключателя:
function wplink_language_switcher() {
global $post;
$translations = get_post_meta($post->ID, 'wplink_translations', true);
if (!$translations) return;
echo '<ul class="wplink-lang-switcher">';
foreach ($translations as $lang => $post_id) {
$url = get_permalink($post_id);
$active_class = (get_query_var('lang') === $lang) ? 'active' : '';
echo '<li class="'. $active_class .'"><a href="'. esc_url($url) .'">' . strtoupper($lang) . '</a></li>';
}
echo '</ul>';
}
Добавьте вызов wplink_language_switcher() в нужное место темы — например, в header.php или sidebar.php.
Шаг 5. Перевод статических элементов темы
Для перевода заголовков, кнопок и других элементов темы можно использовать условные операторы, проверяющие текущий язык:
function wplink_lang_text($ru_text, $en_text) {
$lang = get_query_var('lang', 'ru');
return $lang === 'ru' ? $ru_text : $en_text;
}
Пример использования в шаблоне:
echo '<h1>' . wplink_lang_text('Добро пожаловать', 'Welcome') . '</h1>';
Это простой способ локализации без использования gettext.
Дополнительные советы и улучшения
Если сайт большой, можно автоматизировать создание переводов через кастомные типы постов и таксономии, а также интегрировать с REST API для динамической подгрузки контента.
Для удобства управления языками можно добавить интерфейс в админку с помощью плагина Clearfy Pro, который помогает оптимизировать и упрощать многие настройки WordPress.
Подобный подход позволит сделать сайт легким, быстрым и полностью контролируемым по части мультиязычности без лишних зависимостей.
Итоговые преимущества ручной мультиязычности
- Минимальный вес сайта и высокая скорость загрузки;
- Гибкость и контроль над логикой;
- Отсутствие конфликтов с другими плагинами;
- Простота масштабирования под текущие задачи.