Диагностика проблемы: почему метаданные товаров WooCommerce не переводятся автоматически
При использовании Polylang с WooCommerce многие сталкиваются с тем, что стандартные поля продуктов переводятся корректно, а метаданные (custom fields), такие как дополнительные характеристики или технические параметры, остаются на исходном языке. Это происходит потому, что Polylang по умолчанию не переводит произвольные поля, и необходимо написать дополнительный код для их синхронизации или автоперевода.
Пошаговое решение автоперевода метаданных WooCommerce с Polylang
1. Определите, какие метаданные нужно переводить
Сначала выделите ключи метаданных, которые должны быть переведены. Например, _product_technical_spec, _custom_attribute_color и т.п. Это важно, чтобы не пытаться переводить лишние данные.
2. Используйте хук pll_save_post для синхронизации метаданных при сохранении перевода
Этот хук срабатывает, когда сохраняется перевод записи (товара). Нужно скопировать или перевести метаданные из оригинального товара в перевод.
add_action('pll_save_post', 'sync_woocommerce_product_meta', 10, 2);
function sync_woocommerce_product_meta($post_id, $lang){
$original_id = pll_get_post($post_id, 'en'); // замените 'en' на язык оригинала
if(!$original_id) return;
// Список метаданных для перевода
$meta_keys = array('_product_technical_spec', '_custom_attribute_color');
foreach($meta_keys as $key){
$value = get_post_meta($original_id, $key, true);
if($value){
// Здесь можно добавить вызов автоперевода, например, через API DeepL или Google Translate
// Для примера просто копируем
update_post_meta($post_id, $key, $value);
}
}
}3. Интеграция автоперевода через API (пример с Google Translate)
Для автоматического перевода нужно отправлять метаданные на сервис переводов. Пример простого запроса к Google Translate API (учитывайте, что для рабочего решения нужен ключ API и обработка ошибок):
function translate_text_google($text, $target_lang = 'ru') {
$api_key = 'ВАШ_КЛЮЧ_API';
$url = 'https://translation.googleapis.com/language/translate/v2?key=' . $api_key;
$response = wp_remote_post($url, array(
'body' => json_encode(array(
'q' => $text,
'target' => $target_lang
)),
'headers' => array('Content-Type' => 'application/json')
));
if(is_wp_error($response)) return $text;
$body = json_decode(wp_remote_retrieve_body($response), true);
return $body['data']['translations'][0]['translatedText'] ?? $text;
}Вызовите эту функцию внутри цикла синхронизации метаданных, чтобы получать переведённый текст.
Проверка результата после внедрения
1. Создайте товар на основном языке (например, английском) и заполните метаданные.
2. Добавьте перевод товара на целевой язык через Polylang.
3. Сохраните перевод и проверьте, что метаданные переведены или скопированы в админке и фронтенде.
4. Для проверки автоперевода — убедитесь, что значения метаданных изменены на целевой язык, а не просто продублированы.
Частые ошибки и как их исправить
- Отсутствие оригинального ID при вызове
pll_get_post— проверьте, что язык и ID передаются корректно. - Метаданные не отображаются в теме — убедитесь, что тема выводит нужные метаполя и корректно работает с переводами.
- Запросы к API перевода не проходят — проверьте ключ API, лимиты и формат запроса.
- Переводится не весь текст метаданных — если мета содержат сложные структуры (массивы, JSON), нужно сериализовать/десериализовать перед отправкой на перевод.
Практические советы по безопасности и производительности
- Кэшируйте результаты перевода в метаданных, чтобы не делать повторные запросы к API.
- Обрабатывайте возможные ошибки и тайм-ауты при запросах к сервисам перевода.
- Используйте очередь задач (WP-Cron или внешние сервисы), чтобы не замедлять сохранение товара.
- Фильтруйте и экранируйте все данные, чтобы избежать XSS и SQL-инъекций.
Сравнение подходов для автоперевода метаданных WooCommerce
| Метод | Преимущества | Недостатки | Пример |
|---|---|---|---|
| Ручная копия метаданных | Просто реализовать, без затрат на API | Нет перевода, копируются только оригинальные значения | Код с update_post_meta |
| Интеграция с Google Translate API | Автоматический перевод, улучшает UX | Зависимость от API, возможные задержки и расходы | Запросы через wp_remote_post |
| Использование сторонних плагинов автоперевода | Готовые решения, поддержка и обновления | Меньше контроля, дополнительные расходы | Плагины типа TranslatePress |