wpcompany.ru wordpress WPCompany

Как добавить многоязычность в WordPress без плагинов

Многоязычность на сайте — важный аспект для продвижения в разных регионах и улучшения пользовательского опыта. Большинство пользователей обращаются к таким решениям через популярные плагины, например, WPML или Polylang. Но иногда есть причины обойтись без плагинов: снизить нагрузку на сайт, повысить безопасность, получить полный контроль над процессом. В этой статье на примерах кода мы подробно разберем, как реализовать многоязычность в WordPress без плагинов.

Почему стоит реализовывать многоязычность без плагинов

Плагины для многоязычности нередко увеличивают вес сайта, замедляют его работу и создают сложности при обновлениях. Если у вас простой сайт или вы хотите избежать зависимости от сторонних решений, ручная реализация может быть лучшим вариантом.

Кроме того, ручное управление переводами позволяет гибко настраивать URL, SEO и структуру сайта под свои нужды.

Рассмотрим основные задачи, которые нужно решить при создании многоязычного сайта без плагинов:

  • Определение текущего языка и переключение между языками
  • Хранение и вывод переводов для страниц, записей и элементов интерфейса
  • Правильная SEO-оптимизация для разных языков

Определение языка и переключение — как реализовать на WordPress

Самый простой и удобный способ — использовать параметр в URL либо поддомен. Для примера возьмем структуру URL вида site.ru/en/, site.ru/ru/.

Добавим в файл functions.php темы следующий код для определения языка:

function wpcompany_detect_language() {
    $langs = ['en', 'ru']; // поддерживаемые языки
    $uri = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
    $lang = explode('/', $uri)[0];
    if (in_array($lang, $langs)) {
        return $lang;
    }
    return 'ru'; // язык по умолчанию
}

Теперь для переключения языков можно создавать меню с ссылками, добавляя префикс языка. Например:

  • /en/about — английская версия страницы «О нас»
  • /ru/about — русская версия

Для удобства добавьте в шаблоны переключатель языков:

function wpcompany_language_switcher() {
    $current_lang = wpcompany_detect_language();
    $langs = ['ru' => 'Русский', 'en' => 'English'];
    echo '<ul class="lang-switcher">';
    foreach ($langs as $code => $name) {
        if ($code === $current_lang) {
            echo '<li><strong>' . $name . '</strong></li>';
        } else {
            $uri = $_SERVER['REQUEST_URI'];
            $new_uri = preg_replace('#^/(' . implode('|', array_keys($langs)) . ')#', '/' . $code, $uri);
            echo '<li><a href="' . $new_uri . '">' . $name . '</a></li>';
        }
    }
    echo '</ul>';
}

Хранение переводов: варианты и лучшие практики

Для контента есть несколько подходов:

1. Использование отдельных страниц/постов для каждого языка

Создайте отдельные записи с языковым префиксом в slug, например about-en, about-ru. В шаблонах выводите нужную запись в зависимости от языка.

Для этого в шаблоне можно использовать WP_Query с учетом языка:

$lang = wpcompany_detect_language();
$args = [
    'post_type' => 'page',
    'name' => 'about-' . $lang,
];
$query = new WP_Query($args);
if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        the_content();
    }
}
wp_reset_postdata();

2. Использование пользовательских полей для переводов

Можно хранить переводы в meta-полях одной записи. Например, для поля с заголовком и контентом:

update_post_meta($post_id, 'wpcompany_title_en', 'About us');
update_post_meta($post_id, 'wpcompany_content_en', 'English content here');
// Аналогично для русского языка

В шаблонах выводить содержимое так:

$lang = wpcompany_detect_language();
$title = get_post_meta(get_the_ID(), 'wpcompany_title_' . $lang, true);
$content = get_post_meta(get_the_ID(), 'wpcompany_content_' . $lang, true);
echo '<h1>' . esc_html($title) . '</h1>';
echo wp_kses_post($content);

3. Использование массива с переводами в коде для интерфейсных элементов

Для строк интерфейса создайте массив с переводами в functions.php:

$wpcompany_translations = [
    'en' => [
        'read_more' => 'Read more',
        'contact' => 'Contact us',
    ],
    'ru' => [
        'read_more' => 'Читать далее',
        'contact' => 'Связаться с нами',
    ],
];

function wpcompany_translate($key) {
    global $wpcompany_translations;
    $lang = wpcompany_detect_language();
    return $wpcompany_translations[$lang][$key] ?? $key;
}

Использование в шаблонах:

echo wpcompany_translate('read_more');

SEO и многоязычность: как избежать проблем

Для многоязычных сайтов важно корректно настроить SEO, чтобы поисковые системы правильно индексировали страницы и не считали их дубликатами.

Основные рекомендации:

  • Добавьте hreflang теги в <head> каждой страницы. Например:
<link rel="alternate" hreflang="en" href="https://site.ru/en/about" />
<link rel="alternate" hreflang="ru" href="https://site.ru/ru/about" />
  • Используйте канонические URL с языковым префиксом.
  • Настройте карту сайта с URL для каждого языка.
  • Избегайте смешивания языков в одном контенте.

Чтобы автоматически добавлять hreflang, можно использовать хук wp_head:

function wpcompany_add_hreflang() {
    $langs = ['ru' => 'https://site.ru/ru' . $_SERVER['REQUEST_URI'], 'en' => 'https://site.ru/en' . $_SERVER['REQUEST_URI']];
    foreach ($langs as $lang => $url) {
        echo '<link rel="alternate" hreflang="' . $lang . '" href="' . esc_url($url) . '" />\n';
    }
}
add_action('wp_head', 'wpcompany_add_hreflang');

Реализация поддержки форм и AJAX для многоязычности

Если на сайте есть формы (например, контакт или подписка), нужно обеспечить перевод сообщений и полей.

Для этого можно использовать массивы переводов (как описано выше) и выводить тексты в зависимости от языка.

Для AJAX-запросов добавьте передачу параметра языка в запрос и обработайте его в серверной части.

jQuery.ajax({
    url: ajaxurl,
    method: 'POST',
    data: {
        action: 'wpcompany_process_form',
        lang: wpcompany_current_lang, // задайте эту переменную в js
        form_data: formData
    },
    success: function(response) {
        alert(response.message);
    }
});

// В PHP
function wpcompany_process_form() {
    $lang = $_POST['lang'] ?? 'ru';
    if ($lang === 'en') {
        $message = 'Thank you for your message!';
    } else {
        $message = 'Спасибо за ваше сообщение!';
    }
    wp_send_json_success(['message' => $message]);
}
add_action('wp_ajax_wpcompany_process_form', 'wpcompany_process_form');
add_action('wp_ajax_nopriv_wpcompany_process_form', 'wpcompany_process_form');

Советы по интеграции с темами и плагинами

При самостоятельной реализации многоязычности важно учитывать совместимость с темой и плагинами. Например, если вы используете темы из WPShop, убедитесь, что шаблоны корректно выводят контент в зависимости от языка.

Также некоторые плагины для SEO и кэширования могут требовать настройки для многоязычности — например, исключение параметров языка из кэша.

При использовании плагинов для форм, таких как My Popup, настройте тексты через свои массивы переводов или шаблоны для каждого языка.

Заключение

Добавление многоязычности без плагинов — задача, требующая понимания структуры сайта и работы WordPress. Но при правильном подходе вы получите легкий, быстрый и гибкий сайт с поддержкой нескольких языков. Используйте показанные примеры кода для определения языка, вывода контента и SEO-оптимизации, и адаптируйте их под свои нужды.

×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше