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

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

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

Плагины для мультиязычности, такие как WPML, Polylang или TranslatePress, удобны, но имеют ряд минусов:

  • Увеличивают нагрузку на сайт и базу данных;
  • Могут конфликтовать с другими плагинами и темами;
  • Ограничивают гибкость в реализации уникальных сценариев;
  • Иногда создают сложности с SEO, если не настроены правильно.

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

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

Есть несколько вариантов реализации мультиязычности:

1. Отдельные подкаталоги для каждого языка

Например, example.com/ru/ и example.com/en/. В WordPress это можно реализовать через структуру постоянных ссылок и условные проверки в шаблонах.

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

Например, example.com/?lang=ru. Удобно для быстрого старта, но менее SEO-дружелюбно.

3. Отдельные сайты в мультисайте WordPress

Если нужно полностью раздельное управление контентом для каждого языка.

В этой статье мы рассмотрим первый вариант — подкаталоги — как наиболее универсальный и SEO-оптимальный.

Настройка подкаталогов и маршрутизации

Для начала создадим структуру URL с подкаталогами для каждого языка. Чтобы WordPress понимал, что /ru/ и /en/ — это разные языки, нужно настроить маршрутизацию и фильтры.

В файле functions.php вашей темы добавим код для перехвата языкового параметра из URL:

function wpma_detect_language() {
    $langs = array('ru', 'en'); // Список поддерживаемых языков
    $request_uri = $_SERVER['REQUEST_URI'];
    foreach ($langs as $lang) {
        if (strpos($request_uri, '/' . $lang . '/') === 0) {
            return $lang;
        }
    }
    return 'ru'; // Язык по умолчанию
}

function wpma_filter_request($query) {
    if (!isset($query->query_vars['lang'])) {
        $query->query_vars['lang'] = wpma_detect_language();
    }
}
add_action('parse_request', 'wpma_filter_request');

Здесь мы определяем язык по первому сегменту URL и сохраняем его в параметре запроса lang.

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

Теперь нужно организовать хранение контента на нескольких языках и вывод в зависимости от параметра lang.

Использование пользовательских полей для переводов

Самый простой способ — хранить переводы в метаполях у каждой записи. Например, для записи есть стандартные поля post_title и post_content на русском, а для английского делаем метаполя wpma_title_en и wpma_content_en.

В шаблоне вывода статьи (например, single.php) используем функцию, которая покажет контент на нужном языке:

function wpma_get_translated_field($post_id, $field, $lang) {
    if ($lang === 'ru') {
        return get_post_field($field, $post_id);
    }
    $meta_key = 'wpma_' . $field . '_' . $lang;
    $translated = get_post_meta($post_id, $meta_key, true);
    if ($translated) {
        return $translated;
    }
    return get_post_field($field, $post_id); // fallback
}

// В шаблоне вывода
$lang = get_query_var('lang') ?: 'ru';
$title = wpma_get_translated_field(get_the_ID(), 'post_title', $lang);
$content = wpma_get_translated_field(get_the_ID(), 'post_content', $lang);
?>
<h1><?php echo esc_html($title); ?></h1>
<div><?php echo wp_kses_post($content); ?></div>
<?php

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

Добавление метаполей в админке

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

function wpma_add_translation_metabox() {
    add_meta_box(
        'wpma_translation',
        'Перевод на английский',
        'wpma_translation_metabox_callback',
        'post',
        'normal',
        'high'
    );
}
add_action('add_meta_boxes', 'wpma_add_translation_metabox');

function wpma_translation_metabox_callback($post) {
    $title_en = get_post_meta($post->ID, 'wpma_post_title_en', true);
    $content_en = get_post_meta($post->ID, 'wpma_post_content_en', true);
    wp_nonce_field('wpma_save_translation', 'wpma_translation_nonce');
    ?>
    <p><label>Заголовок (EN):</label><br>
    <input type="text" name="wpma_post_title_en" value="<?php echo esc_attr($title_en); ?>" style="width:100%;"></p>
    <p><label>Содержимое (EN):</label><br>
    <textarea name="wpma_post_content_en" rows="10" style="width:100%;"><?php echo esc_textarea($content_en); ?></textarea></p>
    <?php
}

function wpma_save_translation($post_id) {
    if (!isset($_POST['wpma_translation_nonce']) || !wp_verify_nonce($_POST['wpma_translation_nonce'], 'wpma_save_translation')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (isset($_POST['wpma_post_title_en'])) {
        update_post_meta($post_id, 'wpma_post_title_en', sanitize_text_field($_POST['wpma_post_title_en']));
    }
    if (isset($_POST['wpma_post_content_en'])) {
        update_post_meta($post_id, 'wpma_post_content_en', wp_kses_post($_POST['wpma_post_content_en']));
    }
}
add_action('save_post', 'wpma_save_translation');

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

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

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

Пример функции, которая формирует URL на текущей странице для другого языка:

function wpma_get_language_url($lang) {
    $current_url = home_url(add_query_arg(array(), $_SERVER['REQUEST_URI']));
    $parsed = parse_url($current_url);
    $path = $parsed['path'];
    $langs = array('ru', 'en');

    foreach ($langs as $l) {
        $path = preg_replace('#^/' . $l . '/#', '/', $path);
    }

    $path = '/' . $lang . rtrim($path, '/') . '/';

    $url = $parsed['scheme'] . '://' . $parsed['host'] . $path;
    if (!empty($parsed['query'])) {
        $url .= '?' . $parsed['query'];
    }
    return $url;
}

// Вывод переключателя
echo '<a href="' . esc_url(wpma_get_language_url('ru')) . '">Русский</a> | ';
echo '<a href="' . esc_url(wpma_get_language_url('en')) . '">English</a>';

Этот код очищает URL от старого языкового префикса и добавляет нужный.

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

Чтобы поисковики правильно индексировали страницы на разных языках, важно:

  • Использовать разные URL для языков (у нас это /ru/ и /en/);
  • Добавлять в <head> теги hreflang для указания альтернативных версий;
  • Настроить sitemap с разделением по языкам;
  • Использовать правильные заголовки и метаописания для каждого языка.

Пример добавления hreflang в header.php:

function wpma_add_hreflang() {
    $langs = array('ru', 'en');
    $current_lang = wpma_detect_language();
    $url_ru = wpma_get_language_url('ru');
    $url_en = wpma_get_language_url('en');
    echo '<link rel="alternate" hreflang="ru" href="' . esc_url($url_ru) . '" />\n';
    echo '<link rel="alternate" hreflang="en" href="' . esc_url($url_en) . '" />\n';
}
add_action('wp_head', 'wpma_add_hreflang');

Обработка языковых файлов и перевод интерфейса

Чтобы перевести интерфейс темы и стандартных строк WordPress, используйте стандартную систему локализации — файлы PO/MO. Для этого нужно:

  • Создать папку languages в теме;
  • Сгенерировать файлы перевода для нужных языков;
  • Загрузить их через функцию load_theme_textdomain();
  • Выбирать язык для WordPress через switch_to_locale() в зависимости от параметра lang.

Пример, как подключить локализацию:

function wpma_load_textdomain() {
    $lang = wpma_detect_language();
    $locale = $lang === 'ru' ? 'ru_RU' : 'en_US';
    load_theme_textdomain('wpma', get_template_directory() . '/languages');
    switch_to_locale($locale);
}
add_action('after_setup_theme', 'wpma_load_textdomain');

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

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

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

Для удобства управления переводами вы можете дополнительно использовать плагин Clearfy Pro, который помогает оптимизировать работу и управлять метаданными.

Как создать владельческий shortcode в WordPress с примерами кода
26.03.2026
Как избежать проблем с бесконечным переадресом в WordPress
19.02.2026
WooCommerce: как решить проблему с повторной оплатой одного заказа
30.04.2026
Оптимизация WordPress для мобильных устройств: практические советы и примеры
30.11.2025
Как разрешить пользователям загружать файлы в WordPress по расширениям
14.02.2026