Проблема: почему метаданные товаров WooCommerce не переводятся автоматически
WooCommerce хранит ключевую информацию о товарах не только в стандартных полях, но и в метаданных (custom fields). Обычно плагины автоперевода переводят только контент и стандартные поля, игнорируя метаданные, что приводит к неполноценному мультиязычному сайту. Это особенно критично для атрибутов, описаний, инструкций и пользовательских настроек, которые часто передаются через метаданные.
Диагностика проблемы
- Проверьте, отображаются ли переводы метаданных на странице товара в другом языке.
- Используйте инструменты разработчика, чтобы увидеть, какие поля выводятся, и сопоставьте их с базой данных в таблице
wp_postmeta. - Убедитесь, что используемый плагин перевода поддерживает работу с метаданными WooCommerce.
Пошаговое решение: автоматический перевод метаданных товаров WooCommerce
1. Определяем метаданные для перевода
Чаще всего метаданные для перевода — это _sku (артикул), _product_attributes, _wpml_media_duplicate (если используется WPML), а также любые произвольные поля, добавленные темой или плагинами.
2. Используем хук save_post_product для запуска перевода
Добавим обработчик, который при сохранении товара инициирует перевод нужных метаданных через API автоперевода (например, DeepL или Google Translate).
add_action('save_post_product', 'auto_translate_product_meta', 20, 3);
function auto_translate_product_meta($post_ID, $post, $update) {
// Проверяем, что это обновление, а не первое сохранение
if (!$update) return;
// Получаем исходный язык
$source_lang = 'en'; // задайте исходный язык
$target_lang = 'ru'; // язык перевода
// Метаданные для перевода
$meta_keys = ['custom_description', 'material_info'];
foreach ($meta_keys as $key) {
$original_text = get_post_meta($post_ID, $key, true);
if ($original_text) {
$translated_text = my_translate_text($original_text, $source_lang, $target_lang);
update_post_meta($post_ID, $key . '_translated_' . $target_lang, $translated_text);
}
}
}
function my_translate_text($text, $source, $target) {
// Пример вызова API перевода (Google Translate)
$api_key = 'YOUR_API_KEY';
$url = 'https://translation.googleapis.com/language/translate/v2?key=' . $api_key;
$data = [
'q' => $text,
'source' => $source,
'target' => $target,
'format' => 'text'
];
$response = wp_remote_post($url, [
'body' => json_encode($data),
'headers' => ['Content-Type' => 'application/json']
]);
if (is_wp_error($response)) return '';
$body = json_decode(wp_remote_retrieve_body($response), true);
return $body['data']['translations'][0]['translatedText'] ?? '';
}3. Выводим переведённые метаданные на фронтенде
В шаблоне товара добавьте проверку и вывод переведённого текста:
$translated_desc = get_post_meta(get_the_ID(), 'custom_description_translated_ru', true);
if ($translated_desc) {
echo esc_html($translated_desc);
} else {
echo esc_html(get_post_meta(get_the_ID(), 'custom_description', true));
}Проверка результата после внедрения
- Откройте товар в админке, обновите и сохраните его.
- Проверьте в базе данных наличие новых метаданных с переводом (через phpMyAdmin или WP CLI).
- Перейдите на страницу товара на языке перевода и убедитесь, что переведённые метаданные отображаются корректно.
- Для отладки используйте логирование в функцию перевода, чтобы отслеживать ошибки API.
Частые ошибки и как исправить
- Перевод не запускается при сохранении товара: возможно, приоритет хука слишком низкий или плагин кеширования блокирует выполнение. Проверьте, отключите кеширование на время теста.
- API перевода возвращает ошибку: проверьте корректность API ключа и лимиты запросов, а также формат запросов.
- Переводы не отображаются на сайте: убедитесь, что шаблон выводит именно переведённые метаданные, а не оригинальные.
- Слишком много запросов к API: реализуйте кеширование переводов в метаданных и отложенное выполнение через WP Cron.
Практические советы по безопасности и производительности
- Не храните открытые API ключи в коде — используйте
wp-config.phpили переменные окружения. - Добавьте проверку nonce и прав пользователя при сохранении товаров, чтобы исключить несанкционированный вызов автоперевода.
- Используйте асинхронное выполнение перевода через WP Cron, чтобы не замедлять сохранение товара.
- Кешируйте переводы в метаданных, чтобы избежать повторных вызовов API.
- Контролируйте лимиты API и логи ошибок для своевременного реагирования.
Сравнение подходов к переводу метаданных WooCommerce
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Использование плагинов автоперевода (WPML, TranslatePress) | Простота установки, поддержка UI | Не всегда переводят метаданные, ограниченный контроль | Использовать дополнительно кастомный код для метаданных |
| Кастомный код с API перевода | Полный контроль, гибкость | Требует разработки, настройка API | Автоматизировать через WP Cron и кеширование |
| Ручной перевод через админку | Точность, отсутствие ошибок API | Высокий трудозатрат, не подходит для большого каталога | Использовать для важных метаданных, остальное автоматизировать |