Как я могу поймать доставку веб-крючка WooCommerce и получить ответ? - PullRequest
0 голосов
/ 07 сентября 2018

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

Проблема в том, что я не могу найти способ поймать проваленный веб-крючок. Я пытаюсь получить код ответа и идентификатор webhook из хука 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() );

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 12 марта 2019

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

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 параметров. Таким образом, мой обратный вызов вызывается.

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

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

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

По сути, это обходит планировщик действий WooCommerce, полезные данные webhook будут доставлены немедленно, а не в очереди, пока не будут отправлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...