Диагностика проблемы с переводом произвольных полей WooCommerce
WooCommerce активно использует произвольные поля (custom fields) для хранения дополнительной информации о товарах, заказах и клиентах. При создании многоязычного магазина часто возникает задача автоматического перевода этих полей. Однако многие плагины перевода не поддерживают или плохо работают с произвольными полями, что приводит к непереведенному или некорректно отображающемуся контенту.
Основные симптомы проблемы:
- Описание товара или его атрибуты содержат тексты на исходном языке, хотя страница отображается на другом языке.
- Перевод вручную невозможен или слишком трудоёмок из-за большого количества полей.
- Используемый плагин перевода игнорирует произвольные поля.
Почему стандартные плагины переводов не всегда работают с произвольными полями WooCommerce
Плагины, такие как Polylang или WPML, чаще всего ориентируются на перевод стандартных элементов WordPress (заголовков, контента, таксономий). Произвольные поля, особенно нестандартные, требуют дополнительной настройки, чтобы плагин мог их распознавать и синхронизировать.
Кроме того, WooCommerce использует сериализованные данные в метаполях, что усложняет автоматический перевод и требует дополнительной обработки.
Пошаговое решение: Автоматизация перевода произвольных полей WooCommerce с использованием DeepL API и хуков WordPress
Шаг 1. Получите API ключ DeepL
Зарегистрируйтесь на https://www.deepl.com/pro-api и получите ключ для API перевода.
Шаг 2. Создайте функцию для перевода текста через DeepL API
function deepl_translate_text($text, $target_lang = 'EN') {
$api_key = 'ВАШ_DEEPL_API_КЛЮЧ';
$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
]);
if (is_wp_error($response)) {
return $text; // Возвращаем исходный текст при ошибке
}
$body = wp_remote_retrieve_body($response);
$result = json_decode($body, true);
if (!empty($result['translations'][0]['text'])) {
return $result['translations'][0]['text'];
}
return $text;
}Шаг 3. Определите метаполя WooCommerce для перевода
Выберите произвольные поля, которые хотите автоматически переводить. Например, _custom_product_info или любые другие пользовательские метаполя.
Шаг 4. Создайте функцию для автоматического перевода метаполей при сохранении товара
add_action('save_post_product', 'auto_translate_custom_fields', 20, 3);
function auto_translate_custom_fields($post_id, $post, $update) {
// Проверяем, что это не автосохранение
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
// Язык оригинала и целевой язык для перевода
$source_lang = 'RU';
$target_lang = 'EN';
// Список произвольных полей для перевода
$custom_fields = ['_custom_product_info', '_another_custom_field'];
foreach ($custom_fields as $field) {
$original_text = get_post_meta($post_id, $field, true);
if (!empty($original_text)) {
$translated_text = deepl_translate_text($original_text, $target_lang);
// Сохраняем переведённый вариант с суффиксом языка
update_post_meta($post_id, $field . '_' . strtolower($target_lang), $translated_text);
}
}
}Шаг 5. Отобразите переведённые поля на сайте в зависимости от текущего языка
function get_product_custom_field_translated($product_id, $field_name) {
$current_lang = defined('ICL_LANGUAGE_CODE') ? ICL_LANGUAGE_CODE : 'ru'; // пример с WPML
$translated_field = $field_name . '_' . $current_lang;
$translated_value = get_post_meta($product_id, $translated_field, true);
if ($translated_value) {
return $translated_value;
}
return get_post_meta($product_id, $field_name, true);
}В шаблоне товара замените вывод
echo get_post_meta($product->get_id(), '_custom_product_info', true);на
echo get_product_custom_field_translated($product->get_id(), '_custom_product_info');Проверка результата после внедрения
- Создайте или отредактируйте товар, заполнив произвольное поле (например, _custom_product_info) на русском языке.
- Сохраните товар.
- В базе данных в метаполях товара должны появиться ключи с суффиксом языка (например, _custom_product_info_en) с переведённым текстом.
- На фронтенде переключитесь на английскую версию сайта и проверьте, что отображается переведённый текст из поля.
- Проверьте, что на русском языке отображается оригинальный текст.
Частые ошибки и способы их исправления
- Проблема: Перевод не сохраняется в метаполях.
Причина: Хукsave_post_productне срабатывает или отключён.
Решение: Проверьте правильность приоритетов и аргументов в хуке, а также права пользователя на сохранение. - Проблема: API DeepL возвращает ошибку или пустой ответ.
Причина: Неверный API ключ или превышен лимит запросов.
Решение: Проверьте ключ, лимиты аккаунта и корректность запроса. - Проблема: Перевод не отображается на фронтенде.
Причина: Неправильное получение текущего языка или неправильное имя метаполя.
Решение: Используйте функции определения текущего языка из вашего плагина мультиязычности (WPML, Polylang) и убедитесь, что метаполя правильно именованы.
Практические советы по безопасности и производительности
- Ограничьте частоту вызовов API перевода, кэшируйте результаты в метаполях, чтобы не делать повторных запросов.
- Используйте проверку nonce и прав пользователя при сохранении данных, чтобы избежать случайных или вредоносных изменений.
- Логируйте ошибки API для своевременной диагностики проблем.
- При большом объёме товаров используйте пакетную обработку переводов или очереди, чтобы не перегружать сервер и API.
Сравнение подходов перевода произвольных полей WooCommerce
| Метод | Преимущества | Недостатки | Пример |
|---|---|---|---|
| Ручной перевод через WPML/Polylang | Точный контроль, простота | Много времени при больших объёмах | Перевод в админке вручную |
| Автоматический перевод через DeepL API + хук сохранения | Автоматизация, экономия времени | Зависимость от API, возможны ошибки перевода | Код из статьи |
| Использование специализированных плагинов автоперевода | Готовые решения с UI | Стоимость, ограниченная гибкость | WPML Translation Management |