woocommerce_payment_complete 未在标记订单完成时触发

Fan*_*nky 2 php wordpress orders woocommerce hook-woocommerce

我需要在订单完成时执行操作。

我试过这个:

function mysite_woocommerce_payment_complete( $order_id ) {
error_log("callback fired");
}
add_action( 'woocommerce_payment_complete', 'mysite_woocommerce_payment_complete' );
Run Code Online (Sandbox Code Playgroud)

但是当我在管理订单屏幕中使用复选标记将订单标记为已完成时, 标记订单完成

……钩子没有开火。我也试过woocommerce_order_status_changed,它在我下订单时执行操作,但当我将订单标记为已完成时它什么也不做。

但是当我将订单标记为已完成时,我会收到有关完成订单的电子邮件。

谢谢!

编辑: 我也试过woocommerce_order_status_changed,这样:

function mysite_woocommerce_payment_complete($order_id, $old_status, $new_status ) {
    error_log("$old_status / $new_status \n");
}
add_action( 'woocommerce_order_status_changed', 'mysite_woocommerce_payment_complete', 99, 3 );
Run Code Online (Sandbox Code Playgroud)

但它在购买时触发(我选择了银行转帐)并显示:“待处理/暂停”,但不是真的 - 请参阅 edi2不会触发从“暂停”到“已完成”的手动后端更改。既不是通过复选标记也不是在单订单界面。

Edit2 woocommerce_order_status_changedwoocommerce_order_status_completed工作,它只将我的测试“错误”输出到 debug.log,而不是出于某种原因输出到 error_log。在woocommerce_payment_complete我以前使用的并不适用于像银行转账,这就是为什么没有奏效的方法。感谢@helgatheviking 提供快速正确的答案

hel*_*ing 5

那么完成的订单电子邮件是由以下触发的:

// Triggers for this email
add_action( 'woocommerce_order_status_completed_notification', array( $this, 'trigger' ) );
Run Code Online (Sandbox Code Playgroud)

如看到这里的来源。

所有“事务性电子邮件操作”(即:触发电子邮件发送的操作)_notification除了普通钩子外还有一个钩子,见这里

因此woocommerce_order_status_completed_notification是引发了一个额外的钩woocommerce_order_status_completed如果 woocommerce_order_status_completed是在woocommerce_email_actions阵列中,它是通过缺省值。为避免从电子邮件中引起任何意外,我建议使用在woocommerce_order_status_completed订单状态发生变化时触发的钩子,包括在管理员中,请参阅此示例:

function mysite_woocommerce_payment_complete( $order_id ) {
    error_log("callback fired");
}
add_action( 'woocommerce_order_status_completed', 'mysite_woocommerce_payment_complete' );
Run Code Online (Sandbox Code Playgroud)