我正在尝试编写一些功能来更智能地控制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() );
非常感谢您的帮助。
答案 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的有效负载将立即交付,而不是排在队列中直到被分配。