Добавление поддержки нескольких языков на сайт WordPress — частая задача, особенно если хочется обойтись без плагинов, чтобы сохранить производительность и контроль над кодом. В этой статье на wpmax.ru разберём, как реализовать многоязычность своими силами, используя возможности темы и PHP. Это полезно для разработчиков, которые хотят минимизировать зависимости и сделать кастомное решение.
Почему стоит сделать многоязычность без плагинов
Плагины вроде WPML, Polylang и TranslatePress очень удобны, но иногда они создают избыточную нагрузку и усложняют поддержку сайта. Без плагинов вы получите:
- Минимум стороннего кода — меньше уязвимостей и конфликтов.
- Полный контроль над логикой переключения языка и выводом контента.
- Возможность оптимизировать запросы и кэширование.
Минус — придётся писать и поддерживать код самостоятельно, но для опытных разработчиков это вполне выполнимая задача.
Как структурировать многоязычный контент в WordPress
Без плагина нужно самим решить, где хранить переводы. Есть несколько распространённых подходов:
- Создавать отдельные страницы/записи для каждого языка (например, slug на английском и русском).
- Использовать пользовательские поля (custom fields) для хранения перевода текста.
- Хранить переводы в PHP-массиве внутри темы или в отдельных файлах.
Рассмотрим самый простой и универсальный вариант — создавать отдельные записи для каждого языка и связывать их через мета-поля.
Создание структуры с мета-полями для языка и связью
Добавим к страницам или записям пользовательское поле wpmax_lang для указания языка и wpmax_translations с массивом ID связанных переводов.
function wpmax_set_language_meta() {
// Пример: при сохранении записи можно установить мета
if ( isset($_POST['post_ID']) && isset($_POST['wpmax_lang']) ) {
update_post_meta($_POST['post_ID'], 'wpmax_lang', sanitize_text_field($_POST['wpmax_lang']));
}
}
add_action('save_post', 'wpmax_set_language_meta');
Для удобства можно добавить мета-бокс в админку с выбором языка. Это позволит вручную устанавливать язык записи и связи с другими языками.
Определение текущего языка и переключение
Чтобы сайт понимал, на каком языке показывать страницу, реализуем простой механизм на базе URL, например, с префиксом /en/ или /ru/. В файле functions.php темы добавим функцию:
function wpmax_get_current_language() {
$uri = $_SERVER['REQUEST_URI'];
if (strpos($uri, '/en/') === 0) {
return 'en';
} elseif (strpos($uri, '/ru/') === 0) {
return 'ru';
}
return 'ru'; // Язык по умолчанию
}
Далее, перед выводом контента, нужно подгрузить запись нужного языка или сделать редирект на правильный URL.
Вывод перевода на странице
В шаблоне темы можно добавить логику, которая покажет перевод или ссылку на него. Например, в single.php:
$current_lang = wpmax_get_current_language();
$post_lang = get_post_meta(get_the_ID(), 'wpmax_lang', true);
if ($post_lang !== $current_lang) {
// Ищем перевод на текущий язык
$translations = get_post_meta(get_the_ID(), 'wpmax_translations', true); // Массив с ID
if (!empty($translations)) {
foreach ($translations as $post_id) {
$lang = get_post_meta($post_id, 'wpmax_lang', true);
if ($lang === $current_lang) {
wp_redirect(get_permalink($post_id));
exit;
}
}
}
}
// Если перевод не найден, показываем оригинал
Таким образом посетитель всегда попадёт на страницу нужного языка.
Как сделать переключатель языка
Переключатель — важная часть интерфейса. Его можно вывести в любом месте темы. Пример кода для вывода ссылок на переводы:
function wpmax_language_switcher() {
$current_id = get_the_ID();
$translations = get_post_meta($current_id, 'wpmax_translations', true);
$current_lang = wpmax_get_current_language();
$langs = ['ru' => 'Русский', 'en' => 'English'];
echo '<ul class="wpmax-lang-switcher">';
foreach ($langs as $code => $label) {
if ($code === $current_lang) {
echo "<li><strong>{$label}</strong></li>";
} else {
$link = get_permalink($current_id);
// Ищем перевод для языка
if (!empty($translations)) {
foreach ($translations as $post_id) {
$lang = get_post_meta($post_id, 'wpmax_lang', true);
if ($lang === $code) {
$link = get_permalink($post_id);
break;
}
}
}
echo "<li><a href=\"{$link}\">{$label}</a></li>";
}
}
echo '</ul>';
}
Вставьте wpmax_language_switcher() в шаблон, где хотите видеть языковое меню.
Советы по работе с многоязычностью и SEO
Для лучшего SEO:
- Используйте канонические URL и указывайте hreflang в
<head>. - Создавайте отдельные карты сайта для каждого языка.
- Обеспечьте перевод метаданных и заголовков страниц.
Пример вывода hreflang:
function wpmax_add_hreflang_tags() {
if (is_singular()) {
global $post;
$langs = ['ru', 'en'];
$urls = [];
$translations = get_post_meta($post->ID, 'wpmax_translations', true);
foreach ($langs as $lang) {
if ($lang === get_post_meta($post->ID, 'wpmax_lang', true)) {
$urls[$lang] = get_permalink($post->ID);
} else {
if (!empty($translations)) {
foreach ($translations as $post_id) {
if (get_post_meta($post_id, 'wpmax_lang', true) === $lang) {
$urls[$lang] = get_permalink($post_id);
}
}
}
}
}
foreach ($urls as $lang => $url) {
echo "<link rel=\"alternate\" hreflang=\"{$lang}\" href=\"{$url}\" />\n";
}
}
}
add_action('wp_head', 'wpmax_add_hreflang_tags');
Использование WPShop для перевода и оптимизации
Если хотите облегчить работу с многоязычностью, обратите внимание на продукты WPGPT и Clearfy Pro. Они помогут автоматизировать перевод и оптимизировать работу сайта без нагромождения плагинов.
Например, WPGPT можно использовать для генерации базового перевода контента, а Clearfy Pro оптимизирует скорость и безопасность сайта.