Диагностика проблемы с переводом атрибутов WooCommerce
При создании многоязычного интернет-магазина на WooCommerce часто возникает задача перевода не только описаний товаров, но и атрибутов, которые используются в фильтрах и для вариаций. Без корректного перевода атрибутов пользователь увидит на иностранной версии сайта названия и значения на исходном языке, что ухудшает UX и снижает конверсию.
Основные симптомы проблемы:
- Атрибуты отображаются на языке по умолчанию, несмотря на переключение языка.
- Фильтры по атрибутам некорректно работают или показывают данные только на одном языке.
- Переводы атрибутов не сохраняются в админке при использовании сторонних плагинов перевода.
Пошаговое решение: как автоматически перевести атрибуты и их значения
1. Используйте WPML или Polylang с поддержкой WooCommerce
Эти плагины поддерживают перевод таксономий WooCommerce (атрибутов). Убедитесь, что:
- Атрибуты зарегистрированы как переводимые таксономии.
- В настройках плагина включен перевод атрибутов.
2. Автоматический перевод с использованием DeepL API
Для автоматизации перевода можно подписаться на API DeepL и подключить его через хук сохранения термина таксономии WooCommerce:
add_action('edited_pa_color', 'auto_translate_woo_attribute', 10, 2); // pa_color - пример атрибута
function auto_translate_woo_attribute($term_id, $tt_id) {
$term = get_term($term_id);
if (!$term) return;
// Проверяем текущий язык - для примера rus->eng
if (get_locale() !== 'ru_RU') return;
// Подключаем API DeepL (пример использования curl)
$translated = deepl_translate($term->name, 'RU', 'EN');
if ($translated) {
// Сохраняем перевод как метаполе термина
update_term_meta($term_id, 'translated_name_en', $translated);
}
}
function deepl_translate($text, $source_lang, $target_lang) {
$api_key = 'ВАШ_DEEPL_API_КЛЮЧ';
$url = 'https://api-free.deepl.com/v2/translate';
$data = [
'auth_key' => $api_key,
'text' => $text,
'source_lang' => $source_lang,
'target_lang' => $target_lang
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
if (isset($result['translations'][0]['text'])) {
return $result['translations'][0]['text'];
}
return false;
}Этот код автоматизирует перевод названий атрибутов при их редактировании в админке.
3. Отображение переведенных атрибутов на фронтенде
Для вывода переведенных значений в фильтрах и описаниях вариаций можно использовать фильтр woocommerce_attribute_label:
add_filter('woocommerce_attribute_label', 'display_translated_attribute_label', 10, 2);
function display_translated_attribute_label($label, $name) {
$term = get_term_by('slug', $name, 'pa_' . $name);
if (!$term) return $label;
$translated = get_term_meta($term->term_id, 'translated_name_en', true);
if ($translated && get_locale() === 'en_US') {
return $translated;
}
return $label;
}Аналогично можно вывести переводы значений атрибутов.
Проверка результата после внедрения
- Создайте или отредактируйте атрибут в WooCommerce на основном языке.
- Убедитесь, что после сохранения появился перевод в метаполях (через phpMyAdmin или плагин для просмотра метаполей).
- Переключитесь на целевой язык сайта и проверьте, что название атрибута и значения в фильтрах отображаются переведёнными.
- Проверьте работу вариаций товаров с этими атрибутами и корректность фильтрации.
Частые ошибки и способы их устранения
- Перевод не сохраняется: Проверьте, правильно ли указан хук для вашего атрибута (например,
edited_pa_sizeдля атрибута size). - API DeepL возвращает ошибку: Проверьте валидность ключа, лимиты запросов и формат запроса.
- Переводы не отображаются на фронтенде: Убедитесь, что фильтр
woocommerce_attribute_labelподключён и корректно возвращает переводы. - Конфликты с плагинами перевода: Иногда WPML или Polylang имеют собственные методы хранения переводов, поэтому комбинирование с ручным переводом может вызвать ошибки.
Практические советы по производительности и безопасности
- Кэшируйте результаты перевода, чтобы не вызывать API DeepL при каждом отображении.
- Не храните ключ API в открытом доступе, используйте
wp-config.phpили переменные окружения. - Используйте асинхронные запросы или CRON-задачи для перевода больших объёмов атрибутов, чтобы не тормозить работу админки.
- При использовании WPML или Polylang проверяйте их документацию по переводу таксономий, чтобы избежать дублирования данных.
Сравнение методов перевода атрибутов WooCommerce
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Ручной перевод через WPML/Polylang | Контроль качества, интеграция с плагином | Трудоёмко при большом количестве атрибутов | WPML String Translation |
| Автоматический перевод через API DeepL | Экономит время, быстро | Потенциальная потеря качества, зависит от API | Код из статьи |
| Комбинация: автоматический + ручной | Быстро и качественно после корректировки | Требует дополнительного контроля | Автоматический + правки вручную |