Многоязычность в WordPress — важный аспект для сайтов, которые ориентированы на международную аудиторию. Плагин Polylang — один из самых популярных инструментов для реализации многоязычности на сайте. Однако для профессиональной автоматизации и удобного управления языковыми версиями контента часто требуется добавить кастомные решения. В этой статье мы подробно разберём, как с помощью Polylang и собственных функций WPTO автоматизировать процесс поддержки многоязычности в WordPress.
Почему стоит автоматизировать поддержку многоязычности в WordPress
Ручное управление языковыми версиями страниц и записей занимает много времени и чревато ошибками: например, можно забыть перевести важный материал или допустить расхождения в структуре. Автоматизация помогает:
- Обеспечить единообразие и полноту перевода контента.
- Снизить нагрузку на редакторов и переводчиков.
- Автоматически синхронизировать таксономии, метаданные и пользовательские поля.
- Упростить добавление новых языков и управление ими.
Плагин Polylang предоставляет базовые инструменты, но для глубокой интеграции и кастомизации потребуются свои функции.
Основные возможности Polylang для многоязычности
Polylang позволяет создавать неограниченное количество языков, переводить посты, страницы, категории, теги и настраиваемые типы записей. Среди ключевых функций:
- Автоматическая синхронизация URL для разных языков.
- Возможность связать переводы между собой.
- Поддержка виджетов с языковыми переключателями.
- Интеграция с SEO-плагинами.
Однако Polylang не автоматизирует создание переводов и не всегда корректно обрабатывает кастомные поля и метаданные без доработок.
Автоматизация многоязычности с помощью функций WPTO
Для расширения функционала Polylang и автоматизации задач можно добавить собственные функции с префиксом wpto_. Рассмотрим несколько практических примеров.
Автоматическое дублирование кастомных полей при создании перевода
Часто при создании перевода необходимо, чтобы кастомные поля из оригинальной записи автоматически копировались в перевод. Это можно реализовать через хук pll_translate_post, который вызывается при связывании перевода с оригиналом:
function wpto_auto_duplicate_custom_fields($post_id, $original_post_id, $lang) {
$custom_fields = get_post_custom($original_post_id);
foreach ($custom_fields as $key => $values) {
if (strpos($key, '_') === 0) continue; // Пропускаем служебные поля
foreach ($values as $value) {
update_post_meta($post_id, $key, maybe_unserialize($value));
}
}
}
add_action('pll_translate_post', 'wpto_auto_duplicate_custom_fields', 10, 3);Этот код автоматически копирует все пользовательские метаданные, кроме служебных, при создании перевода, что значительно ускоряет работу с контентом.
Синхронизация категорий и таксономий между языками
Polylang умеет связывать термины таксономий, но иногда необходимо обеспечить автоматическую синхронизацию при создании новых категорий. Для этого можно использовать следующий пример:
function wpto_sync_category_translation($term_id, $taxonomy) {
if ($taxonomy !== 'category') return;
$languages = pll_get_the_languages();
foreach ($languages as $lang) {
if (!pll_get_term($term_id, $lang['slug'])) {
$term = get_term($term_id, $taxonomy);
$translated_term = wp_insert_term($term->name, $taxonomy, [ 'slug' => $term->slug . '-' . $lang['slug'] ]);
if (!is_wp_error($translated_term)) {
pll_set_term_language($translated_term['term_id'], $lang['slug']);
pll_save_term_translations([$term_id, $translated_term['term_id']]);
}
}
}
}
add_action('created_category', 'wpto_sync_category_translation', 10, 2);Этот код отслеживает создание новой категории и автоматически создаёт её переводы для всех языков сайта.
Автоматическое переключение языка в зависимости от геолокации пользователя
Для удобства посетителей можно реализовать автоматический выбор языка на основе IP-адреса. Пример базовой реализации:
function wpto_detect_language_by_ip() {
if (isset($_COOKIE['wpto_lang_detected'])) return; // Уже определено
$ip = $_SERVER['REMOTE_ADDR'];
// Здесь можно использовать сторонний API геолокации, например ip-api.com
$response = wp_remote_get('http://ip-api.com/json/' . $ip);
if (is_wp_error($response)) return;
$data = json_decode(wp_remote_retrieve_body($response), true);
if (!$data || !isset($data['countryCode'])) return;
$country_code = $data['countryCode'];
$lang_map = [
'RU' => 'ru',
'US' => 'en',
'FR' => 'fr',
// Добавьте нужные страны и языки
];
if (isset($lang_map[$country_code])) {
$lang = $lang_map[$country_code];
if (function_exists('pll_current_language')) {
$current_lang = pll_current_language();
if ($current_lang !== $lang) {
pll_set_current_language($lang);
setcookie('wpto_lang_detected', $lang, time() + 3600 * 24 * 30, '/');
wp_redirect(add_query_arg('lang', $lang, home_url()));
exit;
}
}
}
}
add_action('init', 'wpto_detect_language_by_ip');Важно: для реальных проектов используйте более надежные сервисы геолокации и учитывайте GDPR.
Практические рекомендации по работе с Polylang и WPTO
Для успешной автоматизации важно придерживаться нескольких правил:
- Регулярно проверяйте корректность связей между переводами через админку Polylang.
- Используйте префиксы функций WPTO для избежания конфликтов с другими плагинами.
- Тестируйте кастомные функции на тестовом сайте перед внедрением в продакшен.
- Если нужно — интегрируйте WPTO с плагинами SEO и кэширования для корректной работы многоязычности.
- При необходимости автоматизируйте создание языковых переключателей через виджеты или шорткоды.
Интеграция с плагином Clearfy Pro для оптимизации многоязычности
Плагин Clearfy Pro поможет оптимизировать работу сайта с Polylang, отключая ненужные функции и исправляя конфликты. Например, можно автоматизировать очистку кэша при переключении языка, что повысит стабильность и быстродействие.
Заключение
Автоматизация многоязычности в WordPress — задача, требующая комплексного подхода. Плагин Polylang задаёт основу, а кастомные функции WPTO позволяют глубоко интегрировать и автоматизировать процессы создания, синхронизации и отображения языковых версий сайта. Используйте приведённые примеры кода и рекомендации, чтобы значительно упростить работу с многоязычным контентом и повысить качество сайта.