如何获取WooCommerce Webhook交付并获得响应?

时间:2018-09-07 18:28:45

标签: wordpress woocommerce hook-woocommerce

我正在尝试编写一些功能来更智能地控制WooCommerce处理失败的Webhooks的方式。目前,它仅在5次尝试失败后才禁用webhook。我正在尝试使其逐渐以更大的时间间隔进行尝试,直到它成功或最终在时间间隔达到一天(86400)之后失败为止。

问题是,我找不到捕捉失败的Webhook的方法。我试图从WC源中woocommerce_webhook_delivery中定义的WC_Webhook::deliver()挂钩中获取响应代码和webhook ID。问题是...即使我的测试WC Webhooks正在启动并且运行良好,但即使负责交付Webhooks的所有方法都引用了此方法,我也无法检测到此方法正在运行。我尝试了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 :(得分:0)

我基本上想做同样的事情(捕获有关对我的Webhooks的响应的信息)。这是我的方法。

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(更改端点或其他操作)不会调用回调函数(不确定原因,因为它会向发送地址发送ping命令)。

为了测试,我还使用了此过滤器。

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

这实际上绕过了WooCommerce的动作计划程序,Webhook的有效负载将立即交付,而不是排在队列中直到被分配。