Многоязычный сайт — частая необходимость для бизнеса и блогов, нацеленных на международную аудиторию. Обычно для реализации многоязычности в WordPress используют плагины, такие как WPML или Polylang, но иногда хочется обойтись без дополнительных расширений, чтобы не нагружать сайт и сохранить полный контроль над кодом. В этой статье подробно рассмотрим, как самостоятельно создать многоязычный сайт на WordPress без плагинов, используя стандартные возможности CMS и минимальный кастомный код.
Почему создавать многоязычный сайт без плагинов
Плагины для мультиязычности очень удобны, но имеют ряд недостатков:
- Дополнительная нагрузка на сайт и базу данных.
- Сложность настройки и возможные конфликты с другими плагинами.
- Ограничения в кастомизации и зависимости от разработчика плагина.
Создавая мультиязычный сайт самостоятельно, вы получаете:
- Легковесность и полный контроль над логикой.
- Возможность адаптировать решение под свои особенности.
- Понимание устройства мультиязычности в WordPress на уровне кода.
Как реализовать мультиязычность в WordPress без плагинов
1. Структура URL и настройка постоянных ссылок
Первый шаг — определить, как будут выглядеть URL для разных языков. Обычно выбирают один из трех вариантов:
- Поддомены — ru.example.com, en.example.com
- Подкаталоги — example.com/ru/, example.com/en/
- Параметры GET — example.com/?lang=ru
Для простоты и SEO лучше использовать подкаталоги. Для этого нужно настроить правила перезаписи и добавить поддержку в теме.
2. Создание пользовательской функции для определения текущего языка
Добавьте в functions.php темы следующий код, который будет определять язык по URI:
function wordpresses_get_current_language() {
$uri = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
$parts = explode('/', $uri);
$lang = 'ru'; // язык по умолчанию
$available_languages = ['ru', 'en', 'de']; // список поддерживаемых языков
if (in_array($parts[0], $available_languages)) {
$lang = $parts[0];
}
return $lang;
}Эта функция анализирует первый сегмент пути и возвращает текущий язык. Если язык не найден, возвращается русский как основной.
3. Перехват запросов и фильтрация контента по языку
Для хранения переведенного контента можно использовать таксономии, метаполя или отдельные записи. Например, если у вас есть посты с переводами, можно использовать метаполе lang для указания языка записи.
Добавим фильтр запросов, который будет выводить записи только нужного языка:
function wordpresses_filter_posts_by_language($query) {
if (!is_admin() && $query->is_main_query()) {
$lang = wordpresses_get_current_language();
$meta_query = [
[
'key' => 'lang',
'value' => $lang,
'compare' => '='
]
];
$query->set('meta_query', $meta_query);
}
}
add_action('pre_get_posts', 'wordpresses_filter_posts_by_language');Теперь на страницах архива и блога будут выводиться посты только нужного языка.
4. Создание переключателя языков
Для удобства посетителей нужно добавить переключатель языков, который меняет URL подкаталога.
Пример простого переключателя в footer.php или виджете темы:
function wordpresses_language_switcher() {
$current_lang = wordpresses_get_current_language();
$available_languages = [
'ru' => 'Русский',
'en' => 'English',
'de' => 'Deutsch'
];
$uri = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
$parts = explode('/', $uri);
if (in_array($parts[0], array_keys($available_languages))) {
array_shift($parts);
}
$base_path = implode('/', $parts);
echo '<ul class="language-switcher">';
foreach ($available_languages as $code => $name) {
$link = '/' . $code . '/' . $base_path;
$active_class = ($code === $current_lang) ? 'class="active"' : '';
echo "<li $active_class><a href='$link'>$name</a></li>";
}
echo '</ul>';
}Выводите wordpresses_language_switcher() в нужном месте, чтобы показать меню выбора языка.
Дополнительные технические рекомендации
Обработка перевода контента
Для удобства редактирования можно использовать кастомные поля с префиксом языка, например, title_en, content_en, title_ru. Тогда при выводе контента в шаблонах обращайтесь к нужным полям в зависимости от текущего языка.
SEO и hreflang
Не забудьте добавить в header теги hreflang, чтобы поисковые системы понимали, что страницы дублируются для разных языков:
function wordpresses_add_hreflang() {
$langs = ['ru', 'en', 'de'];
$current_uri = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
$parts = explode('/', $current_uri);
if (in_array($parts[0], $langs)) {
array_shift($parts);
}
$base_path = implode('/', $parts);
foreach ($langs as $lang) {
$url = home_url("/$lang/$base_path");
echo "<link rel=\"alternate\" hreflang=\"$lang\" href=\"$url\" />\n";
}
}
add_action('wp_head', 'wordpresses_add_hreflang');Настройка .htaccess для корректной работы
Для правильной обработки подкаталогов с языками убедитесь, что в .htaccess включен модуль rewrite и прописаны стандартные правила WordPress. Если нужно запретить доступ к языковым подкаталогам, которых нет, добавьте дополнительные правила, но обычно достаточно стандартных.
Использование плагина Clearfy Pro для управления SEO мультиязычностью
Если в дальнейшем решите немного расширить функционал, обратите внимание на плагин Clearfy Pro. Он помогает оптимизировать SEO параметры и управлять индексированием страниц, что полезно для мультиязычных сайтов.
Например, с помощью Clearfy Pro можно гибко настроить создание карты сайта (sitemap) с поддержкой нескольких языков и задать правильные заголовки SEO для каждой версии страницы.
Вывод
Создание многоязычного сайта без плагинов — задача вполне выполнимая с помощью кастомных функций и базовых возможностей WordPress. Такой подход подходит для небольших проектов с ограниченным числом языков и позволяет избежать лишней нагрузки.
При необходимости расширения функционала можно интегрировать проверенные плагины, например, Clearfy Pro, но основа и понимание механизма останутся у вас в руках.