Как я могу поймать доставку веб-перехватчика WooCommerce и получить ответ?

Я пытаюсь написать некоторые функции для более разумного управления тем, как WooCommerce обрабатывает неудачные веб-перехватчики. В настоящее время он просто отключает веб-хук после 5 неудачных попыток. Я пытаюсь сделать так, чтобы он делал попытки с постепенно увеличивающимися временными интервалами, пока он либо не преуспеет, либо, наконец, не завершится неудачей после того, как временной интервал достигнет одного дня (86400).

Проблема в том, что я не могу найти способ поймать неудачный веб-хук. Я пытаюсь получить код ответа и идентификатор веб-хука из хука woocommerce_webhook_delivery, как определено в WC_Webhook::deliver() в исходном коде WC. Проблема в том, что... несмотря на то, что мои тестовые веб-перехватчики WC запускаются и доставляются нормально, я никогда не могу обнаружить, что этот метод работает, хотя все методы, отвечающие за доставку веб-перехватчиков, ссылаются на него. Я пробовал XDebug, втыкая туда error_logs на тот случай, если они работали в фоновом режиме. До сих пор нет кости. Поэтому моя идея поймать woocommerce_webhook_delivery не работает, и я не знаю другого, более легкого способа.

Вот какой небольшой код у меня пока есть, если я смогу определить код ответа, я смогу обработать все остальное....

WC_WebhookBackoff {

protected $webhook;

protected $webhook_id;

public function __construct() {
    add_action('woocommerce_webhook_delivery', [$this, 'catch_webhook_failure'], 1, 5);
}

public function hooks() {

}

public function catch_webhook_failure($http_args, $response, $duration, $arg, $id) {

    $failed_hooks = get_option( '_failed_wc_webhooks', true ) ? json_decode(get_option( '_wds_failed_wc_webhooks', true ) ) : [];
error_log("This should be called.");
    if ( 200 !== $response ) {

        $failed_hooks = [];

        $this->update_failed_hooks();
    }
}
[...snip...]

И да, это определенно создается, и хук определенно регистрируется.

Для справки, вот крючок, на который я смотрю:

do_action( 'woocommerce_webhook_delivery', $http_args, $response, $duration, $arg, $this->get_id() );

Любая помощь приветствуется.


person Chris Wieber    schedule 07.09.2018    source источник


Ответы (1)


По сути, я хотел сделать то же самое (захват информации об ответе на мои веб-перехватчики). Вот как я это сделал.

add_action('woocommerce_webhook_delivery', function($http_args, $response, $duration, $arg, $webhook_id) {
  // do whatever you want to here
  .. 
}, 1, 5);

Обратите внимание, что я установил приоритет равным 1 вместо 10 по умолчанию, потому что с 10 это не сработало (у меня пока нет полного понимания приоритетов хуков WordPress). 5 в конце означает, что хук получает 5 параметров. Таким образом, мой обратный вызов вызывается.

У меня была настройка хука, которая срабатывала при обновлении продуктов. Я обновил описание своих продуктов, и моя функция обратного вызова была вызвана. Обратите внимание, что обновление веб-перехватчика (изменение конечной точки или что-то еще) не вызывало функцию обратного вызова (не знаю почему, потому что она отправляет пинг на адрес доставки).

Для тестирования я также использовал этот фильтр.

apply_filters('woocommerce_webhook_deliver_async', function() {
  return false;
});

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

person Kohányi Róbert    schedule 12.03.2019