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

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

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

Плагины для многоязычности увеличивают нагрузку на сайт, замедляют работу и могут создавать сложности при обновлениях. Без плагинов вы получаете полный контроль над структурой и функционалом сайта. Это особенно актуально для небольших проектов, где нужно реализовать 2–3 языка с минимальными затратами.

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

Однако стоит понимать, что без плагинов придется реализовывать многие функции вручную, включая переключение языков, хранение контента для разных языков и SEO.

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

Создаем структуру URL для языков

Первый шаг — определить структуру URL. Чаще всего используют подкаталоги, например:

  • example.com/ru/ — русский язык
  • example.com/en/ — английский язык

Для этого в файле functions.php вашей темы или в отдельном плагине добавим фильтр на пермалинки и обработчик для языка.

function wphelper_set_language_from_url() {
    $uri = trim($_SERVER['REQUEST_URI'], '/');
    $parts = explode('/', $uri);
    $lang = $parts[0];
    $available_langs = ['ru', 'en'];

    if (in_array($lang, $available_langs)) {
        define('WPS_HELPER_CURRENT_LANG', $lang);
    } else {
        define('WPS_HELPER_CURRENT_LANG', 'ru'); // язык по умолчанию
    }
}
add_action('init', 'wphelper_set_language_from_url');

Этот код устанавливает константу WPS_HELPER_CURRENT_LANG с текущим языком, основываясь на первом сегменте URL.

Храним переводы в пользовательских полях

Чтобы хранить контент для разных языков без плагинов, удобно использовать пользовательские поля (post meta). Например, для заголовка и текста поста создадим поля title_en, title_ru, content_en, content_ru.

В редакторе WordPress можно использовать стандартный метабокс или написать свой для удобства редактирования.

Вывод контента на текущем языке

В шаблоне темы заменим стандартные функции the_title() и the_content() на наши функции, которые будут выводить нужный перевод.

function wphelper_get_translated_meta($post_id, $field) {
    $lang = defined('WPS_HELPER_CURRENT_LANG') ? WPS_HELPER_CURRENT_LANG : 'ru';
    $meta_key = $field . '_' . $lang;
    $value = get_post_meta($post_id, $meta_key, true);
    if (!$value) {
        // fallback на русский
        $value = get_post_meta($post_id, $field . '_ru', true);
    }
    return $value;
}

function wphelper_the_title() {
    echo wphelper_get_translated_meta(get_the_ID(), 'title');
}

function wphelper_the_content() {
    echo wphelper_get_translated_meta(get_the_ID(), 'content');
}

Теперь в шаблоне замените the_title() на wphelper_the_title(), а the_content() на wphelper_the_content().

Создаем переключатель языков

Для удобства пользователей нужен переключатель языков, который будет менять URL, сохраняя текущий путь.

function wphelper_language_switcher() {
    $available_langs = ['ru' => 'Русский', 'en' => 'English'];
    $current_lang = defined('WPS_HELPER_CURRENT_LANG') ? WPS_HELPER_CURRENT_LANG : 'ru';

    $uri = trim($_SERVER['REQUEST_URI'], '/');
    $parts = explode('/', $uri);
    if (in_array($parts[0], array_keys($available_langs))) {
        array_shift($parts); // удаляем текущий язык из URL
    }
    $path = implode('/', $parts);

    echo '<ul class="language-switcher">';
    foreach ($available_langs as $code => $name) {
        $url = site_url('/' . $code . '/' . $path);
        $class = $code === $current_lang ? 'active' : '';
        echo '<li class="' . $class . '"><a href="' . esc_url($url) . '">' . esc_html($name) . '</a></li>';
    }
    echo '</ul>';
}

Вызовите wphelper_language_switcher() в нужном месте темы (например, в header.php), чтобы вывести переключатель.

SEO для многоязычного сайта без плагинов

Для правильной индексации поисковиками важно указывать теги hreflang. Добавим их в header.php:

function wphelper_add_hreflang_tags() {
    $available_langs = ['ru', 'en'];
    $current_url = home_url($_SERVER['REQUEST_URI']);
    $uri = trim($_SERVER['REQUEST_URI'], '/');
    $parts = explode('/', $uri);
    if (in_array($parts[0], $available_langs)) {
        array_shift($parts);
    }
    $path = implode('/', $parts);

    foreach ($available_langs as $lang) {
        $href = home_url('/' . $lang . '/' . $path);
        echo '<link rel="alternate" hreflang="' . $lang . '" href="' . esc_url($href) . '" />';
    }
}
add_action('wp_head', 'wphelper_add_hreflang_tags');

Это поможет поисковым системам понимать, какие версии страницы существуют для разных языков.

Преимущества и ограничения такого подхода

Преимущества:

  • Минимум сторонних зависимостей и плагинов
  • Легко кастомизировать под свои нужды
  • Повышенная производительность без лишнего кода

Ограничения:

  • Больше ручной работы при добавлении контента
  • Отсутствие удобного интерфейса для переводчиков без дополнительных разработок
  • Нужно самостоятельно следить за SEO и корректной работой

Заключение

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

Если хотите посмотреть готовые решения для улучшения вашего сайта, обратите внимание на плагины и темы на WPSHOP.ru, которые помогут ускорить разработку и расширить функционал.

Как использовать WPRemark для оценки и модерации комментариев в WordPress
28.02.2026
Как разрешить доступ к файлам в WordPress без плагинов
05.02.2026
Как создать производительный виджет в WordPress с помощью REST API
13.12.2025
Как избежать ошибки Maximum execution time в WordPress
24.03.2026
Как создать автоматический бекап WordPress без плагинов
12.01.2026