Владельцам сайтов на WordPress часто нужна возможность создавать многоязычные версии страниц с разными URL для каждого языка. Многие сразу ищут готовые плагины, например, WPML или Polylang, однако иногда хочется обойтись без них, чтобы избежать лишней нагрузки или сохранить полный контроль над URL. В этой статье разберём, как реализовать многоязычные URL в WordPress без плагинов, используя только возможности темы и функций WordPress.
Почему стоит создавать многоязычные URL без плагинов
Плагины для мультиязычности удобны, но имеют свои недостатки:
- Увеличивают нагрузку на сайт и базу данных.
- Могут создавать конфликты с другими плагинами.
- Иногда ограничивают гибкость настройки URL.
Реализация мультиязычности вручную позволит легче интегрировать кастомные решения и оптимизировать производительность, а также лучше понять, как работает маршрутизация в WordPress.
Основные подходы к многоязычным URL без плагинов
Существует несколько методов реализации многоязычных URL:
- Использование поддоменов (ru.example.com, en.example.com).
- Использование подкаталогов (example.com/ru/, example.com/en/).
- Использование параметров запроса (?lang=ru, ?lang=en).
В этой статье остановимся на варианте с подкаталогами, так как он проще всего реализуется и удобен для SEO.
Настройка пермалинков для подкаталогов языков
Для начала нужно добавить в WordPress обработку префикса языка в URL. Для этого воспользуемся хуком rewrite_rules_array и добавим правила для каждого языка.
add_filter('rewrite_rules_array', 'wpsell_add_language_rewrite_rules');
function wpsell_add_language_rewrite_rules($rules) {
$langs = array('ru', 'en'); // список языков
$new_rules = array();
foreach ($langs as $lang) {
// Перенаправление запросов вида /ru/slug
$new_rules[$lang . '/(.+?)/?$'] = 'index.php?pagename=$matches[1]&lang=' . $lang;
$new_rules[$lang . '/?$'] = 'index.php?lang=' . $lang;
}
return $new_rules + $rules;
}
Это добавит правила, распознающие URL с префиксом языка и передающие параметр lang.
Обработка параметра языка в WordPress
Далее необходимо перехватывать параметр lang и переключать язык сайта. Для этого используем фильтр request:
add_filter('request', 'wpsell_parse_lang_parameter');
function wpsell_parse_lang_parameter($query_vars) {
if (isset($_GET['lang'])) {
$query_vars['lang'] = sanitize_text_field($_GET['lang']);
} elseif (isset($query_vars['lang'])) {
$query_vars['lang'] = sanitize_text_field($query_vars['lang']);
} else {
$query_vars['lang'] = 'ru'; // язык по умолчанию
}
return $query_vars;
}
Теперь в шаблонах и функциях можно использовать глобальный параметр языка для вывода контента на нужном языке.
Хранение и вывод контента на нескольких языках
Самая простая реализация — хранить в метаполях записи контент для каждого языка. Например, для записи можно добавить метаполя content_ru и content_en.
В шаблоне для вывода записи используем примерно такой код:
global $wp_query;
$lang = isset($wp_query->query_vars['lang']) ? $wp_query->query_vars['lang'] : 'ru';
$content = get_post_meta(get_the_ID(), 'content_' . $lang, true);
if (!$content) {
$content = get_the_content(); // fallback
}
echo apply_filters('the_content', $content);
Так мы выводим контент на нужном языке, если он задан.
Управление ссылками и навигацией
Очень важно, чтобы все ссылки сайта учитывали текущий язык и вели на корректный URL с языковым префиксом.
Для этого переопределим функцию генерации ссылок:
function wpsell_get_lang_url($url, $lang) {
$parsed = parse_url($url);
$path = isset($parsed['path']) ? $parsed['path'] : '';
$path = '/' . trim($lang, '/') . $path;
$new_url = $parsed['scheme'] . '://' . $parsed['host'] . $path;
if (isset($parsed['query'])) {
$new_url .= '?' . $parsed['query'];
}
return $new_url;
}
В навигационных меню, хлебных крошках и других местах используйте эту функцию для формирования ссылок с языковыми префиксами.
Пример простого переключателя языка
Добавим в шаблон переключатель языка, который будет менять URL текущей страницы, подставляя нужный префикс:
function wpsell_language_switcher() {
$langs = array('ru' => 'Русский', 'en' => 'English');
$current_url = home_url(add_query_arg(array(), $wp->request));
echo '<ul class="language-switcher">';
foreach ($langs as $code => $label) {
$url = preg_replace('#^/(ru|en)/#', '/' . $code . '/', $_SERVER['REQUEST_URI']);
if (!preg_match('#^/(ru|en)/#', $_SERVER['REQUEST_URI'])) {
$url = '/' . $code . $_SERVER['REQUEST_URI'];
}
echo '<li><a href="' . esc_url(home_url($url)) . '">' . esc_html($label) . '</a></li>';
}
echo '</ul>';
}
Выводите wpsell_language_switcher() в нужном месте темы, чтобы пользователи могли переключать языки.
Преимущества и ограничения ручного метода
Преимущества:
- Минимум зависимостей, лёгкость контроля.
- Полный контроль над URL и выводом.
- Возможность кастомизации под любые нужды.
Ограничения:
- Необходимость вручную создавать и поддерживать переводы.
- Отсутствие интеграции с автоматическими переводчиками.
- Требует знаний PHP и WordPress API.
Заключение
Создание многоязычных URL в WordPress без плагинов — вполне осуществимая задача, если вам нужна лёгкая и гибкая реализация с минимальными зависимостями. Используя перезапись правил, параметры запроса и метаполя в записях, вы можете полностью контролировать структуру URL и контент для каждого языка.
Если хотите более продвинутые решения с интеграцией и удобным интерфейсом, плагины остаются хорошим выбором. Но для небольших проектов или опытных разработчиков ручная настройка — отличный вариант.
Больше инструментов и плагинов для оптимизации и расширения функционала WordPress вы можете найти на wpshop.ru.