При создании многоязычного сайта на 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.