Диагностика проблемы: почему стандартный перевод не работает с пользовательскими полями
В WooCommerce и кастомных темах часто используются текстовые поля (custom fields) для дополнительных данных товаров — описания, инструкции, заметки и т.п. При мультиязычности стандартные плагины, такие как Polylang или WPML, не всегда автоматически переводят содержимое этих полей. Это приводит к ситуации, когда на странице товара в другом языке отображается оригинальный текст, что ухудшает пользовательский опыт.
Чтобы понять, что проблема именно в этом, сделайте следующее:
- Откройте товар в админке WordPress и проверьте, есть ли дополнительные текстовые поля с данными.
- Переключитесь на другой язык сайта и проверьте, что эти поля остались без перевода.
- Проверьте, как плагин мультиязычности работает с другими типами контента.
Пошаговое решение: как автоматически переводить пользовательские текстовые поля WooCommerce
1. Определите, какие именно поля нужно перевести
Обычно пользовательские поля хранятся в метаданных товаров. Например, поле _custom_instructions хранит инструкции по применению товара.
2. Используйте хук WooCommerce для перевода метаданных
Для вывода перевода нужно перехватить вызовы метаданных и подставлять переведённый текст. Ниже пример функции для авто-перевода с использованием Google Translate API (или любого другого API автоперевода):
function wc_autotranslate_custom_fields( $value, $object_id, $meta_key, $single ) {
// Список полей для перевода
$fields_to_translate = array('_custom_instructions', '_custom_notes');
if ( in_array( $meta_key, $fields_to_translate ) && !empty($value) ) {
$current_lang = apply_filters('wpml_current_language', null); // или polylang function
// Проверяем, есть ли уже перевод в БД
$translated_value = get_post_meta( $object_id . '_' . $current_lang, $meta_key, true );
if ( $translated_value ) {
return $translated_value;
}
// Если нет, делаем автоперевод через API
$translated_value = my_autotranslate_api_call( $value, $current_lang );
// Сохраняем перевод для кеша
update_post_meta( $object_id . '_' . $current_lang, $meta_key, $translated_value );
return $translated_value;
}
return $value;
}
add_filter( 'get_post_metadata', 'wc_autotranslate_custom_fields', 10, 4 );Пример функции отправки текста на автоперевод (используйте ваш API ключ и URL):
function my_autotranslate_api_call( $text, $lang ) {
// Заготовка для API вызова, замените на реальный
$api_url = 'https://api.example.com/translate';
$response = wp_remote_post( $api_url, array(
'body' => json_encode(array('text' => $text, 'target_lang' => $lang)),
'headers' => array('Content-Type' => 'application/json')
));
if ( is_wp_error( $response ) ) {
return $text; // Возвращаем оригинал при ошибке
}
$data = json_decode( wp_remote_retrieve_body( $response ), true );
return $data['translated_text'] ?? $text;
}3. Подключите перевод к выводу в шаблоне
В файлах темы, где выводятся пользовательские поля, убедитесь, что используется get_post_meta() (или аналог) — тогда фильтр выше сработает и подставит переведённый текст.
Проверка результата после внедрения
- Перейдите на страницу товара на основном языке, убедитесь, что в пользовательских полях отображается оригинальный текст.
- Переключитесь на другой язык (например, через переключатель языка), проверьте, что поля отображаются на целевом языке.
- Проверьте, что при обновлении страницы перевод не запрашивается повторно (т.е. перевод кешируется).
- При необходимости очистите метаданные с суффиксом языка, чтобы принудительно обновить перевод.
Частые ошибки и как их исправить
- Перевод не отображается на фронтенде. Проверьте, что вы используете
get_post_meta()для вывода, а неget_post_custom()или прямой доступ к базе. - Перевод повторно запрашивается при каждой загрузке. Убедитесь, что функция сохраняет перевод в метаданные с суффиксом языка.
- Неправильное определение языка. Вызов
apply_filters('wpml_current_language', null)для WPML илиpll_current_language()для Polylang обязателен, иначе API переводит в неправильный язык. - Ошибка при вызове API. Добавьте обработку ошибок и fallback на оригинальный текст.
Практические советы по безопасности и производительности
- Для снижения количества запросов к API автоперевода используйте кеширование результатов в метаданных товаров.
- Ограничьте список полей для перевода, чтобы не нагружать систему лишними вызовами.
- Обязательно реализуйте проверку ошибок и fallback, чтобы не выводить пустые или некорректные тексты.
- Используйте WordPress Cron или WP-CLI для пакетного перевода всех товаров заранее, чтобы избежать задержек при загрузке страниц.
Сравнение вариантов реализации автоперевода пользовательских полей WooCommerce
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Фильтр get_post_metadata + API автоперевода | Автоматический, нет ручного перевода, кеширование | Зависимость от внешнего API, возможны задержки | Много товаров, требуется быстрый запуск |
| Ручной перевод через админку WooCommerce + Polylang | Контроль качества перевода | Трудозатратно, не масштабируется | Небольшой каталог, важен точный перевод |
| Пакетный автоперевод через WP-CLI | Перевод без задержек на фронтенде | Требует доступа к серверу, планирование задач | Большие магазины, оптимизация производительности |