Диагностика проблемы с переводом статусов заказов WooCommerce
Часто при использовании мультиязычных сайтов на WordPress с WooCommerce возникает проблема: статусы заказов (например, "В обработке", "Завершён", "Отменён") не переводятся автоматически или переводятся некорректно. Это приводит к тому, что пользователь видит статусы на языке по умолчанию, что снижает удобство и доверие к магазину.
Проверить проблему можно так:
- Создать заказ в WooCommerce на языке по умолчанию;
- Переключить сайт на второй язык;
- Открыть страницу заказа в личном кабинете или в уведомлениях по почте;
- Если статус отображается на исходном языке, значит перевод не работает.
Почему WooCommerce не переводит статусы заказов автоматически
Причина в том, что WooCommerce использует свои внутренние строки для статусов заказов, которые не всегда корректно интегрируются с плагинами мультиязычности. Кроме того, статусы — это пользовательские таксономии или метаполя, требующие отдельной обработки для перевода.
Пошаговое решение: автоматический перевод статусов заказов WooCommerce
1. Использование фильтра для локализации статусов
Добавим в functions.php или в кастомный плагин следующий код, который позволит перевести стандартные статусы заказов WooCommerce с помощью gettext-фильтра WordPress:
add_filter('gettext', 'wptranslate_translate_order_statuses', 20, 3); function wptranslate_translate_order_statuses($translated, $text, $domain) { if ($domain === 'woocommerce') { $translations = array( 'Pending payment' => 'Ожидает оплаты', 'Processing' => 'В обработке', 'Completed' => 'Завершён', 'Cancelled' => 'Отменён', 'On hold' => 'На удержании', 'Refunded' => 'Возвращён', 'Failed' => 'Ошибка' ); if (isset($translations[$text])) { return $translations[$text]; } } return $translated; }Этот код перехватывает стандартные статусы и заменяет их на нужные переводы. Для мультиязычности можно расширить логику, проверяя текущий язык сайта.
2. Перевод через WPML или Polylang
Если вы используете WPML или Polylang, убедитесь, что в настройках плагина включен перевод пользовательских таксономий и статусов WooCommerce. Для WPML это настройка "Переводить пользовательские типы записей и таксономии". Для Polylang — аналогичные параметры.
Также можно зарегистрировать статусы для перевода, добавив в functions.php:
function wptranslate_register_order_statuses_for_translation() { $statuses = wc_get_order_statuses(); foreach ($statuses as $slug => $label) { pll_register_string('WooCommerce order status: ' . $slug, $label, 'WooCommerce'); } } add_action('init', 'wptranslate_register_order_statuses_for_translation');После этого переведите строки через интерфейс Polylang.
3. Автоматический перевод через API (DeepL, Google Translate)
Для автоматизации перевода при новых статусах можно использовать API автоперевода. Пример на основе Google Translate API:
function wptranslate_autotranslate_status_label($label, $target_lang) { $api_key = 'ВАШ_GOOGLE_API_КЛЮЧ'; $url = 'https://translation.googleapis.com/language/translate/v2?key=' . $api_key; $response = wp_remote_post($url, array( 'body' => json_encode(array( 'q' => $label, 'target' => $target_lang )), 'headers' => array('Content-Type' => 'application/json') )); if (is_wp_error($response)) { return $label; } $body = json_decode(wp_remote_retrieve_body($response), true); if (isset($body['data']['translations'][0]['translatedText'])) { return $body['data']['translations'][0]['translatedText']; } return $label; }Этот код можно использовать внутри фильтра gettext или при регистрации статусов для динамического перевода.
Проверка результата после внедрения
- Создайте тестовый заказ и перейдите на страницу с его статусом на разных языках;
- Проверьте, что статусы отображаются на нужном языке;
- Отправьте письмо с уведомлением о смене статуса и убедитесь, что там тоже корректный перевод;
- Проверьте консоль браузера на предмет ошибок JavaScript или PHP-логов на ошибки.
Частые ошибки и способы их исправления
- Статусы не переводятся вообще — проверьте, подключен ли фильтр
gettextи корректно ли указан домен'woocommerce'. - Неправильный язык перевода — убедитесь, что функция получает правильный текущий язык сайта (
get_locale()илиpll_current_language()для Polylang). - Автоперевод не работает — проверьте правильность API-ключа, формат запроса и лимиты API.
- Статусы кастомных плагинов не переводятся — добавьте их в список переводимых строк или вручную реализуйте фильтры.
Практические советы по безопасности и производительности
- Не храните ключи API в открытом виде в коде — используйте константы в
wp-config.phpили переменные окружения. - Кэшируйте результаты автоперевода, чтобы не делать повторные запросы к API на одно и то же значение.
- Используйте локализацию WordPress для статусов, чтобы приоритет был у перевода из файлов
.mo, а не только у автоперевода. - Тестируйте изменения на тестовом сервере до внедрения в продакшн.
Сравнение вариантов перевода статусов заказов WooCommerce
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
| Фильтр gettext | Простая реализация, работает сразу | Только статичные переводы, сложно масштабировать | add_filter('gettext', ...) |
| Регистрация строк для Polylang/WPML | Интеграция с интерфейсом перевода, удобно для администраторов | Требует ручного перевода, не автоматизировано | pll_register_string(...) |
| Автоматический перевод через API | Автоматизация, поддержка множества языков | Зависимость от внешних сервисов, возможные задержки и расходы | Вызов Google Translate API |