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

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

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

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

  • Увеличение нагрузки на сайт и количество запросов к базе данных.
  • Потенциальные конфликты с другими плагинами и темами.
  • Ограничения в кастомизации и интеграции.

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

Создание структуры для мультиязычности: типы записей и таксономии

Мы создадим отдельный тип записи wpdirect_language для хранения языков сайта, а также расширим существующие записи, добавив мета-поля для языка. Рассмотрим пример на базе стандартного типа записей post.

Регистрация таксономии для языка

Добавим таксономию wpdirect_language, чтобы привязывать записи к языкам:

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

Этот код добавит в админку метабокс для выбора языка записи. Можно добавить языки вручную через раздел «Записи» → «Язык».

Добавление языков в админке

Добавьте нужные языки, например, ru, en, de.

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

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

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

add_action('pre_get_posts', 'wpdirect_filter_posts_by_language');
function wpdirect_filter_posts_by_language($query) {
    if (is_admin() || !$query->is_main_query()) return;

    // Определяем язык, например, из параметра URL ?lang=ru
    $lang = isset($_GET['lang']) ? sanitize_text_field($_GET['lang']) : 'ru';

    // Добавляем таксономию для фильтрации
    $tax_query = [
        [
            'taxonomy' => 'wpdirect_language',
            'field' => 'slug',
            'terms' => $lang,
        ]
    ];

    $query->set('tax_query', $tax_query);
}

Теперь, если добавить в URL ?lang=en, будут показываться только записи на английском языке.

Создание языковых переключателей

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

function wpdirect_language_switcher() {
    $languages = get_terms([
        'taxonomy' => 'wpdirect_language',
        'hide_empty' => false,
    ]);

    if (!$languages || is_wp_error($languages)) return;

    echo '<ul class="wpdirect-language-switcher">';
    foreach ($languages as $lang) {
        $link = add_query_arg('lang', $lang->slug, home_url());
        echo '<li><a href="' . esc_url($link) . '">' . esc_html(strtoupper($lang->slug)) . '</a></li>';
    }
    echo '</ul>';
}

Вызовите wpdirect_language_switcher() в нужном месте темы, например, в header.php.

Перевод статических элементов и шаблонов

Статические фразы (заголовки, меню и т.д.) нужно адаптировать под текущий язык. Можно завести массив с переводами и выводить нужный текст в зависимости от параметра lang:

function wpdirect_get_translation($key) {
    $lang = isset($_GET['lang']) ? sanitize_text_field($_GET['lang']) : 'ru';
    $translations = [
        'title' => [
            'ru' => 'Привет, мир!',
            'en' => 'Hello, world!',
        ],
        // Добавьте другие строки
    ];

    return $translations[$key][$lang] ?? $translations[$key]['ru'];
}
<

Используйте в шаблонах:

<h1><?php echo wpdirect_get_translation('title'); ?></h1>

Поддержка мультиязычности в меню и виджетах

Для меню можно создать разные меню под каждый язык и выводить их условно в зависимости от lang. Аналогично с виджетами — можно использовать условные теги и фильтры WordPress.

Пример расширенного кода фильтрации для SEO URL

Чтобы сделать URL с языком более чистым, например, example.com/en/post-name, нужно добавить Rewrite Rules и обработать запросы:

add_action('init', 'wpdirect_add_rewrite_rules');
function wpdirect_add_rewrite_rules() {
    add_rewrite_rule('^([a-z]{2})/([^/]+)/?$', 'index.php?post_type=post&name=$matches[2]&wpdirect_lang=$matches[1]', 'top');
}

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

add_action('pre_get_posts', 'wpdirect_filter_posts_by_language_rewrite');
function wpdirect_filter_posts_by_language_rewrite($query) {
    if (is_admin() || !$query->is_main_query()) return;

    $lang = get_query_var('wpdirect_lang', 'ru');
    $tax_query = [
        [
            'taxonomy' => 'wpdirect_language',
            'field' => 'slug',
            'terms' => $lang,
        ]
    ];
    $query->set('tax_query', $tax_query);
}

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

Как работать с переводами метаполей и кастомных типов записей

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

Пример вывода кастомного поля с учётом языка:

function wpdirect_get_custom_field($post_id, $field_base) {
    $lang = isset($_GET['lang']) ? sanitize_text_field($_GET['lang']) : 'ru';
    $field_name = $field_base . '_' . $lang;
    return get_post_meta($post_id, $field_name, true);
}

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

Интеграция с плагином Clearfy Pro для оптимизации SEO мультиязычного сайта

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

Выводы и рекомендации

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

Для автоматизации перевода и расширенного SEO рекомендую интегрировать WPDirect-решение с Clearfy Pro.

Как использовать AJAX в WordPress без плагинов: практическое руководство
18.11.2025
WooCommerce: автоматическое изменение статуса заказа при отсутствии оплаты
22.06.2026
Решение проблемы с отключением WooCommerce после обновления или миграции
18.04.2026
Как создать динамическую форму обратной связи в WordPress
04.12.2025
Как избежать проблем с отключением плагинов в WordPress
05.03.2026