Диагностика проблемы: почему стандартный Polylang не переводит товары автоматически
Polylang — популярный плагин для создания многоязычных сайтов на WordPress, включая WooCommerce. Однако по умолчанию он не предоставляет функцию автоперевода описаний и атрибутов товаров. При добавлении нового товара на основном языке его перевод на другие языки нужно создавать вручную, что занимает много времени и усложняет процесс ведения каталога.
Типичные симптомы:
— отсутствуют переводы товаров после установки Polylang;
— нет автоматического копирования содержимого товара;
— необходимость переключаться между языками и вводить данные вручную.
Пошаговое решение: автоматический перевод описаний товаров WooCommerce с Polylang
1. Подключение API автоперевода (например, DeepL или Google Translate)
Для автоперевода понадобится внешний API. Рекомендуется использовать DeepL API из-за качества перевода, но Google Translate также подходит.
function translate_text_via_api($text, $target_lang) {
$api_key = 'ВАШ_КЛЮЧ_DEEPL';
$url = 'https://api-free.deepl.com/v2/translate';
$response = wp_remote_post($url, [
'body' => [
'auth_key' => $api_key,
'text' => $text,
'target_lang' => strtoupper($target_lang),
]
]);
if (is_wp_error($response)) {
return false;
}
$body = json_decode(wp_remote_retrieve_body($response), true);
return $body['translations'][0]['text'] ?? false;
}2. Хук для автоперевода при сохранении товара
Добавим функцию, которая при сохранении товара на основном языке автоматически создаст перевод описания и атрибутов на другие языки, зарегистрированные в Polylang.
add_action('save_post_product', 'auto_translate_woocommerce_product', 20, 3);
function auto_translate_woocommerce_product($post_id, $post, $update) {
// Проверяем, что это основной язык
$default_lang = pll_default_language();
$current_lang = pll_get_post_language($post_id);
if ($current_lang !== $default_lang) {
return;
}
// Получаем все языки, кроме основного
$languages = pll_languages_list(['exclude' => [$default_lang]]);
// Получаем данные товара
$product = wc_get_product($post_id);
if (!$product) {
return;
}
// Переводим и сохраняем для каждого языка
foreach ($languages as $lang) {
$translated_post_id = pll_get_post($post_id, $lang);
// Если перевод еще не создан, создаем новый пост
if (!$translated_post_id) {
$translated_post_id = wp_insert_post([
'post_type' => 'product',
'post_status' => 'publish',
'post_title' => '',
'post_content' => '',
'post_excerpt' => '',
]);
pll_set_post_language($translated_post_id, $lang);
pll_save_post_translations([
$default_lang => $post_id,
$lang => $translated_post_id
]);
}
// Переводим заголовок, описание и короткое описание
$translated_title = translate_text_via_api($post->post_title, $lang);
$translated_content = translate_text_via_api($post->post_content, $lang);
$translated_excerpt = translate_text_via_api($post->post_excerpt, $lang);
// Обновляем перевод
wp_update_post([
'ID' => $translated_post_id,
'post_title' => $translated_title ?: $post->post_title,
'post_content' => $translated_content ?: $post->post_content,
'post_excerpt' => $translated_excerpt ?: $post->post_excerpt,
]);
// Переводим атрибуты
$translated_product = wc_get_product($translated_post_id);
$attributes = $product->get_attributes();
foreach ($attributes as $attr_name => $attr) {
if ($attr->is_taxonomy()) {
$terms = wp_get_post_terms($post_id, $attr_name);
$translated_terms_ids = [];
foreach ($terms as $term) {
$translated_term_id = pll_get_term($term->term_id, $lang);
if (!$translated_term_id) {
// Можно добавить создание перевода термина здесь
continue;
}
$translated_terms_ids[] = intval($translated_term_id);
}
wp_set_post_terms($translated_post_id, $translated_terms_ids, $attr_name);
} else {
$translated_value = translate_text_via_api($attr->get_options()[0] ?? '', $lang);
$translated_product->set_attribute($attr_name, $translated_value ?: $attr->get_options()[0]);
}
}
$translated_product->save();
}
}Проверка результата после внедрения
- Создайте или обновите товар на основном языке.
- Перейдите в панель редактирования перевода товара на другой язык.
- Проверьте, что поля «Название», «Описание», «Краткое описание» и атрибуты заполнены автоматически с переводом.
- Проверьте на фронтенде, что переключение языков корректно отображает переведённый товар.
Частые ошибки и как исправить
- Отсутствие ключа API или неверный ключ: В ответе функции
translate_text_via_apiвозвращается false. Проверяйте правильность ключа и лимиты API. - Переводы терминов не создаются автоматически: Polylang не создает переводы таксономий по умолчанию. Для автоматического перевода терминов нужно реализовать отдельный функционал или перевести их вручную.
- Неправильная связь переводов товаров: Убедитесь, что
pll_save_post_translationsвызывается корректно с правильными ID постов и языками. - Дублирование товаров: Проверяйте, что не создаете новые товары при каждом сохранении, а обновляете существующие переводы.
Практические советы по безопасности и производительности
- Кэширование перевода: Чтобы избежать частых запросов к API, сохраняйте переводы в метаполях товара и обновляйте их только при изменении контента.
- Ограничение вызовов API: Добавьте проверку на частоту вызовов, чтобы не превысить лимиты и не заблокировать ключ.
- Обработка ошибок API: Логируйте ошибки и уведомляйте администраторов сайта для быстрой реакции.
- Безопасное хранение ключей API: Храните ключи в файле
wp-config.phpили используйте переменные окружения, не в коде плагина.
Сравнение вариантов реализации автоперевода товаров WooCommerce
| Вариант | Преимущества | Недостатки | Кому подходит |
|---|---|---|---|
| Полностью вручную с Polylang | Полный контроль над переводом, без доп. затрат | Очень трудоемко, не подходит для больших каталогов | Маленькие магазины с ограниченным ассортиментом |
| Автоперевод с кастомным кодом и API DeepL/Google | Автоматизация, экономия времени, гибкость настройки | Требует разработки, оплату API, возможны ошибки перевода | Средние и крупные магазины, желающие сэкономить время |
| Коммерческие плагины автоперевода (WPML + автоматизация) | Готовое решение, поддержка и обновления | Стоимость лицензии, ограниченная кастомизация | Крупные проекты, где важна поддержка и стабильность |