Вопрос создания мультиязычного сайта на WordPress часто решается с помощью плагинов, таких как WPML, Polylang или TranslatePress. Но иногда хочется обойтись без дополнительных плагинов, чтобы избежать нагрузки или конфликтов. В этой статье я расскажу, как реализовать базовую мультиязычность на WordPress с помощью собственного кода и стандартных возможностей CMS.
Почему стоит сделать мультиязычность без плагинов
Плагины для мультиязычности удобны, но они могут:
- замедлять сайт из-за большого количества запросов и ресурсов;
- создавать сложности при обновлениях и совместимости с другими плагинами;
- ограничивать гибкость при кастомных решениях.
Реализовав мультиязычность самостоятельно, вы получите полный контроль над логикой и сможете оптимизировать работу под свои задачи.
Основные подходы к реализации мультиязычности без плагинов
Существует несколько вариантов:
- Использование разных категорий или меток для языков и фильтрация контента;
- Создание отдельных страниц и записей для каждого языка с языковыми префиксами в URL;
- Хранение перевода в пользовательских полях и динамическая подгрузка нужного языка;
- Использование 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 для создания мультиязычных обзоров.
Итоги
Реализация мультиязычности без плагинов требует больше ручной работы, но дает гибкость и контроль. Вы можете адаптировать подход под свои задачи, расширять функциональность и интегрировать с другими компонентами сайта. Если потребуется, всегда можно добавить плагины для удобства и расширения возможностей.