Диагностика проблемы с переводом статусов заказов WooCommerce
Многие разработчики и владельцы мультиязычных WooCommerce-магазинов сталкиваются с проблемой: статусы заказов (например, "processing", "completed", "on-hold") остаются на основном языке, даже если клиент переключился на другой язык сайта. Это приводит к несоответствию пользовательского интерфейса и ухудшению опыта покупателей.
Проверить проблему просто: в панели заказов или в уведомлениях клиент видит статус на оригинальном языке, без перевода.
Пошаговое решение: автоперевод статусов заказов через хук woocommerce_order_status_changed
1. Подключаемся к хуку для отслеживания смены статуса заказа
Хук woocommerce_order_status_changed срабатывает при изменении статуса заказа. С его помощью можно автоматически запускать функцию перевода.
add_action('woocommerce_order_status_changed', 'auto_translate_order_status', 10, 4);
function auto_translate_order_status($order_id, $old_status, $new_status, $order) {
// Логика автоперевода здесь
}2. Определяем языковую версию и словарь переводов
Для автоперевода статусов в конкретный язык создадим словарь. Предположим, что у нас есть поддержка русского и английского, и мы хотим выводить статус в зависимости от текущего языка пользователя или настроек.
$status_translations = [
'processing' => [
'ru' => 'Обработка',
'en' => 'Processing',
],
'completed' => [
'ru' => 'Завершен',
'en' => 'Completed',
],
'on-hold' => [
'ru' => 'В ожидании',
'en' => 'On hold',
],
// Добавьте другие статусы по необходимости
];3. Получаем текущий язык и меняем метаданные статуса
Для мультиязычности используйте функцию определения языка, например, если установлен Polylang:
function get_current_language() {
if (function_exists('pll_current_language')) {
return pll_current_language();
}
return 'en'; // Язык по умолчанию
}В основной функции обновляем метаданные заказа, чтобы в интерфейсе и уведомлениях показывался переведённый статус.
function auto_translate_order_status($order_id, $old_status, $new_status, $order) {
global $status_translations;
$lang = get_current_language();
if (isset($status_translations[$new_status][$lang])) {
$translated_status = $status_translations[$new_status][$lang];
// Сохраняем переведенный статус в метаданные заказа
$order->update_meta_data('_translated_order_status', $translated_status);
$order->save();
}
}Проверка результата после внедрения решения
- Создайте тестовый заказ в WooCommerce.
- Измените статус заказа вручную из панели администратора.
- Проверьте метаданные заказа через
get_post_meta($order_id, '_translated_order_status', true)или с помощью плагина для просмотра метаданных. - Переключите язык сайта (если используется Polylang, WPML или аналог) и убедитесь, что отображается переведённый статус из метаданных.
Частые ошибки и способы их исправления
- Ошибка: Функция
pll_current_language()не определена.
Решение: Проверьте, активен ли плагин Polylang, или замените функцию определения языка на подходящую для вашего мультиязычного решения. - Ошибка: Переводы не отображаются в уведомлениях.
Решение: Убедитесь, что в шаблонах уведомлений WooCommerce вы выводите метаданные_translated_order_statusвместо стандартного статуса. - Ошибка: Метаданные не сохраняются.
Решение: Проверьте правильность вызова$order->save();и наличие прав на запись в базу для пользователя.
Практические советы по безопасности и производительности
- Не используйте автоперевод через внешние API при изменении каждого заказа — это увеличит время обработки и нагрузку.
- Храните переводы статусов локально в массиве или в файлах переводов (.po/.mo) для быстрого доступа.
- Ограничьте обработку хука только необходимыми статусами, чтобы избежать лишних операций.
- В целях безопасности используйте проверку nonce и прав пользователей при изменении заказов в административной панели.
Сравнение вариантов реализации автоперевода статусов заказов WooCommerce
| Метод | Преимущества | Недостатки | Рекомендуется для |
|---|---|---|---|
Локальный словарь + хук woocommerce_order_status_changed | Быстро, не зависит от внешних сервисов, полный контроль | Требует ручного обновления и поддержки словаря | Магазины с фиксированным набором языков и статусов |
| Использование плагинов мультиязычности с поддержкой WooCommerce (WPML, Polylang) | Готовые решения, интеграция с переводом всего сайта | Может быть избыточно и дорого, нагрузка на сайт | Сложные мультиязычные проекты с большим объемом контента |
| Автоперевод через API (Google Translate, DeepL) | Автоматизация, поддержка множества языков | Зависимость от внешних сервисов, возможные задержки, стоимость | Проекты с динамическим контентом и большим количеством языков |