Как сделать мультиязычность в WordPress без плагинов: практическое руководство

Мультиязычность — одна из самых востребованных функций для сайтов на 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.

Подобный подход позволит сделать сайт легким, быстрым и полностью контролируемым по части мультиязычности без лишних зависимостей.

Итоговые преимущества ручной мультиязычности

  • Минимальный вес сайта и высокая скорость загрузки;
  • Гибкость и контроль над логикой;
  • Отсутствие конфликтов с другими плагинами;
  • Простота масштабирования под текущие задачи.
Исключение товаров по атрибутам из корзины WooCommerce: практическое руководство
18.04.2026
Автопостинг в WordPress: как настроить автоматический публикации
22.11.2025
Как отключить Emoji в WordPress для ускорения сайта
14.06.2026
Исключение товаров по атрибутам из корзины WooCommerce
18.05.2026
Как удалить или заблокировать роботов в WordPress через robots.txt
31.03.2026