Срабатывает ли хук woocommerce_order_status_changed при автоматическом обновлении статуса заказа в WooCommerce?

15 февр. 2019 г., 15:17:44
Просмотры: 21.2K
Голосов: 1

У нас есть плагин, который использует хук woocommerce_payment_complete, который рассчитывает балльную стоимость заказов для наших клиентов на основе товаров и общей суммы заказа. Это генерирует CSV-файл, а затем использует rsync для отправки CSV-файла во внешнюю систему, которая хранит и обрабатывает эти данные.

В том же плагине мы также используем хук woocommerce_order_status_changed, который пересчитывает значения в зависимости от нового статуса заказа (возвращенные товары и т.д.), генерирует CSV-файл и снова отправляет во внешний источник.

Всё это работает нормально: клиент может сделать заказ, и CSV-файл генерируется и т.д., мы можем вручную обновить статус заказа в панели администратора, и новый CSV-файл генерируется и отправляется. Однако если статус заказа изменяется автоматически через WooCommerce или платежный шлюз, похоже, что хук woocommerce_order_status_changed не срабатывает, так как CSV-файл не генерируется.

Итак, мои вопросы:

  1. Срабатывает ли хук woocommerce_order_status_changed когда статус заказа меняется автоматически, или только когда статус заказа меняется вручную нами в бэкенде?

  2. Существует ли хук, который срабатывает, когда статус заказа меняется автоматически через WooCommerce/платежные шлюзы?

Я искал везде, но каждый результат, похоже, либо указывает на то, что я уже делаю, либо касается настройки скрипта, который меняет статус с помощью $order->update_status() и подобных альтернатив, что не то, что мы ищем.

Один из результатов показал следующее (относительно woocommerce_order_status_changed):

"Где используется хук (в ядре WC): Не используется."

Что, похоже, отвечает на Вопрос 1, что приводит меня к мысли, что если WooCommerce или платежный шлюз меняет статус заказа автоматически, он никогда не сработает, и, следовательно, не создаст наш CSV и т.д.

Может кто-нибудь пролить свет на это? Существует ли хук, который мы можем использовать при автоматическом изменении статусов заказов через WooCommerce или платежный шлюз?

0
Все ответы на вопрос 1
4

Один из результатов действительно привел к этому (в отношении woocommerce_order_status_changed):

"Где используется хук (в ядре WC): Не используется."

Что, кажется, отвечает на Вопрос 1, что приводит меня к мысли, что если WooCommerce или платежный шлюз автоматически изменяют статус заказа, хук никогда не сработает, и CSV не будет создан и т.д.

Это не то, что это значит. Это говорит о том, что WooCommerce сам по себе не добавляет никаких дополнительных действий к этому хуку. А не то, что хук вообще не срабатывает.

Хук woocommerce_order_status_changed срабатывает каждый раз, когда статус заказа изменяется с помощью методов $order->update_status() или $order->set_status(). WooCommerce использует эти методы внутренне для изменения статусов заказов (и сторонние расширения должны делать так же). Так что если WooCommerce сам обновляет статус заказа, автоматически или нет, хук сработает. Это включает в себя и ручное обновление статуса заказа в админке.

Хук не сработает, если расширение, например платежный шлюз, попытается установить статус заказа неправильно. Например, если они изменят статус, используя $order->status = 'processing' или wp_transition_post_status( 'on-hold', 'processing', $order );, то хук не сработает.

Так что вам нужно точно выяснить, при каких именно обстоятельствах хук не срабатывает. Если это платежный шлюз обновляет статус заказа, и хук не срабатывает, скорее всего, его разработчики меняют статус неправильно. В этом случае вам нужно будет связаться с его разработчиками.

15 февр. 2019 г. 15:47:45
Комментарии

А, понятно, это полезно, спасибо! Тогда два примера: Один заказ использовал шлюз PayPal. Примечание к заказу: "Неоплаченный заказ отменён – превышен лимит времени. Статус заказа изменён с Ожидает оплаты на Отменён." Значит, это можно определить по тому, как PayPal меняет этот статус? Другой заказ использовал шлюз Stripe. Примечание к заказу №1: "Карта была отклонена." Примечание к заказу №2: "Статус заказа изменён с Ожидает оплаты на Неудачный." Так вы рекомендуете связаться с их поддержкой, чтобы узнать, как они обрабатывают изменения статуса заказа? Ещё раз спасибо!

no. no.
15 февр. 2019 г. 16:04:08

Вероятно, с этого я бы и начал, да. Я был бы удивлён, если бы эти два шлюза делали это неправильно, так как считаю, что эти интеграции разработаны командой WooCommerce или в тесном сотрудничестве с ней. Проблема может быть в вашем коде, если он каким-то образом неправильно использует хук.

Jacob Peattie Jacob Peattie
15 февр. 2019 г. 16:06:19

Да, наверное, просто странно, что действия/хуки работают при ручном выполнении, но не работают автоматически, ведь если одно изменение их запускает, другое должно тоже? Как вы сказали, если только они не используют wp_transition_post_status или что-то подобное, что позволяло бы этого избежать.

no. no.
15 февр. 2019 г. 16:11:34

По поводу того, правильно ли я всё настроил... плагин представляет собой класс, конструктор содержит действия/хуки, оба ссылаются на один и тот же метод, а класс инициализируется на той же странице сразу после его объявления. Единственное, что приходит на ум - возможно плагин/класс не загружается вместе со скриптом, который шлюз использует для обновления статуса, что тоже не имеет особого смысла, поскольку плагин должен подключаться при загрузке WordPress.

no. no.
15 февр. 2019 г. 16:14:19