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

Многоязычность — важный аспект для сайтов, ориентированных на международную аудиторию. Обычно в WordPress для реализации мультиязычности используют плагины, такие как Polylang или WPML. Однако иногда возникает необходимость сделать многоязычный сайт без сторонних плагинов, чтобы снизить нагрузку, повысить безопасность и сохранить полный контроль над кодом.

Почему стоит реализовывать многоязычность без плагинов

Использование плагинов — быстрый и удобный способ добавить языки, но у них есть свои недостатки:

  • Избыточный код и нагрузка на сайт.
  • Зависимость от обновлений и поддержки разработчиков.
  • Потеря гибкости при кастомизации.

Реализуя многоязычность вручную, вы получаете:

  • Легкий и оптимизированный код.
  • Возможность полностью контролировать структуру и логику.
  • Отсутствие конфликтов с другими плагинами.

Основные подходы к реализации многоязычности без плагинов

Существует несколько вариантов:

1. Использование пользовательских типов записей для каждого языка

Создайте отдельный тип записи для каждого языка, например, post_en, post_ru, и выводите их в зависимости от выбранного языка.

Плюс такого подхода — простота реализации. Минус — дублирование кода и сложность синхронизации контента.

2. Использование пользовательских таксономий для языков

В этом методе добавляется таксономия language, где каждому посту присваивается термин с языком — «ru», «en» и т.д.

Далее вы фильтруете запросы WP_Query по этой таксономии для вывода контента нужного языка.

3. Использование URL-параметров или поддоменов

Можно реализовать переключение языков по параметру в URL, например, ?lang=ru, или использовать поддомены ru.example.com.

Это удобно для SEO и позволяет гибко настраивать маршрутизацию.

Пример реализации многоязычности с помощью пользовательской таксономии

Создадим таксономию wpid_language для постов:

function wpid_register_language_taxonomy() {
    $labels = [
        'name' => 'Языки',
        'singular_name' => 'Язык',
        'search_items' => 'Поиск языков',
        'all_items' => 'Все языки',
        'edit_item' => 'Редактировать язык',
        'update_item' => 'Обновить язык',
        'add_new_item' => 'Добавить новый язык',
        'new_item_name' => 'Новое название языка',
        'menu_name' => 'Языки',
    ];

    register_taxonomy('wpid_language', 'post', [
        'labels' => $labels,
        'public' => true,
        'hierarchical' => false,
        'show_ui' => true,
        'show_admin_column' => true,
        'query_var' => true,
        'rewrite' => ['slug' => 'language'],
    ]);
}
add_action('init', 'wpid_register_language_taxonomy');

После регистрации в админке появится возможность назначать языки постам.

Фильтрация постов по языку с помощью pre_get_posts

Чтобы выводить на фронтенде только посты определенного языка, добавим фильтр:

function wpid_filter_posts_by_language($query) {
    if (!is_admin() && $query->is_main_query()) {
        if (isset($_GET['lang'])) {
            $lang = sanitize_text_field($_GET['lang']);
            $tax_query = [
                [
                    'taxonomy' => 'wpid_language',
                    'field' => 'slug',
                    'terms' => $lang,
                ],
            ];
            $query->set('tax_query', $tax_query);
        }
    }
}
add_action('pre_get_posts', 'wpid_filter_posts_by_language');

Теперь при запросе https://example.com/?lang=ru вы увидите только посты с языком «ru».

Автоматизация добавления языков и переводов

Чтобы упростить администрирование, можно сделать метабоксы или интерфейс для быстрого создания связей между постами разных языков. Например, в записи на русском добавить ссылку на перевод на английский.

Это поможет навигации и улучшит UX.

SEO и структура URL для многоязычности без плагинов

Для SEO важно правильно организовать URL. Вот популярные варианты:

  • Папки: example.com/ru/post-name/
  • Поддомены: ru.example.com/post-name/
  • Параметры: example.com/post-name?lang=ru

Для реализации папок можно добавить правила в .htaccess и обработку в WordPress через хук parse_request. Это немного сложнее, но дает лучший результат.

Пример обработки URL с языковыми папками

function wpid_parse_language_from_url() {
    $request_uri = $_SERVER['REQUEST_URI'];
    $segments = explode('/', trim($request_uri, '/'));
    $langs = ['ru', 'en', 'de'];
    if (in_array($segments[0], $langs)) {
        define('WPID_CURRENT_LANG', $segments[0]);
        // Можно подменить глобальные переменные для корректного запроса
        add_filter('pre_get_posts', function ($query) {
            if ($query->is_main_query()) {
                $query->set('tax_query', [[
                    'taxonomy' => 'wpid_language',
                    'field' => 'slug',
                    'terms' => WPID_CURRENT_LANG,
                ]]);
            }
        });
    } else {
        define('WPID_CURRENT_LANG', 'ru'); // язык по умолчанию
    }
}
add_action('init', 'wpid_parse_language_from_url');

Вывод переключателя языков

Для удобства пользователей сделаем простой переключатель языков:

function wpid_language_switcher() {
    $langs = get_terms(['taxonomy' => 'wpid_language', 'hide_empty' => false]);
    if (!$langs || is_wp_error($langs)) return;
    echo '<ul class="wpid-language-switcher">';
    $current_lang = defined('WPID_CURRENT_LANG') ? WPID_CURRENT_LANG : '';
    foreach ($langs as $lang) {
        $class = ($lang->slug === $current_lang) ? 'class="active"' : '';
        $url = add_query_arg('lang', $lang->slug, home_url('/'));
        echo "<li {$class}><a href=\"{$url}\">{$lang->name}</a></li>";
    }
    echo '</ul>';
}

Вызовите wpid_language_switcher() в нужном месте темы, чтобы отобразить список языков.

Поддержка перевода строк в шаблонах

Для многоязычия важно переводить не только контент, но и интерфейс. Вы можете использовать стандартные функции __() и _e() для перевода, а также создавать свои языковые файлы.

Для этого создайте папку languages в теме и используйте load_theme_textdomain('wpid', get_template_directory() . '/languages'); в functions.php.

Заключение

Добавление многоязычности без плагинов — задача, требующая больше времени и навыков, но она дает полный контроль и оптимизацию. Главное — грамотно организовать структуру, фильтрацию и навигацию.

Если нужна готовая расширенная функциональность, можно посмотреть на плагин Clearfy Pro, который оптимизирует работу сайта, включая языковые настройки.

Как использовать хуки для удаления метаданных в WordPress
08.01.2026
Как настроить автоматическое удаление старых комментариев в WordPress
05.04.2026
Как исключить определённые плагины из автообновлений в WordPress
25.04.2026
Как удалить метаданные из постов WordPress для оптимизации и безопасности
15.11.2025
Автоматическое сохранение контента через AJAX в редакторе Gutenberg WordPress
29.01.2026