Диагностика проблемы: почему автоматический перевод описания и атрибутов товаров необходим
При создании многоязычного интернет-магазина на WooCommerce часто возникает задача перевода описаний товаров и их атрибутов. Ручной перевод занимает много времени и не масштабируется при большом каталоге. Основные проблемы:
- Описание и атрибуты не переводятся автоматически при смене языка.
- Плагины многоязычности (WPML, Polylang) требуют ручного добавления переводов.
- Отсутствие автоматической синхронизации переводов вызывает рассинхронизацию данных.
Цель — настроить автоматический перевод описаний и атрибутов товаров через API перевода (например, Google Translate API) с минимальными доработками кода и сохранением производительности.
Как автоматически переводить описания товаров WooCommerce
Подключение Google Translate API для перевода контента
Первым шагом нужно получить ключ API Google Cloud Translate. Далее реализуем функцию, которая на лету переводит текст при сохранении товара.
function wplangs_translate_text_google($text, $target_lang = 'en') {
$apiKey = 'ВАШ_API_КЛЮЧ';
$url = 'https://translation.googleapis.com/language/translate/v2?key=' . $apiKey;
$data = [
'q' => $text,
'target' => $target_lang,
'format' => 'text'
];
$response = wp_remote_post($url, [
'body' => json_encode($data),
'headers' => [
'Content-Type' => 'application/json'
]
]);
if (is_wp_error($response)) {
return $text;
}
$body = json_decode(wp_remote_retrieve_body($response), true);
if (isset($body['data']['translations'][0]['translatedText'])) {
return $body['data']['translations'][0]['translatedText'];
}
return $text;
}Автоматический перевод описания при сохранении товара
Добавим хук, который при сохранении товара создает/обновляет перевод описания на другой язык (например, английский). Предположим, что основной язык — русский.
add_action('save_post_product', 'wplangs_auto_translate_product_description', 20, 3);
function wplangs_auto_translate_product_description($post_ID, $post, $update) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if ($post->post_type !== 'product') return;
$target_lang = 'en';
// Получаем оригинальное описание
$original_description = $post->post_content;
// Переводим описание
$translated_description = wplangs_translate_text_google($original_description, $target_lang);
// Обновляем поле перевода (например, сохраняем в мета поле)
update_post_meta($post_ID, '_translated_description_' . $target_lang, $translated_description);
}Автоматический перевод атрибутов товаров WooCommerce
Почему атрибуты требуют отдельного перевода
Атрибуты товаров в WooCommerce — это отдельные термины таксономий (product_attributes или custom_attributes), которые нужно переводить отдельно от описания. Перевод атрибутов важен для сохранения консистентности фильтров и SEO.
Пример кода для перевода названий атрибутов и их значений
function wplangs_translate_product_attributes($product_id, $target_lang = 'en') {
$product = wc_get_product($product_id);
if (!$product) return;
$attributes = $product->get_attributes();
foreach ($attributes as $attribute_name => $attribute) {
// Переводим название атрибута
$translated_name = wplangs_translate_text_google($attribute->get_name(), $target_lang);
// Переводим значения атрибута
$options = $attribute->get_options();
$translated_options = [];
foreach ($options as $option) {
$translated_options[] = wplangs_translate_text_google($option, $target_lang);
}
// Сохраняем переведенные данные в мета
update_post_meta($product_id, '_translated_attribute_name_' . $attribute_name . '_' . $target_lang, $translated_name);
update_post_meta($product_id, '_translated_attribute_options_' . $attribute_name . '_' . $target_lang, $translated_options);
}
}
add_action('save_post_product', function($post_ID, $post, $update) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if ($post->post_type !== 'product') return;
wplangs_translate_product_attributes($post_ID, 'en');
}, 25, 3);Проверка результата после внедрения автоматического перевода
Чтобы проверить корректность работы, выполните следующие шаги:
- Создайте или обновите товар с описанием и атрибутами на основном языке.
- Откройте базу данных и проверьте наличие мета полей
_translated_description_en,_translated_attribute_name_...и_translated_attribute_options_...с переведёнными значениями. - Напишите простой шаблон вывода, который при переключении языка выводит переводы из этих мета полей.
Пример вывода перевода описания в шаблоне:
$translated_description = get_post_meta(get_the_ID(), '_translated_description_en', true);
if ($translated_description) {
echo wp_kses_post($translated_description);
} else {
the_content();
}Частые ошибки и как их исправить
- Отсутствие API ключа или неверный ключ Google Translate. Ошибка при запросе к API. Проверяйте правильность и активность ключа в Google Cloud Console.
- Перевод происходит при каждом сохранении товара, что замедляет работу. Добавляйте проверку изменения описания или атрибутов, чтобы не запускать перевод без необходимости.
- Сохранение перевода в поле поста без уникального ключа языка. Это ведет к перезаписи и потере данных. Используйте мета-поля с языковым суффиксом.
- Переводы атрибутов не отображаются в шаблоне. Убедитесь, что выводите именно мета-поля с переводами, а не оригинальные значения.
Практические советы по безопасности и производительности
- Кэшируйте результаты перевода, чтобы не делать повторные запросы к API для одинакового текста. Для этого можно использовать Transients API WordPress.
- Обрабатывайте ошибки API, чтобы не сохранять пустые или некорректные переводы.
- Ограничьте количество символов для перевода за один запрос, чтобы избежать превышения лимитов API.
- Не храните API ключ в коде напрямую — лучше использовать
wp-config.phpили переменные окружения. - Для больших магазинов рассмотрите пакетную обработку переводов через WP-CLI или фоновые задачи.
Сравнение подходов реализации автоматического перевода WooCommerce товаров
| Метод | Плюсы | Минусы | Примечание |
|---|---|---|---|
| Плагины (WPML, TranslatePress) | Готовое решение, поддержка интерфейса | Требуют ручной перевод, дорогие лицензии | Подходит для небольших каталогов |
| Собственный код с Google Translate API | Автоматизация, гибкость | Необходим API ключ, возможны ошибки перевода | Подходит для больших каталогов с автоматизацией |
| Использование сторонних сервисов (DeepL, Yandex) | Высокое качество перевода | API может быть платным, интеграция сложнее | Альтернатива Google Translate |