В этой статье мы подробно рассмотрим, как добавить поддержку нескольких языков на сайт WordPress без использования тяжеловесных плагинов, таких как WPML или Polylang. Такой подход подойдет для разработчиков, которые хотят контролировать процесс перевода, оптимизировать скорость и избежать зависимости от сторонних решений.
Почему стоит сделать мультиязычность своими силами
Большинство популярных плагинов для мультиязычных сайтов значительно увеличивают нагрузку на сайт и могут влиять на SEO, если настроены неправильно. Кроме того, иногда их функционала бывает слишком много, и это усложняет поддержку. Создавая своё решение, вы получаете:
- Максимальный контроль над переводами и URL;
- Минимум лишнего кода и максимально легкий сайт;
- Возможность глубокой кастомизации под свои нужды и интеграцию с другими частями сайта;
- Простоту и прозрачность реализации.
Далее разберём, как реализовать базовую мультиязычность с переключателем языков, хранением переводов и настройкой URL.
Как организовать структуру для нескольких языков
Самый простой и SEO-дружественный способ — использовать поддиректории для каждого языка, например:
- site.ru/ — русский язык (основной);
- site.ru/en/ — английский;
- site.ru/de/ — немецкий и т.д.
Для этого нам нужно настроить правила перенаправления и добавить логику обработки языка в WordPress.
Определение текущего языка
Добавим в файл functions.php следующую функцию, которая определяет язык на основе первой части URL:
function wpdemo_get_current_lang() {
$langs = ['ru', 'en', 'de']; // список поддерживаемых языков
$uri = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
$parts = explode('/', $uri);
if (in_array($parts[0], $langs)) {
return $parts[0];
}
return 'ru'; // язык по умолчанию
}
Теперь в любом месте шаблона можно вызвать wpdemo_get_current_lang() и получить текущий язык.
Перенаправление с главной страницы
Если пользователь попадает на /, можно автоматически перенаправить его на язык по умолчанию:
function wpdemo_redirect_to_default_lang() {
if ($_SERVER['REQUEST_URI'] === '/') {
wp_redirect(home_url('/ru/'));
exit;
}
}
add_action('template_redirect', 'wpdemo_redirect_to_default_lang');
Хранение переводов контента
У нас есть несколько вариантов:
- Использовать отдельные записи для каждого языка и связать их между собой через метаполя;
- Хранить переводы в одном поле JSON;
- Использовать кастомные таблицы (сложнее, но гибче).
Рассмотрим первый вариант, как более универсальный.
Создаем связь между постами на разных языках
Добавим метаполе wpdemo_lang для языка и wpdemo_lang_group для идентификатора группы переводов.
function wpdemo_save_post_language_meta($post_id) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (!isset($_POST['wpdemo_lang']) || !isset($_POST['wpdemo_lang_group'])) return;
update_post_meta($post_id, 'wpdemo_lang', sanitize_text_field($_POST['wpdemo_lang']));
update_post_meta($post_id, 'wpdemo_lang_group', intval($_POST['wpdemo_lang_group']));
}
add_action('save_post', 'wpdemo_save_post_language_meta');
В админке можно добавить метабоксы для выбора языка и номера группы перевода.
Вывод поста на нужном языке
При запросе страницы, например /en/post-name/, нужно искать запись с соответствующей группой и языком:
function wpdemo_get_post_by_lang($original_post_id, $lang) {
$group_id = get_post_meta($original_post_id, 'wpdemo_lang_group', true);
if (!$group_id) return null;
$args = [
'post_type' => 'post',
'meta_query' => [
['key' => 'wpdemo_lang_group', 'value' => $group_id, 'compare' => '='],
['key' => 'wpdemo_lang', 'value' => $lang, 'compare' => '=']
]
];
$query = new WP_Query($args);
if ($query->have_posts()) {
return $query->posts[0];
}
return null;
}
Таким образом, можно переключаться между языками, подставляя нужный пост.
Создание переключателя языков
Добавим простой переключатель языков, который выводит ссылки на текущий пост на другом языке:
function wpdemo_language_switcher() {
global $post;
$current_lang = wpdemo_get_current_lang();
$group_id = get_post_meta($post->ID, 'wpdemo_lang_group', true);
if (!$group_id) return;
$langs = ['ru' => 'Русский', 'en' => 'English', 'de' => 'Deutsch'];
echo '<div class="wpdemo-lang-switcher">';
foreach ($langs as $code => $name) {
if ($code === $current_lang) {
echo '<span>' . $name . '</span> ';
continue;
}
$translated_post = wpdemo_get_post_by_lang($post->ID, $code);
if ($translated_post) {
$link = home_url('/' . $code . '/' . $translated_post->post_name . '/');
echo '<a href="' . esc_url($link) . '">' . esc_html($name) . '</a> ';
}
}
echo '</div>';
}
Выводим переключатель в шаблоне, например, в single.php:
<?php wpdemo_language_switcher(); ?>
Поддержка перевода строк интерфейса и шаблонов
Для перевода стандартных фраз в шаблоне можно использовать собственный простой массив с переводами и функцию для вывода:
function wpdemo_translate_string($string) {
$lang = wpdemo_get_current_lang();
$translations = [
'Hello' => ['ru' => 'Привет', 'en' => 'Hello', 'de' => 'Hallo'],
'Read more' => ['ru' => 'Читать далее', 'en' => 'Read more', 'de' => 'Weiterlesen'],
];
if (isset($translations[$string][$lang])) {
return $translations[$string][$lang];
}
return $string;
}
В шаблонах используем echo wpdemo_translate_string('Hello');.
Пример использования плагина для оптимизации мультиязычности
Если хотите дополнительно улучшить SEO и ускорить работу сайта, можно использовать плагин Clearfy Pro. Он поможет оптимизировать чистоту URL, кэширование и отключать лишние скрипты для каждого языка.
Итог
Мы рассмотрели, как реализовать мультиязычность своими силами в WordPress, минимально нагружая сайт и сохраняя контроль над всеми процессами. Такой подход подойдет для сайтов с ограниченным числом языков и желанием делать всё своими руками.
Можно дальше улучшать систему, добавляя поддержку перевода меню, виджетов и так далее, но базовый механизм уже будет работать стабильно и понятно.