Диагностика проблемы с переводом метаданных WooCommerce
При создании мультиязычного интернет-магазина на WordPress с WooCommerce часто возникает задача перевода не только основного контента товаров, но и метаданных: артикулы, технические характеристики, пользовательские поля и атрибуты. Стандартные плагины перевода, например Polylang или WPML, автоматически переводят заголовки и описания, но метаданные остаются на исходном языке.
Это приводит к несогласованности информации и ухудшению пользовательского опыта. Часто владельцы магазинов пытаются просто клонировать метаданные или копировать их вручную, что неэффективно и ошибочно.
Как проверить, что метаданные не переводятся
- Откройте товар на языке перевода.
- Проверьте произвольные поля (custom fields) и атрибуты в админке WooCommerce.
- Если данные совпадают с исходным языком — перевод не применяется.
- Посмотрите на витрину сайта — описание атрибутов и дополнительных характеристик не локализованы.
Пошаговое решение: автоматический перевод метаданных WooCommerce через API DeepL
В этом примере мы реализуем автоматический перевод метаданных (пользовательских полей и атрибутов товаров) с помощью API DeepL при сохранении товара. Для работы нужен API-ключ DeepL.
1. Подключение хука сохранения товара
add_action('save_post_product', 'auto_translate_woocommerce_metadata', 20, 3);2. Функция перевода метаданных
function auto_translate_woocommerce_metadata($post_id, $post, $update) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if ($post->post_type !== 'product') return;
$target_language = 'DE'; // Целевой язык, например немецкий
$api_key = 'ВАШ_DEEPL_API_КЛЮЧ';
// Получаем метаданные, которые нужно перевести
$meta_to_translate = [
'_custom_field_1',
'_custom_field_2',
// добавьте нужные поля
];
foreach ($meta_to_translate as $meta_key) {
$original_text = get_post_meta($post_id, $meta_key, true);
if ($original_text) {
$translated_text = deepl_translate($original_text, $target_language, $api_key);
if ($translated_text) {
update_post_meta($post_id, $meta_key . '_de', $translated_text); // сохраняем как отдельное поле
}
}
}
// Автоматический перевод атрибутов
$product = wc_get_product($post_id);
if (!$product) return;
$attributes = $product->get_attributes();
foreach ($attributes as $attribute_name => $attribute_obj) {
if ($attribute_obj->is_taxonomy()) {
// Для таксономий нужно перевести термины
$terms = wp_get_post_terms($post_id, $attribute_obj->get_name());
foreach ($terms as $term) {
$translated_name = deepl_translate($term->name, $target_language, $api_key);
if ($translated_name) {
// Создаем перевод термина (создаем новую таксономию или перевод)
// Сложно сделать автоматически, обычно управляется переводчиком таксономий
}
}
} else {
// Прямое значение атрибута
$options = $attribute_obj->get_options();
$translated_options = [];
foreach ($options as $option) {
$translated_option = deepl_translate($option, $target_language, $api_key);
$translated_options[] = $translated_option ?: $option;
}
// Сохраняем переведенные опции в метаданных или отдельном поле
update_post_meta($post_id, 'translated_attribute_' . $attribute_name . '_' . strtolower($target_language), $translated_options);
}
}
}
function deepl_translate($text, $target_lang, $api_key) {
$url = 'https://api-free.deepl.com/v2/translate';
$data = [
'auth_key' => $api_key,
'text' => $text,
'target_lang' => strtoupper($target_lang),
];
$response = wp_remote_post($url, [
'body' => $data,
'timeout' => 10,
]);
if (is_wp_error($response)) {
return false;
}
$body = json_decode(wp_remote_retrieve_body($response), true);
if (!empty($body['translations'][0]['text'])) {
return $body['translations'][0]['text'];
}
return false;
}Проверка результата после внедрения
- Перейдите в админку WooCommerce и откройте товар.
- Проверьте, что для каждого переведённого метаданных есть отдельное поле с суффиксом языка, например
_custom_field_1_de. - На фронтенде создайте вывод переведенных метаданных для выбранного языка.
- Убедитесь, что перевод корректный и не дублирует исходный текст.
Частые ошибки и как исправить
- API ключ DeepL не работает: проверьте правильность ключа, тарификацию и регион.
- Перевод не сохраняется: убедитесь, что используете правильные хуки (например,
save_post_product), а не автосохранение. - Перевод атрибутов таксономий не отображается: для терминов таксономий нужен отдельный перевод через WPML или Polylang, автоматический перевод требует создания новых терминов вручную.
- Производительность падает: перевод при сохранении товара занимает время, используйте асинхронные задачи (wp_cron или queue).
Практические советы по безопасности и производительности
- Не храните API-ключи в открытом коде — используйте
define('DEEPL_API_KEY', '');вwp-config.phpили безопасные переменные окружения. - Кешируйте переводы, чтобы не отправлять повторные запросы на API.
- Для большого каталога товаров используйте отложенный перевод через очереди задач (например, с помощью WP Background Processing).
- Ограничьте перевод только тех метаданных, которые действительно нужны для вывода на сайте.
Сравнение подходов для перевода метаданных WooCommerce
| Способ | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручной перевод через админку | Полный контроль, точность | Трудозатратно, долго | Маленький каталог, точные переводы |
| Автоматический перевод через API (DeepL, Google) | Быстро, масштабируемо | Потенциальные ошибки перевода, нагрузка на сервер | Большой каталог, быстрое обновление |
| Использование плагинов WPML/Polylang для таксономий | Интеграция с переводами темы и плагинов | Не всегда поддерживают пользовательские поля | Комплексный мультиязычный сайт |