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

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

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

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

При самостоятельной реализации вы получаете:

  • Полный контроль над структурой и логикой перевода.
  • Минимум сторонних зависимостей.
  • Возможность оптимизировать SEO под каждый язык.

Но и тут есть свои сложности — потребуется больше времени на разработку и поддержку.

Основные подходы к реализации многоязычности без плагинов

1. Использование поддоменов или папок для разных языков

Первый шаг — определить структуру URL. Самые распространённые варианты:

  • Поддомены — ru.wpnews.ru, en.wpnews.ru и т.д.
  • Папки — wpnews.ru/ru/, wpnews.ru/en/.

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

Это позволит легко различать языки и настроить переадресацию.

2. Организация переводов контента вручную

Вместо плагинов можно создать отдельные страницы или записи для каждого языка и связать их через пользовательские поля или метаданные.

Например, у записи на русском будет ID 101, а у её английского варианта — 102. В мета-записи с названием wpnews_translation_group можно хранить общий идентификатор группы переводов.

Пример функции для получения ID перевода на другой язык:

function wpnews_get_translation_id($post_id, $lang_code) {  $group_id = get_post_meta($post_id, 'wpnews_translation_group', true);  if (!$group_id) return false;  $args = [    'post_type' => 'post',    'meta_query' => [      ['key' => 'wpnews_translation_group', 'value' => $group_id],      ['key' => 'wpnews_language', 'value' => $lang_code]    ]  ];  $query = new WP_Query($args);  if ($query->have_posts()) {    return $query->posts[0]->ID;  }  return false;}

Здесь wpnews_translation_group — общий идентификатор, а wpnews_language — код языка (например, "ru", "en").

Настройка темы для вывода языковых версий

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

function wpnews_language_switcher() {  global $post;  $languages = ['ru' => 'Русский', 'en' => 'English'];  $current_lang = get_post_meta($post->ID, 'wpnews_language', true);  echo '<ul class="language-switcher">';  foreach ($languages as $code => $name) {    if ($code === $current_lang) {      echo '<li><strong>' . esc_html($name) . '</strong></li>';    } else {      $translated_id = wpnews_get_translation_id($post->ID, $code);      if ($translated_id) {        echo '<li><a href="' . get_permalink($translated_id) . '">' . esc_html($name) . '</a></li>';      }    }  }  echo '</ul>';}
<

Вызовите wpnews_language_switcher() в нужном месте темы — например, в single.php.

Перевод интерфейса темы и плагинов

Важный аспект — локализация интерфейса сайта. Для этого используйте стандартные функции WordPress:

  • __() — для получения перевода строки.
  • _e() — вывод перевода строки.
  • load_theme_textdomain() — загрузка языковых файлов.

Создайте в папке темы каталог /languages/ и положите туда .mo и .po файлы с переводами.

Пример инициализации в functions.php:

function wpnews_load_textdomain() {  load_theme_textdomain('wpnews', get_template_directory() . '/languages');}add_action('after_setup_theme', 'wpnews_load_textdomain');

В самом коде темы используйте, например:

_e('Read more', 'wpnews');

Автоматизация перевода статичных текстов и адаптация

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

Однако для динамического контента лучше всё же создавать отдельные записи с правильной связью, как показано выше.

Пример добавления пользовательских полей через метабокс

Для удобства редактирования в админке добавим метабокс для указания языка и группы перевода:

function wpnews_add_language_metabox() {  add_meta_box('wpnews_language_box', 'Язык записи', 'wpnews_language_metabox_html', 'post', 'side');}add_action('add_meta_boxes', 'wpnews_add_language_metabox');function wpnews_language_metabox_html($post) {  $language = get_post_meta($post->ID, 'wpnews_language', true);  $group = get_post_meta($post->ID, 'wpnews_translation_group', true);  wp_nonce_field('wpnews_language_nonce', 'wpnews_language_nonce_field');  echo '<p><label>Язык:</label><br><select name="wpnews_language">';  $langs = ['ru' => 'Русский', 'en' => 'English'];  foreach ($langs as $code => $name) {    $selected = ($language === $code) ? 'selected' : '';    echo '<option value="' . esc_attr($code) . '" ' . $selected . '>' . esc_html($name) . '</option>';  }  echo '</select></p>';  echo '<p><label>Группа перевода (ID):</label><br><input type="text" name="wpnews_translation_group" value="' . esc_attr($group) . '" /></p>';}function wpnews_save_language_meta($post_id) {  if (!isset($_POST['wpnews_language_nonce_field']) || !wp_verify_nonce($_POST['wpnews_language_nonce_field'], 'wpnews_language_nonce')) return;  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;  if (isset($_POST['wpnews_language'])) {    update_post_meta($post_id, 'wpnews_language', sanitize_text_field($_POST['wpnews_language']));  }  if (isset($_POST['wpnews_translation_group'])) {    update_post_meta($post_id, 'wpnews_translation_group', sanitize_text_field($_POST['wpnews_translation_group']));  }}add_action('save_post', 'wpnews_save_language_meta');

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

Чтобы поисковики правильно индексировали разные языковые версии, важно:

  • Использовать атрибут hreflang в <head> каждого документа. Пример:
<link rel="alternate" hreflang="ru" href="https://wpnews.ru/ru/post-slug/" />  <link rel="alternate" hreflang="en" href="https://wpnews.ru/en/post-slug/" />
  • Настроить ЧПУ для папок с языками.
  • Добавить sitemap с указанием всех языков.

Это повысит видимость сайта в региональных поисковых системах и улучшит пользовательский опыт.

Заключение

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

Оптимизация базы данных WordPress: удаляем старые ревизии и чистим базу
15.11.2025
Как создать автоматическое резервное копирование WordPress с помощью плагинов и кода
02.12.2025
Как использовать REST API в WordPress для создания настраиваемых приложений
08.11.2025
Как избежать ошибки Allowed memory size в WordPress: практическое руководство
29.11.2025
Как создать поддержку многоязычности в WordPress без плагинов
18.11.2025