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

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

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

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

  • Нагрузка на сайт. Многие плагины увеличивают количество запросов, что замедляет загрузку страниц.
  • Совместимость. Не все плагины хорошо работают с кастомными темами или специфическими плагинами.
  • Стоимость. Некоторые расширенные функции доступны только в платных версиях.
  • Зависимость. Вы привязаны к разработчикам плагина и их обновлениям.

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

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

Чтобы сделать сайт мультиязычным без плагинов, нам нужно решить несколько задач:

  1. Определение текущего языка пользователя.
  2. Выбор и загрузка соответствующего контента.
  3. Переключение языков с сохранением SEO-дружелюбных URL.
  4. Перевод интерфейса и текста шаблонов.

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

Структура URL для разных языков

Оптимальным вариантом будет использование префиксов в URL, например:

  • https://wptalk.ru/ru/ — русская версия
  • https://wptalk.ru/en/ — английская версия

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

Определение языка и маршрутизация

Для начала создадим функцию, которая будет определять язык по URL и сохранять его в сессии или куках, чтобы пользователь не терял выбранный язык при переходах:

function wptalk_detect_language() {
    if (isset($_GET['lang'])) {
        $lang = sanitize_text_field($_GET['lang']);
        if (in_array($lang, ['ru', 'en'])) {
            setcookie('wptalk_lang', $lang, time()+3600*24*30, '/');
            $_COOKIE['wptalk_lang'] = $lang;
        }
    } elseif (isset($_COOKIE['wptalk_lang'])) {
        $lang = $_COOKIE['wptalk_lang'];
    } else {
        $lang = 'ru'; // язык по умолчанию
    }
    return $lang;
}

Затем вызовем эту функцию в хуке init, чтобы определить текущий язык сайта:

add_action('init', function() {
    $current_lang = wptalk_detect_language();
    define('WPTALK_CURRENT_LANG', $current_lang);
});

Далее нужно настроить перезапись правил (rewrite rules), чтобы WordPress понимал URL с префиксом языка.

Добавление правил перезаписи для языков

Добавьте следующий код в файл functions.php вашей темы:

function wptalk_add_rewrite_rules() {
    add_rewrite_rule('^(ru|en)/?$', 'index.php?lang=$matches[1]', 'top');
    add_rewrite_rule('^(ru|en)/(.+?)/?$', 'index.php?lang=$matches[1]&name=$matches[2]', 'top');
}
add_action('init', 'wptalk_add_rewrite_rules');

function wptalk_add_query_vars($vars) {
    $vars[] = 'lang';
    return $vars;
}
add_filter('query_vars', 'wptalk_add_query_vars');

После добавления правил нужно обновить постоянные ссылки в админ-панели (Настройки — Постоянные ссылки).

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

Для хранения переводов контента мы можем использовать стандартные поля (custom fields) или кастомные типы записей. Пример с использованием метаполей:

Создадим для каждой записи два поля: content_ru и content_en. В админке вы сможете редактировать эти поля, а на фронтенде выводить нужный перевод.

function wptalk_get_translated_content($post_id) {
    $lang = defined('WPTALK_CURRENT_LANG') ? WPTALK_CURRENT_LANG : 'ru';
    $content = get_post_meta($post_id, 'content_' . $lang, true);
    if (!$content) {
        $content = get_the_content(null, false, $post_id); // fallback
    }
    return $content;
}

В шаблоне single.php замените стандартный вывод контента на:

echo wptalk_get_translated_content(get_the_ID());

Перевод заголовков и других элементов

Для перевода заголовков и текстов шаблонов можно создать массив с переводами и функцию для вывода по текущему языку:

$wptalk_translations = [
    'en' => [
        'read_more' => 'Read more',
        'comments' => 'Comments',
    ],
    'ru' => [
        'read_more' => 'Читать далее',
        'comments' => 'Комментарии',
    ],
];

function wptalk_translate($key) {
    global $wptalk_translations;
    $lang = defined('WPTALK_CURRENT_LANG') ? WPTALK_CURRENT_LANG : 'ru';
    return $wptalk_translations[$lang][$key] ?? $key;
}

Теперь в шаблонах можно писать:

echo wptalk_translate('read_more');

Навигация между языками

Очень важно предоставить пользователю возможность переключаться между языковыми версиями. Для этого создадим функцию вывода языкового переключателя:

function wptalk_language_switcher() {
    $current_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $langs = ['ru' => 'Русский', 'en' => 'English'];
    $output = '<ul class="wptalk-language-switcher">';
    foreach ($langs as $code => $name) {
        $url = preg_replace('#^/(ru|en)/#', '/' . $code . '/', $current_url);
        if (!preg_match('#^/(ru|en)/#', $current_url)) {
            $url = '/' . $code . $current_url;
        }
        $active = (defined('WPTALK_CURRENT_LANG') && WPTALK_CURRENT_LANG === $code) ? 'class="active"' : '';
        $output .= '<li ' . $active . '><a href="' . esc_url($url) . '?lang=' . $code . '">' . esc_html($name) . '</a></li>';
    }
    $output .= '</ul>';
    echo $output;
}

Выведите эту функцию в нужном месте темы, например, в header.php.

Кастомные типы записей и таксономии для языков

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

Пример регистрации таксономии language:

function wptalk_register_language_taxonomy() {
    register_taxonomy('language', 'post', [
        'label' => 'Язык',
        'rewrite' => ['slug' => 'lang'],
        'hierarchical' => false,
        'show_ui' => true,
        'show_admin_column' => true,
    ]);
}
add_action('init', 'wptalk_register_language_taxonomy');

После этого можно создавать термины ru и en и назначать их постам.

Резюме и рекомендации

Создание мультиязычного сайта без плагинов требует больше времени на настройку и поддержку, но дает полный контроль и легкость. Важно:

  • Продумать структуру URL и логику определения языка.
  • Организовать хранение переводов (через метаполя или таксономии).
  • Создать удобный интерфейс переключения языков.
  • Перевести основные элементы шаблона.

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

Как удалить все комментарии в WordPress массово
27.11.2025
Отложенная публикация постов в WordPress: практическое руководство
09.01.2026
Как избавиться от замедления WordPress при использовании подгрузки изображений
11.12.2025
Как создать собственный тип записи (Custom Post Type) в WordPress
07.02.2026
Как удалить пустые тексты и повторяющиеся посты в WordPress без плагинов
22.05.2026