Создание мультиязычного сайта — одна из частых задач при разработке на WordPress. Многие сразу выбирают готовые решения в виде плагинов, таких как WPML или Polylang, но иногда возникает необходимость обойтись без них, чтобы снизить нагрузку на сайт или реализовать уникальную логику. В этой статье мы подробно разберем, как создать мультиязычный сайт на WordPress без плагинов, используя собственные функции и шаблоны.
Почему стоит создавать мультиязычный сайт без плагинов
Плагины для мультиязычности, безусловно, удобны и мощны, но иногда они дают избыточный функционал или конфликтуют с другими расширениями. Кроме того, плагины увеличивают вес сайта и часто замедляют загрузку страниц. Если вам нужен легкий и гибкий подход, можно сделать мультиязычность вручную.
Основные преимущества ручного подхода:
- Полный контроль над структурой и логикой;
- Минимизация запросов и нагрузки;
- Отсутствие зависимости от сторонних разработчиков;
- Возможность кастомизировать под любые особенности проекта.
Основные способы реализации мультиязычности без плагинов
Существует несколько подходов, каждый из которых имеет свои особенности:
1. Отдельные страницы и записи для каждого языка
Самый простой способ — создавать отдельные версии страниц и записей для каждого языка, например, с префиксом в URL: example.com/en/, example.com/ru/. Для этого потребуется добавить пользовательское поле или таксономию, указывающую язык контента.
Далее можно настроить условия в шаблонах, чтобы выводить контент нужного языка в зависимости от URL.
2. Использование массива перевода в коде темы
Если объем контента небольшой, допустимо хранить переводы непосредственно в массивах PHP и выводить нужный текст в зависимости от выбранного языка.
Это удобно для статичных элементов: заголовков, меню, кнопок.
3. Вариант с поддоменами или поддиректориями
Использование поддоменов (en.example.com) или поддиректорий (example.com/en/) — популярный SEO-дружественный способ организации мультиязычности.
Для этого нужно настроить .htaccess или роутинг WordPress, чтобы корректно обрабатывать запросы и переключать языки.
Практическая реализация мультиязычности с пользовательским полем
Рассмотрим пример создания мультиязычного сайта с использованием пользовательского поля language для постов и страниц.
1. Добавление пользовательского поля языка
При создании или редактировании записи в админке добавьте метаполе language со значением, например, ru или en.
2. Функция для вывода текущего языка из URL
function wpaction_get_current_language() {
$uri = trim($_SERVER['REQUEST_URI'], '/');
$segments = explode('/', $uri);
$lang = $segments[0] ?? 'ru'; // По умолчанию русский
$allowed_langs = ['ru', 'en'];
return in_array($lang, $allowed_langs) ? $lang : 'ru';
}
3. Модификация основного запроса для вывода записей нужного языка
В файле functions.php добавьте фильтр, чтобы показывать записи с нужным языком:
function wpaction_filter_posts_by_language($query) {
if (is_admin() || !$query->is_main_query()) {
return;
}
$current_lang = wpaction_get_current_language();
$meta_query = [
[
'key' => 'language',
'value' => $current_lang,
'compare' => '=',
],
];
$query->set('meta_query', $meta_query);
}
add_action('pre_get_posts', 'wpaction_filter_posts_by_language');
4. Настройка постоянных ссылок для языка
Чтобы в URL был префикс языка, добавьте правило в файл .htaccess или используйте фильтр request, чтобы WordPress понимал URL с языковым префиксом.
Переключатель языка и сохранение языка в сессии
Для удобства пользователей сделаем простой переключатель языка и сохраним выбор в сессии.
Код переключателя языка
function wpaction_language_switcher() {
$current_lang = wpaction_get_current_language();
$langs = ['ru' => 'Русский', 'en' => 'English'];
echo '<ul class="language-switcher">';
foreach ($langs as $code => $name) {
$class = ($code === $current_lang) ? 'active' : '';
$url = '/' . $code . '/';
echo "<li class='$class'><a href='$url'>$name</a></li>";
}
echo '</ul>';
}
Выведите функцию wpaction_language_switcher() в нужном месте темы, например в шапке.
Сохранение выбранного языка в сессии
Чтобы запомнить язык, можно использовать сессию PHP:
function wpaction_start_session() {
if (!session_id()) {
session_start();
}
}
add_action('init', 'wpaction_start_session', 1);
function wpaction_save_language_session() {
if (isset($_GET['lang'])) {
$_SESSION['language'] = $_GET['lang'];
}
}
add_action('init', 'wpaction_save_language_session');
function wpaction_get_current_language() {
if (!session_id()) {
session_start();
}
if (isset($_SESSION['language'])) {
return $_SESSION['language'];
}
return 'ru';
}
Так пользователи будут видеть сайт на выбранном языке при переходе между страницами.
Перевод интерфейсных элементов с помощью массива
Часто нужно перевести не только контент, но и элементы темы: кнопки, меню, подсказки. Для этого создадим простой массив с переводами:
$wpaction_translations = [
'ru' => [
'read_more' => 'Читать далее',
'comments' => 'Комментарии',
],
'en' => [
'read_more' => 'Read more',
'comments' => 'Comments',
],
];
function wpaction_translate($key) {
global $wpaction_translations;
$lang = wpaction_get_current_language();
return $wpaction_translations[$lang][$key] ?? $key;
}
Используйте функцию wpaction_translate('read_more') в шаблонах для вывода перевода.
Заключение
Создание мультиязычного сайта на WordPress без плагинов требует немного больше времени и навыков, но дает полный контроль над процессом и позволяет избежать лишних зависимостей. Вы можете комбинировать методы, использовать пользовательские поля для хранения языка, модифицировать запросы, создавать переключатели и переводить интерфейс через массивы в PHP.
Для упрощения администрирования можно рассмотреть интеграцию с плагинами, такими как Clearfy Pro, которые оптимизируют работу админки и могут помочь с SEO для мультиязычных сайтов.