Проблема с переводом статусов заказов WooCommerce
WooCommerce использует фиксированные статусы заказов (например, processing, completed, on-hold) для управления жизненным циклом заказов. По умолчанию эти статусы выводятся на языке сайта, но при мультиязычности или кастомных переводах часто возникают проблемы с их корректным отображением на нужном языке, особенно если используются автопереводы или кастомные шаблоны.
Основная сложность — правильно подключить перевод этих статусов, чтобы они отображались в административной панели, на фронтенде, в письмах и отчетах без конфликтов и потери данных.
Диагностика проблемы с переводом статусов заказов
- Статусы заказов показываются только на основном языке и не переводятся при смене языка сайта.
- Переводы статусов не применяются в письмах клиентам.
- При использовании автоперевода WooCommerce статусы остаются на исходном языке.
- Кастомные статусы не отображаются в нужном переводе.
Проверка текущих статусов и их локализации
Для начала проверьте, как WooCommerce выводит статусы через функцию wc_get_order_statuses(). Это массив статусов, где ключ — slug, а значение — название статуса на языке по умолчанию.
$statuses = wc_get_order_statuses();
print_r($statuses);Выведите этот массив на странице в админке или в шаблоне, чтобы увидеть текущие названия статусов.
Пошаговое решение: правильный перевод статусов заказов WooCommerce
1. Используйте gettext-фильтр для перевода статусов
WooCommerce выводит статусы через gettext, поэтому можно перехватывать переводы через фильтр gettext и возвращать нужные строки на нужном языке.
add_filter('gettext', 'wptranslate_translate_order_statuses', 20, 3);
function wptranslate_translate_order_statuses($translated_text, $text, $domain) {
if ($domain === 'woocommerce') {
$translations = [
'Processing' => 'Обработка',
'Completed' => 'Завершён',
'On hold' => 'В ожидании',
'Cancelled' => 'Отменён',
'Refunded' => 'Возвращён',
'Failed' => 'Неудача'
];
if (isset($translations[$text])) {
return $translations[$text];
}
}
return $translated_text;
}Замените переводы в массиве на свои варианты. Этот способ надёжен и работает во всех местах, где WooCommerce выводит статусы.
2. Перевод кастомных статусов заказов
Если вы добавляете кастомные статусы, убедитесь, что вы регистрируете их с переводами через функцию register_post_status с параметром label или используйте _x() для локализации.
register_post_status('wc-custom-status', [
'label' => _x('Custom Status', 'Order status', 'woocommerce'),
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('Custom Status <span class="count">(%s)</span>', 'Custom Statuses <span class="count">(%s)</span>', 'woocommerce'),
]);Переводы для кастомных статусов добавляйте в .po/.mo файлы вашей темы или плагина.
3. Проверка перевода в email-уведомлениях WooCommerce
Статусы в email берутся из тех же gettext-переводов. Для проверки отправьте тестовое письмо с заказом в нужном статусе и убедитесь, что перевод отображается правильно. При необходимости добавьте фильтр woocommerce_email_order_status для дополнительной кастомизации.
Проверка результата после внедрения
- Перейдите на фронтенд сайта и смените язык — статусы заказов должны отображаться на выбранном языке.
- В административной панели WooCommerce статусы заказов должны быть переведены.
- Отправьте тестовый заказ и проверьте письма — статусы в письмах должны быть на нужном языке.
- Если есть кастомные статусы — они тоже должны отображаться корректно.
Частые ошибки при переводе статусов заказов WooCommerce
- Отсутствие фильтра gettext: многие пытаются просто заменить метки в базе, но WooCommerce читает их из gettext.
- Переводы не обновляются после смены языка: проверьте, что языковые файлы загружены корректно и что фильтры не конфликтуют с плагинами мультиязычности.
- Кастомные статусы не зарегистрированы с правильными метками: без _x() или корректных переводов кастомные статусы останутся не переведёнными.
- Автопереводчики не перекрывают gettext: автоперевод по API не всегда заменяет gettext-переводы WooCommerce.
Практические советы по безопасности и производительности
- Не редактируйте напрямую языковые файлы WooCommerce — используйте
gettextфильтр или .po/.mo переводы в дочерних темах или плагинах. - Кэшируйте результат фильтра gettext только при необходимости, чтобы не влиять на производительность.
- При большом количестве языков и кастомных статусов используйте специализированные плагины для мультиязычности, которые умеют работать с WooCommerce статусами (например, WPML, Polylang). Они оптимизируют загрузку переводов.
Сравнение способов перевода статусов заказов WooCommerce
| Метод | Преимущества | Недостатки |
|---|---|---|
Фильтр gettext | Гибко, не требует изменения файлов, работает везде | Нужно вручную поддерживать переводы, может замедлять загрузку при большом объеме |
| Переводы .po/.mo файлов | Автоматизация, поддержка через PoEdit и Loco Translate | Требует обновления языковых файлов, сложнее для кастомных статусов |
| Плагины мультиязычности (WPML/Polylang) | Интеграция с WooCommerce, удобное управление | Платные решения, могут конфликтовать с кастомными кодами |