wplang.ru wordpress WP Lang

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

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

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

WordPress изначально поддерживает локализацию интерфейса через функцию get_locale(), однако для контента, особенно кастомного (Custom Post Types, ACF-поля и т.п.) лучше явно хранить и использовать поле locale. Это позволяет:

  • Чётко разделять данные по языкам и регионам;
  • Упрощать выборку контента для пользователей;
  • Избегать конфликтов при кэшировании и индексировании;
  • Гибко интегрироваться с плагинами мультиязычности.

Например, если у вас сайт с локалями ru_RU и en_US, можно хранить записи с метаполем locale и при выводе показывать только нужные.

Как добавить поле locale к постам и использовать его для фильтрации

Для начала создадим метаполе locale, в котором будем хранить код локали для каждой записи. Это можно сделать вручную, через админку, или с помощью плагина Advanced Custom Fields (ACF).

Добавление поля locale через ACF

1. Установите и активируйте плагин ACF.

2. Создайте новое поле типа "Текст" или "Выбор" с названием locale.

3. Привяжите это поле к нужным типам записей.

4. При создании записи указывайте соответствующий код локали, например ru_RU или en_US.

Фильтрация записей по locale в WP_Query

Далее нужно выводить записи только с нужным языком. Вот пример функции, которая формирует запрос с условием по метаполю locale:

function wplang_ru_get_posts_by_locale($locale = 'ru_RU') {
    $args = [
        'post_type' => 'post',
        'meta_query' => [
            [
                'key' => 'locale',
                'value' => $locale,
                'compare' => '='
            ]
        ]
    ];
    return new WP_Query($args);
}

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

$locale = get_locale();
$query = wplang_ru_get_posts_by_locale($locale);
if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        the_title('<h2>', '</h2>');
        the_content();
    }
    wp_reset_postdata();
} else {
    echo '<p>Контент на этом языке отсутствует.</p>';
}

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

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

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

Кэширование запросов по locale

При большом объёме контента рекомендуется кэшировать результаты запросов по локали, чтобы уменьшить нагрузку на сервер. Для этого можно использовать Transients API:

function wplang_ru_get_cached_posts_by_locale($locale = 'ru_RU') {
    $cache_key = 'wplang_posts_' . $locale;
    $posts = get_transient($cache_key);
    if ($posts === false) {
        $query = wplang_ru_get_posts_by_locale($locale);
        $posts = $query->posts;
        set_transient($cache_key, $posts, HOUR_IN_SECONDS);
    }
    return $posts;
}

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

Реализация переключателя локалей с использованием поля locale

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

function wplang_ru_locale_switcher() {
    $locales = [
        'ru_RU' => 'Русский',
        'en_US' => 'English'
    ];
    echo '<ul class="locale-switcher">';
    foreach ($locales as $code => $name) {
        $url = add_query_arg('locale', $code);
        echo '<li><a href="' . esc_url($url) . '">' . esc_html($name) . '</a></li>';
    }
    echo '</ul>';
}

add_action('wp_footer', 'wplang_ru_locale_switcher');

Затем нужно при загрузке страницы проверять параметр locale в URL и менять локаль выборки:

function wplang_ru_set_locale_from_query() {
    if (!empty($_GET['locale'])) {
        $locale = sanitize_text_field($_GET['locale']);
        // Можно сохранить в сессии или куках
        setcookie('wplang_locale', $locale, time() + DAY_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN);
        $_COOKIE['wplang_locale'] = $locale;
    }
}
add_action('init', 'wplang_ru_set_locale_from_query');

function wplang_ru_get_current_locale() {
    if (!empty($_COOKIE['wplang_locale'])) {
        return sanitize_text_field($_COOKIE['wplang_locale']);
    }
    return get_locale();
}

Теперь можно использовать wplang_ru_get_current_locale() для выборки контента с нужным locale.

×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙