Многоязычность на сайте — важный аспект для продвижения в разных регионах и улучшения пользовательского опыта. Большинство пользователей обращаются к таким решениям через популярные плагины, например, WPML или Polylang. Но иногда есть причины обойтись без плагинов: снизить нагрузку на сайт, повысить безопасность, получить полный контроль над процессом. В этой статье на примерах кода мы подробно разберем, как реализовать многоязычность в WordPress без плагинов.
Почему стоит реализовывать многоязычность без плагинов
Плагины для многоязычности нередко увеличивают вес сайта, замедляют его работу и создают сложности при обновлениях. Если у вас простой сайт или вы хотите избежать зависимости от сторонних решений, ручная реализация может быть лучшим вариантом.
Кроме того, ручное управление переводами позволяет гибко настраивать URL, SEO и структуру сайта под свои нужды.
Рассмотрим основные задачи, которые нужно решить при создании многоязычного сайта без плагинов:
- Определение текущего языка и переключение между языками
- Хранение и вывод переводов для страниц, записей и элементов интерфейса
- Правильная SEO-оптимизация для разных языков
Определение языка и переключение — как реализовать на WordPress
Самый простой и удобный способ — использовать параметр в URL либо поддомен. Для примера возьмем структуру URL вида site.ru/en/, site.ru/ru/.
Добавим в файл functions.php темы следующий код для определения языка:
function wpcompany_detect_language() {
$langs = ['en', 'ru']; // поддерживаемые языки
$uri = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
$lang = explode('/', $uri)[0];
if (in_array($lang, $langs)) {
return $lang;
}
return 'ru'; // язык по умолчанию
}Теперь для переключения языков можно создавать меню с ссылками, добавляя префикс языка. Например:
/en/about— английская версия страницы «О нас»/ru/about— русская версия
Для удобства добавьте в шаблоны переключатель языков:
function wpcompany_language_switcher() {
$current_lang = wpcompany_detect_language();
$langs = ['ru' => 'Русский', 'en' => 'English'];
echo '<ul class="lang-switcher">';
foreach ($langs as $code => $name) {
if ($code === $current_lang) {
echo '<li><strong>' . $name . '</strong></li>';
} else {
$uri = $_SERVER['REQUEST_URI'];
$new_uri = preg_replace('#^/(' . implode('|', array_keys($langs)) . ')#', '/' . $code, $uri);
echo '<li><a href="' . $new_uri . '">' . $name . '</a></li>';
}
}
echo '</ul>';
}Хранение переводов: варианты и лучшие практики
Для контента есть несколько подходов:
1. Использование отдельных страниц/постов для каждого языка
Создайте отдельные записи с языковым префиксом в slug, например about-en, about-ru. В шаблонах выводите нужную запись в зависимости от языка.
Для этого в шаблоне можно использовать WP_Query с учетом языка:
$lang = wpcompany_detect_language();
$args = [
'post_type' => 'page',
'name' => 'about-' . $lang,
];
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
the_content();
}
}
wp_reset_postdata();2. Использование пользовательских полей для переводов
Можно хранить переводы в meta-полях одной записи. Например, для поля с заголовком и контентом:
update_post_meta($post_id, 'wpcompany_title_en', 'About us');
update_post_meta($post_id, 'wpcompany_content_en', 'English content here');
// Аналогично для русского языкаВ шаблонах выводить содержимое так:
$lang = wpcompany_detect_language();
$title = get_post_meta(get_the_ID(), 'wpcompany_title_' . $lang, true);
$content = get_post_meta(get_the_ID(), 'wpcompany_content_' . $lang, true);
echo '<h1>' . esc_html($title) . '</h1>';
echo wp_kses_post($content);3. Использование массива с переводами в коде для интерфейсных элементов
Для строк интерфейса создайте массив с переводами в functions.php:
$wpcompany_translations = [
'en' => [
'read_more' => 'Read more',
'contact' => 'Contact us',
],
'ru' => [
'read_more' => 'Читать далее',
'contact' => 'Связаться с нами',
],
];
function wpcompany_translate($key) {
global $wpcompany_translations;
$lang = wpcompany_detect_language();
return $wpcompany_translations[$lang][$key] ?? $key;
}Использование в шаблонах:
echo wpcompany_translate('read_more');SEO и многоязычность: как избежать проблем
Для многоязычных сайтов важно корректно настроить SEO, чтобы поисковые системы правильно индексировали страницы и не считали их дубликатами.
Основные рекомендации:
- Добавьте
hreflangтеги в<head>каждой страницы. Например:
<link rel="alternate" hreflang="en" href="https://site.ru/en/about" />
<link rel="alternate" hreflang="ru" href="https://site.ru/ru/about" />- Используйте канонические URL с языковым префиксом.
- Настройте карту сайта с URL для каждого языка.
- Избегайте смешивания языков в одном контенте.
Чтобы автоматически добавлять hreflang, можно использовать хук wp_head:
function wpcompany_add_hreflang() {
$langs = ['ru' => 'https://site.ru/ru' . $_SERVER['REQUEST_URI'], 'en' => 'https://site.ru/en' . $_SERVER['REQUEST_URI']];
foreach ($langs as $lang => $url) {
echo '<link rel="alternate" hreflang="' . $lang . '" href="' . esc_url($url) . '" />\n';
}
}
add_action('wp_head', 'wpcompany_add_hreflang');Реализация поддержки форм и AJAX для многоязычности
Если на сайте есть формы (например, контакт или подписка), нужно обеспечить перевод сообщений и полей.
Для этого можно использовать массивы переводов (как описано выше) и выводить тексты в зависимости от языка.
Для AJAX-запросов добавьте передачу параметра языка в запрос и обработайте его в серверной части.
jQuery.ajax({
url: ajaxurl,
method: 'POST',
data: {
action: 'wpcompany_process_form',
lang: wpcompany_current_lang, // задайте эту переменную в js
form_data: formData
},
success: function(response) {
alert(response.message);
}
});
// В PHP
function wpcompany_process_form() {
$lang = $_POST['lang'] ?? 'ru';
if ($lang === 'en') {
$message = 'Thank you for your message!';
} else {
$message = 'Спасибо за ваше сообщение!';
}
wp_send_json_success(['message' => $message]);
}
add_action('wp_ajax_wpcompany_process_form', 'wpcompany_process_form');
add_action('wp_ajax_nopriv_wpcompany_process_form', 'wpcompany_process_form');Советы по интеграции с темами и плагинами
При самостоятельной реализации многоязычности важно учитывать совместимость с темой и плагинами. Например, если вы используете темы из WPShop, убедитесь, что шаблоны корректно выводят контент в зависимости от языка.
Также некоторые плагины для SEO и кэширования могут требовать настройки для многоязычности — например, исключение параметров языка из кэша.
При использовании плагинов для форм, таких как My Popup, настройте тексты через свои массивы переводов или шаблоны для каждого языка.
Заключение
Добавление многоязычности без плагинов — задача, требующая понимания структуры сайта и работы WordPress. Но при правильном подходе вы получите легкий, быстрый и гибкий сайт с поддержкой нескольких языков. Используйте показанные примеры кода для определения языка, вывода контента и SEO-оптимизации, и адаптируйте их под свои нужды.