Мультиязычность — частая потребность для сайтов на WordPress, особенно если аудитория международная. Многие пользователи сразу устанавливают популярные плагины типа WPML или Polylang, но иногда хочется сделать все самостоятельно, без сторонних расширений, чтобы минимизировать нагрузку и повысить контроль. В этой статье мы подробно разберем, как реализовать базовую мультиязычность на WordPress с помощью пользовательских настроек и PHP, без плагинов.
Почему стоит сделать мультиязычность без плагинов
Плагины для мультиязычности удобны, но они:
- увеличивают нагрузку на сайт и базу данных;
- могут конфликтовать с другими плагинами и темами;
- часто избыточны для небольших проектов с парой языков;
- затрудняют тонкую настройку вывода и SEO.
Собственная реализация на PHP и WordPress API позволит контролировать все аспекты, оптимизировать под задачи и при этом получить легковесное решение.
Основные принципы реализации мультиязычности
В основе лежит:
- Хранение переводов в виде пользовательских настроек или мета-полей.
- Определение текущего языка — через URL (например, параметр ?lang=ru или в структуре URL), куки или пользовательскую настройку.
- Вывод контента в зависимости от выбранного языка.
Для примера мы реализуем переключение через GET-параметр и куки с сохранением выбора пользователя.
Создаем функцию выбора языка и сохранения в куки
Добавим в functions.php темы или в кастомный плагин следующий код:
function wpmarket_get_current_language() {
if ( isset($_GET['lang']) ) {
$lang = sanitize_text_field($_GET['lang']);
setcookie('wpmarket_lang', $lang, time() + 3600 * 24 * 30, COOKIEPATH, COOKIE_DOMAIN);
return $lang;
} elseif ( isset($_COOKIE['wpmarket_lang']) ) {
return sanitize_text_field($_COOKIE['wpmarket_lang']);
} else {
return 'ru'; // язык по умолчанию
}
}Эта функция проверяет GET-параметр, затем куки, и устанавливает язык по умолчанию — русский.
Добавляем вывод переключателя языков
Для удобства пользователей нужен простой переключатель. Вставим в header.php или в нужном месте темы:
function wpmarket_language_switcher() {
$current = wpmarket_get_current_language();
$langs = ['ru' => 'Русский', 'en' => 'English'];
echo '<div class="wpmarket-lang-switcher">';
foreach ($langs as $code => $name) {
$class = ($code === $current) ? 'active' : '';
$url = add_query_arg('lang', $code);
echo "<a href=\"$url\" class=\"$class\">$name</a> ";
}
echo '</div>';
}Добавьте вызов wpmarket_language_switcher(); в нужное место шаблона для отображения переключателя.
Хранение и вывод переводов для статического текста
Чаще всего нужно перевести отдельные фразы и заголовки темы. Для этого можно создать в functions.php массивы с переводами:
$wpmarket_translations = [
'ru' => [
'welcome' => 'Добро пожаловать на наш сайт',
'contact' => 'Контакты',
],
'en' => [
'welcome' => 'Welcome to our website',
'contact' => 'Contact us',
],
];
function wpmarket_translate($key) {
global $wpmarket_translations;
$lang = wpmarket_get_current_language();
if ( isset($wpmarket_translations[$lang][$key]) ) {
return $wpmarket_translations[$lang][$key];
}
return $key; // если перевод не найден
}В шаблонах выводите так:
<h1><?php echo wpmarket_translate('welcome'); ?></h1>Перевод записей и страниц WordPress
Для динамического контента (записи, страницы) можно использовать пользовательские поля (Custom Fields). Создадим для каждого языка отдельное поле, например, content_ru и content_en, и выведем их в шаблоне single.php:
function wpmarket_the_content_multilang() {
global $post;
$lang = wpmarket_get_current_language();
$field_name = 'content_' . $lang;
$custom_content = get_post_meta($post->ID, $field_name, true);
if ($custom_content) {
echo apply_filters('the_content', $custom_content);
} else {
the_content(); // fallback на основной контент
}
}<В шаблоне замените вызов the_content(); на wpmarket_the_content_multilang();. Для редактирования добавьте в админке нужные мета-поля.
Пример упрощенного кода для сохранения переводов в админке
Чтобы не вводить вручную мета-поля, можно добавить кастомный метабокс с двумя textarea для разных языков:
function wpmarket_add_custom_meta_box() {
add_meta_box('wpmarket_multilang', 'Контент на разных языках', 'wpmarket_meta_box_callback', 'post', 'normal', 'high');
}
add_action('add_meta_boxes', 'wpmarket_add_custom_meta_box');
function wpmarket_meta_box_callback($post) {
wp_nonce_field('wpmarket_save_meta_box', 'wpmarket_meta_box_nonce');
$content_ru = get_post_meta($post->ID, 'content_ru', true);
$content_en = get_post_meta($post->ID, 'content_en', true);
echo '<label for="content_ru">Контент на русском:</label>';
echo '<textarea id="content_ru" name="content_ru" rows="5" style="width:100%;">' . esc_textarea($content_ru) . '</textarea>';
echo '<label for="content_en">Content in English:</label>';
echo '<textarea id="content_en" name="content_en" rows="5" style="width:100%;">' . esc_textarea($content_en) . '</textarea>';
}
function wpmarket_save_meta_box_data($post_id) {
if (!isset($_POST['wpmarket_meta_box_nonce']) || !wp_verify_nonce($_POST['wpmarket_meta_box_nonce'], 'wpmarket_save_meta_box')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['content_ru'])) {
update_post_meta($post_id, 'content_ru', sanitize_textarea_field($_POST['content_ru']));
}
if (isset($_POST['content_en'])) {
update_post_meta($post_id, 'content_en', sanitize_textarea_field($_POST['content_en']));
}
}
add_action('save_post', 'wpmarket_save_meta_box_data');SEO и мультиязычность без плагинов
Для SEO важно:
- Использовать уникальные URL для языков, например, ?lang=ru и ?lang=en;
- Добавить в <head> теги canonical и hreflang вручную;
- Генерировать sitemap с учетом языков.
Добавим в header.php пример для hreflang:
<?php
$lang = wpmarket_get_current_language();
$current_url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$base_url = strtok($current_url, '?');
?>
<link rel="alternate" hreflang="ru" href="<?php echo esc_url(add_query_arg('lang', 'ru', $base_url)); ?>" />
<link rel="alternate" hreflang="en" href="<?php echo esc_url(add_query_arg('lang', 'en', $base_url)); ?>" />Использование плагинов WPShop для мультиязычности
Для расширения функционала мультиязычности можно подключить плагины из WPShop. Например, Clearfy Pro помогает оптимизировать сайт и может упростить управление кешированием языковых версий. Плагин Expert Review позволяет показывать отзывы на разных языках, если их правильно связать с мультиязычным контентом.
Итоги и рекомендации
Собственная реализация мультиязычности в WordPress без плагинов подходит для небольших проектов с ограниченным числом языков и контента. Она дает полный контроль и позволяет избежать избыточных зависимостей. Однако для крупных сайтов с большим объемом контента и сложным SEO лучше использовать специализированные решения.
Экспериментируйте с кодом, адаптируйте логику под свои задачи и помните о безопасности — всегда фильтруйте входящие данные и корректно выводите контент.