WPExperts

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

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

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

Плагины для мультиязычности удобны, но они могут:

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

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

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

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

  1. Использование разных категорий или меток для языков и фильтрация контента;
  2. Создание отдельных страниц и записей для каждого языка с языковыми префиксами в URL;
  3. Хранение перевода в пользовательских полях и динамическая подгрузка нужного языка;
  4. Использование cookie или сессий для запоминания выбранного языка.

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

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

Для начала нам нужно, чтобы URL выглядели так:

  • https://example.com/en/post-name/ — английская версия;
  • https://example.com/ru/post-name/ — русская версия;
  • https://example.com/ua/post-name/ — украинская версия.

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

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

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

Этот код добавляет новые правила для распознавания языка из URL и добавляет параметр lang в запрос.

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

Создаем связь между переводами постов

Для мультиязычности нам нужно каким-то образом связать записи разных языков. Предлагаю использовать пользовательское поле wpexperts_translation_group с одинаковым значением для всех переводов одной записи.

Пример:

  • Пост на русском с wpexperts_translation_group = 123
  • Пост на английском с wpexperts_translation_group = 123

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

function wpexperts_get_translation_post_id($post_id, $lang) {
    $group = get_post_meta($post_id, 'wpexperts_translation_group', true);
    if(!$group) return 0;

    $args = [
        'post_type' => 'post',
        'meta_key' => 'wpexperts_translation_group',
        'meta_value' => $group,
        'posts_per_page' => 1,
        'post_status' => 'publish',
        'meta_query' => [
            [
                'key' => 'wpexperts_language',
                'value' => $lang,
                'compare' => '=',
            ]
        ]
    ];

    $query = new WP_Query($args);
    if($query->have_posts()) {
        return $query->posts[0]->ID;
    }
    return 0;
}

Здесь предполагается, что у каждой записи есть метаполе wpexperts_language, где хранится код языка (en, ru, ua).

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

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

function wpexperts_language_switcher() {
    global $post;
    if(!$post) return;

    $current_lang = get_query_var('lang') ?: 'ru'; // по умолчанию русский
    $langs = ['ru' => 'Русский', 'en' => 'English', 'ua' => 'Українська'];

    echo '<div class="wpexperts-language-switcher">';
    foreach($langs as $code => $name) {
        if($code === $current_lang) {
            echo '<span>' . $name . '</span>';
        } else {
            $translated_id = wpexperts_get_translation_post_id($post->ID, $code);
            if($translated_id) {
                $url = get_permalink($translated_id);
                echo '<a href="' . esc_url($url) . '">' . $name . '</a>';
            } else {
                echo '<span class="disabled">' . $name . '</span>';
            }
        }
    }
    echo '</div>';
}

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

Обработка языка при загрузке шаблонов

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

function wpexperts_filter_posts_by_language($query) {
    if(is_admin() || !$query->is_main_query()) return;

    $lang = get_query_var('lang');
    if(!$lang) return;

    $meta_query = $query->get('meta_query');
    if(!$meta_query) $meta_query = [];

    $meta_query[] = [
        'key' => 'wpexperts_language',
        'value' => $lang,
        'compare' => '='
    ];

    $query->set('meta_query', $meta_query);
}
add_action('pre_get_posts', 'wpexperts_filter_posts_by_language');

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

Пример добавления метаполей для записи

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

function wpexperts_add_language_meta_box() {
    add_meta_box('wpexperts_language_box', 'Язык записи', 'wpexperts_language_meta_box_callback', 'post', 'side');
}
add_action('add_meta_boxes', 'wpexperts_add_language_meta_box');

function wpexperts_language_meta_box_callback($post) {
    $value = get_post_meta($post->ID, 'wpexperts_language', true);
    $group = get_post_meta($post->ID, 'wpexperts_translation_group', true);
    ?>
    <p>
        <label for="wpexperts_language_field">Язык:</label><br/>
        <select name="wpexperts_language_field" id="wpexperts_language_field">
            <option value="ru" <?php selected($value, 'ru'); ?>>Русский</option>
            <option value="en" <?php selected($value, 'en'); ?>>English</option>
            <option value="ua" <?php selected($value, 'ua'); ?>>Українська</option>
        </select>
    </p>
    <p>
        <label for="wpexperts_translation_group_field">Группа перевода (ID):</label><br/>
        <input type="text" name="wpexperts_translation_group_field" id="wpexperts_translation_group_field" value="<?php echo esc_attr($group); ?>" />
    </p>
    <?php
}

function wpexperts_save_language_meta_box_data($post_id) {
    if(array_key_exists('wpexperts_language_field', $_POST)) {
        update_post_meta($post_id, 'wpexperts_language', sanitize_text_field($_POST['wpexperts_language_field']));
    }
    if(array_key_exists('wpexperts_translation_group_field', $_POST)) {
        update_post_meta($post_id, 'wpexperts_translation_group', sanitize_text_field($_POST['wpexperts_translation_group_field']));
    }
}
add_action('save_post', 'wpexperts_save_language_meta_box_data');

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

Использование готовых плагинов для расширения

Если вы хотите облегчить работу с мультиязычностью и получить дополнительные функции (автоматический перевод, SEO оптимизацию, удобный интерфейс), рекомендую обратить внимание на плагины из магазина WPSHOP.ru, например, WPGPT для автоматического перевода с ИИ или Expert Review для создания мультиязычных обзоров.

Итоги

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

×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »