wplang.ru wordpress WP Lang

WooCommerce: как правильно обновлять статусы заказов на мультиязычном сайте

Диагностика проблемы с обновлением статусов заказов в 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Прямое управление переводами, гибкостьНужно поддерживать вручную, не масштабируетсяНебольшие сайты с ограниченным набором статусов
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙