Многие владельцы сайтов на WordPress сталкиваются с необходимостью сделать сайт мультиязычным. Обычно для этого используют популярные плагины, но иногда хочется обойтись без них — например, чтобы не нагружать сайт лишним кодом или сохранить полный контроль над переводами и структурой. В этой статье мы подробно рассмотрим, как создать мультиязычный сайт на WordPress без использования плагинов, используя кастомные решения и минимальный код.
Почему стоит делать мультиязычный сайт без плагинов
Плагины для мультиязычности, такие как WPML, Polylang или TranslatePress, удобны, но имеют ряд минусов:
- Увеличивают нагрузку на сайт и базу данных;
- Могут конфликтовать с другими плагинами и темами;
- Ограничивают гибкость в реализации уникальных сценариев;
- Иногда создают сложности с SEO, если не настроены правильно.
Создавая мультиязычный сайт вручную, вы полностью контролируете, как обрабатываются языки, URL и контент. Это полезно для уникальных проектов и оптимизации производительности.
Основные подходы к мультиязычности без плагинов
Есть несколько вариантов реализации мультиязычности:
1. Отдельные подкаталоги для каждого языка
Например, example.com/ru/ и example.com/en/. В WordPress это можно реализовать через структуру постоянных ссылок и условные проверки в шаблонах.
2. Использование параметров URL
Например, example.com/?lang=ru. Удобно для быстрого старта, но менее SEO-дружелюбно.
3. Отдельные сайты в мультисайте WordPress
Если нужно полностью раздельное управление контентом для каждого языка.
В этой статье мы рассмотрим первый вариант — подкаталоги — как наиболее универсальный и SEO-оптимальный.
Настройка подкаталогов и маршрутизации
Для начала создадим структуру URL с подкаталогами для каждого языка. Чтобы WordPress понимал, что /ru/ и /en/ — это разные языки, нужно настроить маршрутизацию и фильтры.
В файле functions.php вашей темы добавим код для перехвата языкового параметра из URL:
function wpma_detect_language() {
$langs = array('ru', 'en'); // Список поддерживаемых языков
$request_uri = $_SERVER['REQUEST_URI'];
foreach ($langs as $lang) {
if (strpos($request_uri, '/' . $lang . '/') === 0) {
return $lang;
}
}
return 'ru'; // Язык по умолчанию
}
function wpma_filter_request($query) {
if (!isset($query->query_vars['lang'])) {
$query->query_vars['lang'] = wpma_detect_language();
}
}
add_action('parse_request', 'wpma_filter_request');
Здесь мы определяем язык по первому сегменту URL и сохраняем его в параметре запроса lang.
Вывод контента на нужном языке
Теперь нужно организовать хранение контента на нескольких языках и вывод в зависимости от параметра lang.
Использование пользовательских полей для переводов
Самый простой способ — хранить переводы в метаполях у каждой записи. Например, для записи есть стандартные поля post_title и post_content на русском, а для английского делаем метаполя wpma_title_en и wpma_content_en.
В шаблоне вывода статьи (например, single.php) используем функцию, которая покажет контент на нужном языке:
function wpma_get_translated_field($post_id, $field, $lang) {
if ($lang === 'ru') {
return get_post_field($field, $post_id);
}
$meta_key = 'wpma_' . $field . '_' . $lang;
$translated = get_post_meta($post_id, $meta_key, true);
if ($translated) {
return $translated;
}
return get_post_field($field, $post_id); // fallback
}
// В шаблоне вывода
$lang = get_query_var('lang') ?: 'ru';
$title = wpma_get_translated_field(get_the_ID(), 'post_title', $lang);
$content = wpma_get_translated_field(get_the_ID(), 'post_content', $lang);
?>
<h1><?php echo esc_html($title); ?></h1>
<div><?php echo wp_kses_post($content); ?></div>
<?php
Такой подход позволяет хранить переводы в рамках одной записи и управлять ими через кастомные поля.
Добавление метаполей в админке
Чтобы удобно добавлять переводы в админке, можно использовать метабоксы. Пример простого метабокса для английского перевода:
function wpma_add_translation_metabox() {
add_meta_box(
'wpma_translation',
'Перевод на английский',
'wpma_translation_metabox_callback',
'post',
'normal',
'high'
);
}
add_action('add_meta_boxes', 'wpma_add_translation_metabox');
function wpma_translation_metabox_callback($post) {
$title_en = get_post_meta($post->ID, 'wpma_post_title_en', true);
$content_en = get_post_meta($post->ID, 'wpma_post_content_en', true);
wp_nonce_field('wpma_save_translation', 'wpma_translation_nonce');
?>
<p><label>Заголовок (EN):</label><br>
<input type="text" name="wpma_post_title_en" value="<?php echo esc_attr($title_en); ?>" style="width:100%;"></p>
<p><label>Содержимое (EN):</label><br>
<textarea name="wpma_post_content_en" rows="10" style="width:100%;"><?php echo esc_textarea($content_en); ?></textarea></p>
<?php
}
function wpma_save_translation($post_id) {
if (!isset($_POST['wpma_translation_nonce']) || !wp_verify_nonce($_POST['wpma_translation_nonce'], 'wpma_save_translation')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wpma_post_title_en'])) {
update_post_meta($post_id, 'wpma_post_title_en', sanitize_text_field($_POST['wpma_post_title_en']));
}
if (isset($_POST['wpma_post_content_en'])) {
update_post_meta($post_id, 'wpma_post_content_en', wp_kses_post($_POST['wpma_post_content_en']));
}
}
add_action('save_post', 'wpma_save_translation');
После добавления такого метабокса вы сможете вводить английские версии заголовка и содержимого прямо в редакторе поста.
Создание переключателя языков с правильными URL
Для удобства пользователей нужно сделать переключатель языков, который будет вести на ту же страницу, но с другим языковым префиксом.
Пример функции, которая формирует URL на текущей странице для другого языка:
function wpma_get_language_url($lang) {
$current_url = home_url(add_query_arg(array(), $_SERVER['REQUEST_URI']));
$parsed = parse_url($current_url);
$path = $parsed['path'];
$langs = array('ru', 'en');
foreach ($langs as $l) {
$path = preg_replace('#^/' . $l . '/#', '/', $path);
}
$path = '/' . $lang . rtrim($path, '/') . '/';
$url = $parsed['scheme'] . '://' . $parsed['host'] . $path;
if (!empty($parsed['query'])) {
$url .= '?' . $parsed['query'];
}
return $url;
}
// Вывод переключателя
echo '<a href="' . esc_url(wpma_get_language_url('ru')) . '">Русский</a> | ';
echo '<a href="' . esc_url(wpma_get_language_url('en')) . '">English</a>';
Этот код очищает URL от старого языкового префикса и добавляет нужный.
SEO и мультиязычность без плагинов
Чтобы поисковики правильно индексировали страницы на разных языках, важно:
- Использовать разные URL для языков (у нас это /ru/ и /en/);
- Добавлять в <head> теги
hreflangдля указания альтернативных версий; - Настроить sitemap с разделением по языкам;
- Использовать правильные заголовки и метаописания для каждого языка.
Пример добавления hreflang в header.php:
function wpma_add_hreflang() {
$langs = array('ru', 'en');
$current_lang = wpma_detect_language();
$url_ru = wpma_get_language_url('ru');
$url_en = wpma_get_language_url('en');
echo '<link rel="alternate" hreflang="ru" href="' . esc_url($url_ru) . '" />\n';
echo '<link rel="alternate" hreflang="en" href="' . esc_url($url_en) . '" />\n';
}
add_action('wp_head', 'wpma_add_hreflang');
Обработка языковых файлов и перевод интерфейса
Чтобы перевести интерфейс темы и стандартных строк WordPress, используйте стандартную систему локализации — файлы PO/MO. Для этого нужно:
- Создать папку
languagesв теме; - Сгенерировать файлы перевода для нужных языков;
- Загрузить их через функцию
load_theme_textdomain(); - Выбирать язык для WordPress через
switch_to_locale()в зависимости от параметраlang.
Пример, как подключить локализацию:
function wpma_load_textdomain() {
$lang = wpma_detect_language();
$locale = $lang === 'ru' ? 'ru_RU' : 'en_US';
load_theme_textdomain('wpma', get_template_directory() . '/languages');
switch_to_locale($locale);
}
add_action('after_setup_theme', 'wpma_load_textdomain');
Резюме и рекомендации
Создание мультиязычного сайта на WordPress без плагинов — это задача, требующая внимания к структуре URL, хранению переводов и маршрутизации. Такой подход подойдет для проектов с ограниченным числом языков и небольшим объемом контента.
Если у вас много контента и сложные требования, лучше использовать профессиональные плагины. Но если нужна максимальная производительность и контроль — описанный метод отлично подойдет.
Для удобства управления переводами вы можете дополнительно использовать плагин Clearfy Pro, который помогает оптимизировать работу и управлять метаданными.