Многоязычность — важный аспект современного сайта, особенно если вы хотите охватить аудиторию из разных стран. Большинство решений для WordPress основаны на плагинах, таких как WPML или Polylang. Но что делать, если вы хотите избежать плагинов и реализовать многоязычность самостоятельно? В этой статье я подробно расскажу, как добавить поддержку нескольких языков в WordPress без плагинов, используя собственные шаблоны, функции и настройки.
Почему стоит добавлять многоязычность без плагинов?
Плагины для многоязычности зачастую нагружают сайт, замедляют загрузку и могут конфликтовать с другими расширениями. Самостоятельная реализация позволит лучше контролировать структуру, оптимизировать производительность и избежать лишних зависимостей. Кроме того, вы сможете адаптировать код под конкретные задачи и требования проекта.
К тому же, основной функционал многоязычности — это отображение контента на разных языках и переключение между ними. Если грамотно организовать структуру и логику, можно обойтись без сложных плагинов.
Основные подходы к реализации многоязычности
Существует несколько вариантов реализации:
- Поддомены или папки для языков — например, site.com/en/, site.com/ru/
- Параметры URL — site.com?lang=en
- Использование пользовательских типов записей или таксономий для хранения переводов
Для удобства и SEO лучшим вариантом будет использование папок с языковыми кодами.
Настройка структуры URL для языков
В файле .htaccess или в настройках сервера настроим перенаправления так, чтобы URL с языковым префиксом обрабатывались через WordPress. Например, все запросы вида /ru/ или /en/ попадали на один index.php.
Создаем функцию для определения текущего языка
Добавим в functions.php тему или в свой плагин следующий код для определения языка по URL:
function wpelement_get_current_language() {
$uri = $_SERVER['REQUEST_URI'];
if (preg_match('#^/(ru|en|de)/#', $uri, $matches)) {
return $matches[1];
}
return 'ru'; // язык по умолчанию
}
Эта функция возвращает код языка из пути URL или устанавливает русский по умолчанию.
Вывод контента в зависимости от языка
Для каждого текста на сайте нужно предусмотреть массив с переводами или использовать отдельные поля. Пример простого массива с переводами в functions.php:
$wpelement_translations = [
'en' => [
'welcome' => 'Welcome to our website!',
'read_more' => 'Read more',
],
'ru' => [
'welcome' => 'Добро пожаловать на наш сайт!',
'read_more' => 'Читать далее',
],
];
function wpelement_translate($key) {
global $wpelement_translations;
$lang = wpelement_get_current_language();
if (isset($wpelement_translations[$lang][$key])) {
return $wpelement_translations[$lang][$key];
}
return $key; // если перевод не найден
}
Теперь в шаблонах можно выводить тексты так:
<h1><?php echo wpelement_translate('welcome'); ?></h1>
Организация контента для разных языков
Чтобы хранить переводы постов и страниц, можно использовать кастомное поле с указанием языка и связью с оригиналом. Пример создания мета-полей и запроса постов определенного языка:
function wpelement_filter_posts_by_language($query) {
if (!is_admin() && $query->is_main_query()) {
$lang = wpelement_get_current_language();
$meta_query = [
[
'key' => 'wpelement_post_lang',
'value' => $lang,
'compare' => '=',
],
];
$query->set('meta_query', $meta_query);
}
}
add_action('pre_get_posts', 'wpelement_filter_posts_by_language');
Для каждого поста при редактировании добавьте мета-поле wpelement_post_lang с языковым кодом. Это позволит выводить только нужные записи.
Пример добавления мета-бокса для языка
function wpelement_add_language_metabox() {
add_meta_box('wpelement_lang', 'Язык записи', 'wpelement_lang_metabox_html', 'post', 'side');
}
add_action('add_meta_boxes', 'wpelement_add_language_metabox');
function wpelement_lang_metabox_html($post) {
$value = get_post_meta($post->ID, 'wpelement_post_lang', true);
$langs = ['ru' => 'Русский', 'en' => 'Английский', 'de' => 'Немецкий'];
echo '<select name="wpelement_post_lang">';
foreach ($langs as $code => $label) {
$selected = ($code == $value) ? 'selected' : '';
echo "<option value=\"$code\" $selected>$label</option>";
}
echo '</select>';
}
function wpelement_save_language_meta($post_id) {
if (array_key_exists('wpelement_post_lang', $_POST)) {
update_post_meta($post_id, 'wpelement_post_lang', sanitize_text_field($_POST['wpelement_post_lang']));
}
}
add_action('save_post', 'wpelement_save_language_meta');
Добавляем переключатель языка
Чтобы пользователи могли переключать язык, добавим в шаблон простой переключатель:
function wpelement_language_switcher() {
$langs = ['ru' => 'Русский', 'en' => 'English', 'de' => 'Deutsch'];
$current = wpelement_get_current_language();
$uri = $_SERVER['REQUEST_URI'];
echo '<ul class="wpelement-language-switcher">';
foreach ($langs as $code => $label) {
$new_uri = preg_replace('#^/(ru|en|de)/#', '/' . $code . '/', $uri);
if ($current == $code) {
echo "<li><strong>$label</strong></li>";
} else {
echo "<li><a href=\"$new_uri\">$label</a></li>";
}
}
echo '</ul>';
}
Выведите эту функцию в нужном месте шаблона (например, в header.php), чтобы пользователи могли переключать языки.
SEO для многоязычного сайта
Очень важно правильно настроить SEO для многоязычности:
- Используйте
hreflangв<head>для указания альтернативных версий страниц. - Создавайте уникальные URL для каждого языка (как мы сделали с папками).
- Добавьте в sitemap.xml все языковые версии.
Пример добавления hreflang в header.php:
function wpelement_add_hreflang() {
$langs = ['ru', 'en', 'de'];
$current_uri = $_SERVER['REQUEST_URI'];
foreach ($langs as $lang) {
$href = preg_replace('#^/(ru|en|de)/#', '/' . $lang . '/', $current_uri);
echo "<link rel=\"alternate\" hreflang=\"$lang\" href=\"" . home_url($href) . "\" />\n";
}
}
add_action('wp_head', 'wpelement_add_hreflang');
Использование плагинов WPGPT и Clearfy Pro для поддержки и оптимизации
Если вы хотите расширить функционал и оптимизировать работу многоязычного сайта, рассмотрите использование плагинов из WPGPT для генерации переводов с помощью ИИ, а также Clearfy Pro для оптимизации производительности и SEO, особенно если ваш сайт быстро растет и требует автоматизации.
Выводы и рекомендации
Реализация многоязычности без плагинов требует понимания структуры WordPress и умения работать с URL, мета-полями и шаблонами. Приведенные примеры кода и рекомендации помогут создать легковесное и гибкое решение для многоязычного сайта. При необходимости можно дополнить функционал специализированными плагинами из WPShop, чтобы автоматизировать переводы и улучшить SEO.