Диагностика проблемы с обновлением статусов заказов в WooCommerce на мультиязычных сайтах
При работе с WooCommerce на многоязычном сайте часто встречается ситуация, когда изменение статуса заказа в админке не отражается корректно на фронтенде или в письмах на языке покупателя. Это связано с тем, что WooCommerce и плагины мультиязычности, например WPML, Polylang, используют разные методы обработки метаданных и транслитерации. В итоге статусы не переключаются правильно, что вызывает путаницу у пользователей и работников магазина.
Признаки проблемы
- Статус заказа меняется в базе, но на сайте отображается старый статус или на другом языке.
- Письма с уведомлениями приходят на неверном языке или с некорректным текстом статуса.
- Автоматические триггеры для смены статусов не срабатывают.
Пошаговое решение: корректное обновление статусов заказов с учётом мультиязычности
Для начала убедимся, что WooCommerce и плагин мультиязычности правильно работают вместе. В качестве примера возьмём WPML, так как он наиболее распространён.
1. Проверка совместимости и настроек WPML
- Проверьте, что у вас установлены последние версии WooCommerce и WPML.
- В настройках WPML убедитесь, что опция «Перевод строк» активна для WooCommerce.
- Убедитесь, что все языковые пакеты обновлены через WPML > Статус.
2. Обеспечение правильного сохранения статуса заказа
По умолчанию WooCommerce хранит статусы заказов как slug, например wc-completed или wc-pending. При мультиязычности необходимо использовать фильтр 'woocommerce_order_status_updated', чтобы синхронизировать статус и переводы.
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
add_action('woocommerce_order_status_updated', 'sync_order_status_multilang', 10, 4);
function sync_order_status_multilang($order_id, $old_status, $new_status, $order) {
if (!function_exists('icl_object_id')) return; // Проверяем WPML
// Получаем ID перевода заказа
$translated_order_id = apply_filters('wpml_object_id', $order_id, 'shop_order', false, 'ru'); // замените 'ru' на нужный язык
if ($translated_order_id && $translated_order_id != $order_id) {
$translated_order = wc_get_order($translated_order_id);
if ($translated_order) {
// Обновляем статус перевода заказа без триггеров для избежания рекурсии
remove_action('woocommerce_order_status_updated', 'sync_order_status_multilang', 10);
$translated_order->update_status($new_status, 'Синхронизация статуса с оригиналом', true);
add_action('woocommerce_order_status_updated', 'sync_order_status_multilang', 10, 4);
}
}
}Этот код синхронизирует статус оригинального заказа с его переводом, чтобы статусы совпадали на всех языках.
3. Обновление языковых строк для статусов в письмах
WooCommerce использует gettext для вывода статусов в письмах и на фронте. Чтобы переводы статусов были корректными, можно добавить фильтр для локализации:
add_filter('gettext', 'custom_translate_order_status', 20, 3);
function custom_translate_order_status($translated_text, $text, $domain) {
if ($domain === 'woocommerce') {
switch ($text) {
case 'Completed':
$translated_text = __('Выполнен', 'woocommerce');
break;
case 'Pending payment':
$translated_text = __('Ожидает оплаты', 'woocommerce');
break;
// Добавьте другие статусы по необходимости
}
}
return $translated_text;
}Замените переводы на нужные для вашего сайта. Это гарантирует, что статусы в письмах и интерфейсе всегда будут на корректном языке.
Как проверить, что решение работает
- Создайте тестовый заказ на одном из языков сайта.
- Измените статус заказа в админке WooCommerce.
- Откройте заказ на другом языке (если есть перевод) и убедитесь, что статус обновился синхронно.
- Отправьте письмо с уведомлением о смене статуса и проверьте язык и текст статуса.
Частые ошибки и способы их устранения
- Отсутствие функции
icl_object_id: Плагин WPML отключен или не установлен. Проверьте активацию WPML. - Рекурсия при обновлении статуса: Если при синхронизации статусов возникает бесконечный цикл, убедитесь, что в коде правильно отключаются и включаются хук-обработчики.
- Неправильный язык в фильтре
wpml_object_id: Передавайте реальный язык перевода вместо жестко заданного 'ru'. Можно динамически получать язык перевода из контекста. - Статусы не переводятся в письмах: Проверьте, что переводы добавлены в .po/.mo файлы темы или плагина, либо используйте фильтр
gettext.
Практические советы по производительности и безопасности
- Обновляйте WooCommerce и WPML регулярно для предотвращения несовместимостей.
- Кешируйте запросы к базе данных при работе с функцией
wpml_object_idдля уменьшения нагрузки. - Избегайте прямого изменения данных заказа в базе — используйте методы API WooCommerce.
- Тестируйте изменения на staging-сайте перед выкатом на боевой.
Сравнение вариантов решения проблемы
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Использование WPML API для синхронизации статусов | Корректная работа с мультиязычностью, автоматизация | Требует WPML, возможны сложности с другими плагинами | Мультиязычные сайты на WPML |
| Ручное обновление статусов на каждом языке | Простота реализации | Большой риск ошибок, неудобство при большом количестве заказов | Маленькие магазины без плагинов мультиязычности |
| Фильтр локализации статусов через gettext | Прямое управление переводами, гибкость | Нужно поддерживать вручную, не масштабируется | Небольшие сайты с ограниченным набором статусов |