Многоязычность — важный аспект современных сайтов. Большинство владельцев WordPress используют готовые плагины, такие как WPML, Polylang или TranslatePress, но нередко возникает необходимость реализовать поддержку нескольких языков без сторонних расширений. Это может быть вызвано особенностями проекта, требованиями к производительности или желанием точного контроля над переводами.
Почему стоит реализовать многоязычность без плагинов WordPress
Плагины упрощают жизнь, но имеют свои недостатки. Во-первых, они могут замедлять сайт из-за лишних запросов и избыточного кода. Во-вторых, иногда сложная архитектура плагина мешает гибко настраивать логику перевода. В-третьих, владелец сайта может захотеть минимизировать зависимости от сторонних разработчиков.
Реализуя многоязычность собственными силами, вы получаете полный контроль над выводом контента, структурой URL, а также возможностью оптимизировать код под конкретные задачи. Это полезно для разработчиков, которые хотят лучше понять механизмы WordPress и расширить свои навыки.
Структура многоязычного сайта на WordPress без плагинов
Основная идея — создавать отдельные страницы, записи и шаблоны для каждого языка и управлять переключением через URL и меню. Рассмотрим ключевые моменты реализации.
1. Создание языковых папок и правил ЧПУ
Для каждого языка можно использовать префикс в URL, например site.ru/en/ или site.ru/ru/. Для этого в файле .htaccess или через настройки сервера нужно настроить перенаправления. В WordPress достаточно добавить обработку в функции темы.
Пример функции для определения языка из URL (добавьте в файл functions.php вашей темы):
function wpteam_get_current_language() {
$uri = trim($_SERVER['REQUEST_URI'], '/');
$parts = explode('/', $uri);
$langs = ['ru', 'en', 'de']; // список поддерживаемых языков
if (in_array($parts[0], $langs)) {
return $parts[0];
}
return 'ru'; // язык по умолчанию
}2. Структура страниц и записей
Создайте дублирующие страницы и записи для каждого языка. Для удобства используйте кастомное поле wpteam_lang для отметки языка. Это позволит фильтровать контент по языку.
Например, при выводе записей добавьте параметр фильтрации:
$lang = wpteam_get_current_language();
$args = [
'post_type' => 'post',
'meta_key' => 'wpteam_lang',
'meta_value' => $lang,
];
$query = new WP_Query($args);3. Переключатель языка
Добавьте переключатель языков в шапку сайта, который меняет префикс в URL. Пример простого переключателя:
function wpteam_language_switcher() {
$current_lang = wpteam_get_current_language();
$langs = ['ru' => 'Русский', 'en' => 'English', 'de' => 'Deutsch'];
$uri = trim($_SERVER['REQUEST_URI'], '/');
$uri_parts = explode('/', $uri);
if (in_array($uri_parts[0], array_keys($langs))) {
array_shift($uri_parts);
}
$base_uri = implode('/', $uri_parts);
echo '<ul class="wpteam-lang-switcher">';
foreach ($langs as $code => $name) {
$class = ($code === $current_lang) ? 'class="active"' : '';
$url = home_url("/" . $code . "/" . $base_uri);
echo "<li $class><a href='$url'>$name</a></li>";
}
echo '</ul>';
}Вызовите эту функцию в нужном месте шаблона, чтобы пользователи могли переключаться между языками.
Работа с переводами текста в шаблонах
Для статичных частей сайта, таких как заголовки, меню и подписи, используйте файл с переводами в формате PHP-массива:
$wpteam_translations = [
'ru' => [
'welcome' => 'Добро пожаловать',
'read_more' => 'Читать далее',
],
'en' => [
'welcome' => 'Welcome',
'read_more' => 'Read more',
],
];
function wpteam_translate($key) {
global $wpteam_translations;
$lang = wpteam_get_current_language();
if (isset($wpteam_translations[$lang][$key])) {
return $wpteam_translations[$lang][$key];
}
return $key;
}Используйте в шаблоне так:
<h1><?php echo wpteam_translate('welcome'); ?></h1>Дополнительные советы и рекомендации
Поддержка SEO для многоязычных сайтов
Для правильной индексации поисковиками важно использовать тег hreflang в <head>. Его можно генерировать динамически:
function wpteam_add_hreflang_tags() {
$langs = ['ru', 'en', 'de'];
$current_uri = $_SERVER['REQUEST_URI'];
$uri_parts = explode('/', trim($current_uri, '/'));
if (in_array($uri_parts[0], $langs)) {
array_shift($uri_parts);
}
$base_uri = implode('/', $uri_parts);
foreach ($langs as $lang) {
$url = home_url("/" . $lang . "/" . $base_uri);
echo "<link rel='alternate' hreflang='" . $lang . "' href='" . esc_url($url) . "' />";
}
}
add_action('wp_head', 'wpteam_add_hreflang_tags');Кэширование и производительность
Поскольку контент дублируется для каждого языка, кэширование страниц и запросов на сервере поможет избежать излишних нагрузок. Используйте встроенный объектный кэш WordPress или внешние решения, например Redis или Memcached.
Также рекомендуем минимизировать количество запросов на базе данных и использовать transients для временного хранения переведенных данных.
Преимущества и ограничения данного подхода
Реализация многоязычности без плагинов хорошо подходит для небольших проектов с ограниченным количеством языков и контента. Она дает полный контроль и легкость поддержки. Однако при масштабировании может потребоваться дополнительная автоматизация и более сложная архитектура.
Если планируется большой многоязычный сайт с сотнями страниц, стоит рассмотреть готовые решения, но для начинающих и разработчиков, желающих учиться, этот метод прекрасен.
Заключение
Реализация многоязычности в WordPress без плагинов требует понимания структуры CMS и работы с URL, метаданными и шаблонами. Представленные примеры кода помогут организовать базовую поддержку нескольких языков, сделать переключатель и управлять переводами. Такой подход дает гибкость и контроль, а также возможность оптимизировать сайт под конкретные нужды.