Проблема с переводом атрибутов товаров WooCommerce
Во многих мультиязычных интернет-магазинах на WooCommerce возникает задача перевода не только описаний товаров, но и атрибутов (цвет, размер, материал и т.д.). Стандартные решения часто не переводят атрибуты автоматически, особенно если атрибуты созданы вручную и содержат термины, добавленные через админку. Это приводит к неполноценному мультиязычному сайту и ухудшению пользовательского опыта.
Диагностика проблемы: почему атрибуты товаров не переводятся
Для начала нужно проверить, как именно созданы атрибуты и как они выводятся на сайте. В WooCommerce атрибуты — это таксономии с терминами, зарегистрированные с префиксом pa_. Например, атрибут «Цвет» — pa_color. Перевод терминам нужно делать в базе, а не просто менять текст в шаблонах.
Частые причины проблемы:
- Атрибуты созданы как пользовательские таксономии без поддержки мультиязычности.
- Используется плагин перевода, который не умеет работать с терминами таксономий WooCommerce.
- Переводы терминов не добавлены или не связаны с оригиналом.
Пошаговое решение: автоматический перевод атрибутов WooCommerce
1. Проверка и настройка плагина мультиязычности
Для работы с WooCommerce атрибутами рекомендуем использовать WPML или Polylang с дополнительным модулем для WooCommerce (WooCommerce Multilingual для WPML). Эти плагины умеют переводить атрибуты и синхронизировать их между языками.
Если вы используете WPML, проверьте в админке WPML > Перевод таксономий, что атрибуты WooCommerce (pa_*) отмечены для перевода.
2. Добавление автоматического перевода терминов с помощью API DeepL
Реализуем автоперевод терминов атрибутов при их создании или обновлении с помощью API DeepL. Для этого используем хук created_pa_color (для атрибута color) или универсальный created_{$taxonomy}.
add_action('created_pa_color', 'auto_translate_pa_color_term', 10, 2);
function auto_translate_pa_color_term($term_id, $tt_id) {
$term = get_term($term_id);
if (!$term || is_wp_error($term)) return;
$original_name = $term->name;
$translated_name = deepl_translate($original_name, 'EN'); // Функция отправки запроса к DeepL
// Создаем перевод термина в базе (WPML пример)
global $sitepress;
$trid = $sitepress->get_element_trid($term_id, 'tax_pa_color');
if (!$trid) {
$sitepress->set_element_language_details($term_id, 'tax_pa_color', NULL, 'ru');
$trid = $sitepress->get_element_trid($term_id, 'tax_pa_color');
}
$sitepress->set_element_language_details(0, 'tax_pa_color', $trid, 'en', $term_id);
wp_insert_term($translated_name, 'pa_color');
}
function deepl_translate($text, $target_lang) {
$api_key = 'YOUR_DEEPL_API_KEY';
$url = 'https://api-free.deepl.com/v2/translate';
$data = [
'auth_key' => $api_key,
'text' => $text,
'target_lang' => $target_lang
];
$response = wp_remote_post($url, [
'body' => $data
]);
if (is_wp_error($response)) return '';
$body = json_decode(wp_remote_retrieve_body($response), true);
return $body['translations'][0]['text'] ?? '';
}Для других атрибутов замените pa_color на нужный таксономический префикс.
3. Автоматический перевод уже существующих терминов
Для существующих атрибутов можно создать WP-CLI команду или скрипт, который переберет все термины и создаст переводы, используя вышеописанную функцию deepl_translate.
function auto_translate_all_terms($taxonomy = 'pa_color', $target_lang = 'EN') {
$terms = get_terms(['taxonomy' => $taxonomy, 'hide_empty' => false]);
foreach ($terms as $term) {
$translated = deepl_translate($term->name, $target_lang);
if ($translated) {
wp_insert_term($translated, $taxonomy);
}
}
}Как проверить, что атрибуты перевелись
- В админке WordPress зайдите в «Товары» > «Атрибуты» и переключитесь на язык перевода (если используется WPML/Polylang).
- Проверьте, что термины в атрибутах отображаются на нужном языке.
- На фронтенде откройте товар и убедитесь, что атрибуты отображаются на нужном языке.
- Используйте запросы
get_term()с указанием языка (через API плагина мультиязычности) для проверки перевода.
Частые ошибки и как их исправить
- Переводы не отображаются на фронтенде
Проверьте, что тема и шаблоны поддерживают мультиязычность. Иногда нужно использовать функции плагина перевода для получения переведенных терминов. - Дублирование терминов
При автоматическом создании переводов может появиться дублирование, если термины уже есть. Добавьте проверку существования термина перед вставкой. - API ключ DeepL не работает
Проверьте правильность ключа и лимиты API, а также обработку ошибок ответа API. - Хук не срабатывает для всех атрибутов
Используйте универсальный хукcreated_{$taxonomy}, подставляя нужный атрибут.
Практические советы по безопасности и производительности
- Не храните API ключи в коде, лучше использовать
define('DEEPL_API_KEY', 'your_key')вwp-config.phpили параметры в настройках плагина. - Кешируйте результаты перевода, чтобы не делать лишних запросов к API.
- Ограничьте запуск автоперевода только при создании новых терминов, чтобы не перегружать сервер.
- Используйте асинхронные запросы или фоновые задачи для массового перевода существующих терминов.
Сравнение вариантов перевода атрибутов WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручной перевод через WPML/Polylang | Полный контроль, надежность | Трудозатратно при большом количестве терминов |
| Автоматический перевод через API DeepL (код) | Автоматизация, экономия времени | Зависимость от API, возможны ошибки перевода |
| Использование готовых модулей WooCommerce Multilingual | Интеграция с WooCommerce, поддержка атрибутов | Платные решения, требуют настройки |