在 WooCommerce 中,用户支付完成后,会触发一些 Hooks,我们可以把对订单的自定义处理函数挂载到这些 Hooks 上面,来实现我们需要的自定义功能。
用户付款完成后,有三种不同的 WooCommerce 钩子。
woocommerce_pre_payment_complete
woocommerce_payment_complete
- woocommerce_payment
_complete_order_status_$status
所有这些钩子都会在订单已付款或不需要付款(例如货到付款)时触发,它们也适用于自定义支付网关The
woocommerce_pre_payment_complete
第一个钩子(woocommerce_pre_payment_
complete)在开始支付时使用,不依赖于订单状态。
add_action( 'woocommerce_pre_payment_complete', 'wprs_pre_complete' );
function wprs_pre_complete( $order_id ) {
$order = wc_get_order( $order_id );
// 获取订单数据以进行后续处理
}
- 本文中的所有代码片段都可以插入到当前主题的
functions.php
文件中,或者插入插件中合适的文件中。 - 我们可以从
$order
对象中获取大量订单信息,如$order->get_items()
用于获取订单项目,或$order->get_payment_method()
用于获取付款方式的标题,或$order->get_user_id()
用于获取客户 ID。
woocommerce_payment_complete
woocommerce_payment_complete
只有在订单处于以下状态之一时才会被触发:on-hold
,pending
,failed
,cancelled
,但请记住,该状态列表也可通过woocommerce_valid_order_statuses_for_payment_complete
进行过滤。
但在钩子应用之前,WooCommerce 会将订单状态更改为处理中
maybe已完成
,这也可以使用 woocommerce_payment_complete_order_status
进行过滤。
add_action( 'woocommerce_payment_complete', 'wprs_complete' );
function wprs_complete( $order_id ) {
$order = wc_get_order( $order_id );
// 执行后续操作
}
woocommerce_payment_complete_order_status_$status
最后,woocommerce_payment_complete_order_status_$status
将触发其余订单状态。
add_action( 'woocommerce_payment_complete_order_status_processing', 'wprs_complete_for_status' );
add_action( 'woocommerce_payment_complete_order_status_completed', 'wprs_complete_for_status' );
function wprs_complete_for_status( $order_id ){
$order = wc_get_order( $order_id );
// 执行后续操作
}
需要注意的一点是,支付完成并不代表支付成功,我们在挂载的 Hook 中的函数中,还需要进一步检查订单状态,甚至,如果需要更谨慎一点,我们还可以通过支付网关确认支付金额来检查用户是否真的已经支付成功,才能进行支付成功的处理。