Владельцы сайтов на 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, но даёт полный контроль и позволяет сделать сайт максимально лёгким и оптимизированным. Приведённые примеры помогут организовать основной функционал, а дальнейшая доработка позволит расширять возможности в зависимости от конкретных задач.