我们有一个插件,它使用woocommerce_payment_complete
hook,它根据项目和订单总额为客户计算订单分值。这将生成一个CSV文件,然后使用rsync
将CSV文件发送到存储和处理此数据的外部系统。
在同一个插件中,我们还使用woocommerce_order_status_changed
钩子根据新订单状态(退款项目等)重新计算值,生成CSV文件并再次发送到外部源。
这一切都很正常,客户可以下订单并生成CSV文件等,我们可以手动更新管理仪表板中的订单状态,并生成和发送新的CSV文件。然而,如果订单通过WooCommerce或支付网关自动更改,则似乎woocommerce_order_status_changed
由于未生成CSV文件,因此未触发挂钩。
所以我的问题是:
是否woocommerce_order_status_changed
当订单状态自动更改时,或者仅当我们在后端手动更改订单状态时,才会触发挂钩?
当订单状态通过WooCommerce/支付网关自动更改时,是否会触发挂钩?
我到处搜索,但每个结果似乎要么指向我已经在做的事情,要么指向设置一个脚本,使用$order->update_status()
和类似的替代品,这不是我们正在寻找的。
One of the results 确实提出了这一点(参考woocommerce_order_status_changed
):
“如果使用挂钩(在WC芯中):不使用。”
这似乎回答了问题1,这让我相信,如果WooCommerce或支付网关自动更改订单状态,它将永远不会启动,从而不会创建我们的CSV等。
有人能解释一下吗?我们是否可以通过WooCommerce或支付网关在订单状态自动更改时触发挂钩?
SO网友:Jacob Peattie
其中一个结果确实提出了这一点(参考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 );
那么钩子就不会开火了。
所以你需要找出什么情况下钩子没有开火。如果它是一个更新订单状态的支付网关,并且钩子没有启动,那么很可能它的开发人员没有正确地更改状态。此时,您需要与它的开发人员进行沟通。