WooCommerce 订单状态从支付网关更改
WooCommerce order status change from payment gateway
我已经集成了一个支付网关来接受我在 woocommerce 上的商店 运行 的在线支付。一切正常,但我注意到 woocommerce 默认将所有在线支付订单的订单状态更改为 wc-processing
。
根据我商店的功能,我希望所有在线支付订单最初都处于 wc-on-hold
状态。
有什么方法可以阻止 woocommerce 以编程方式将订单状态更改为 wc-processing
?
是的,有办法,但你需要修改支付插件或添加自己的代码,你可以read this了解支付的工作原理。
现在,woocommerce使用$order->payment_complete()
方法来处理完成的订单,所以你需要hook自己的函数来修改状态,here is the description of that method
使用这个过滤器:woocommerce_payment_complete_order_status
这是基于此 的代码片段。我们在这里使用 woocommerce_thankyou
(付款完成后立即触发) 来 hook 我们的函数,转换 'processing'
订单状态为 'on-hold'
:
add_action( 'woocommerce_thankyou', 'custom_woocommerce_paid_order_status', 10, 1 );
function custom_woocommerce_paid_order_status( $order_id ) {
if ( ! $order_id ) {
return;
}
global $woocommerce;
$order = new WC_Order( $order_id );
// 'processing' orders status are converted to 'on-hold'.
if ( is_object($order) && $order->has_status( 'processing' ) {
$order->update_status( 'on-hold' );
}
return;
}
您还可以在您的条件下定位支付网关,例如,我们绕过 3 个支付网关并使用 "your_payment_gateway"
slug:[=21 定位特定的支付网关=]
add_action( 'woocommerce_thankyou', 'custom_woocommerce_paid_order_status', 10, 1 );
function custom_woocommerce_paid_order_status( $order_id ) {
if ( ! $order_id ) {
return;
}
global $woocommerce;
$order = new WC_Order( $order_id );
// Bypass orders with Bank wire, Cash on delivery and Cheque payment methods.
if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) || ( get_post_meta($order->id, '_payment_method', true) == 'cod' ) || ( get_post_meta($order->id, '_payment_method', true) == 'cheque' ) ) {
return;
}
// Target your "your_payment_gateway_slug" with this conditional
if ( is_object($order) && get_post_meta($order->id, '_payment_method', true) == 'your_payment_gateway_slug' && $order->has_status( 'processing' ) ) {
$order->update_status( 'on-hold' );
}
return;
}
此代码片段位于您的活动子主题或主题的 function.php 文件中。
你可以轻松做任何你想做的事,正确的付费订单挂钩是woocommerce_thankyou
参考文献:
我已经集成了一个支付网关来接受我在 woocommerce 上的商店 运行 的在线支付。一切正常,但我注意到 woocommerce 默认将所有在线支付订单的订单状态更改为 wc-processing
。
根据我商店的功能,我希望所有在线支付订单最初都处于 wc-on-hold
状态。
有什么方法可以阻止 woocommerce 以编程方式将订单状态更改为 wc-processing
?
是的,有办法,但你需要修改支付插件或添加自己的代码,你可以read this了解支付的工作原理。
现在,woocommerce使用$order->payment_complete()
方法来处理完成的订单,所以你需要hook自己的函数来修改状态,here is the description of that method
使用这个过滤器:woocommerce_payment_complete_order_status
这是基于此 woocommerce_thankyou
(付款完成后立即触发) 来 hook 我们的函数,转换 'processing'
订单状态为 'on-hold'
:
add_action( 'woocommerce_thankyou', 'custom_woocommerce_paid_order_status', 10, 1 );
function custom_woocommerce_paid_order_status( $order_id ) {
if ( ! $order_id ) {
return;
}
global $woocommerce;
$order = new WC_Order( $order_id );
// 'processing' orders status are converted to 'on-hold'.
if ( is_object($order) && $order->has_status( 'processing' ) {
$order->update_status( 'on-hold' );
}
return;
}
您还可以在您的条件下定位支付网关,例如,我们绕过 3 个支付网关并使用 "your_payment_gateway"
slug:[=21 定位特定的支付网关=]
add_action( 'woocommerce_thankyou', 'custom_woocommerce_paid_order_status', 10, 1 );
function custom_woocommerce_paid_order_status( $order_id ) {
if ( ! $order_id ) {
return;
}
global $woocommerce;
$order = new WC_Order( $order_id );
// Bypass orders with Bank wire, Cash on delivery and Cheque payment methods.
if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) || ( get_post_meta($order->id, '_payment_method', true) == 'cod' ) || ( get_post_meta($order->id, '_payment_method', true) == 'cheque' ) ) {
return;
}
// Target your "your_payment_gateway_slug" with this conditional
if ( is_object($order) && get_post_meta($order->id, '_payment_method', true) == 'your_payment_gateway_slug' && $order->has_status( 'processing' ) ) {
$order->update_status( 'on-hold' );
}
return;
}
此代码片段位于您的活动子主题或主题的 function.php 文件中。
你可以轻松做任何你想做的事,正确的付费订单挂钩是woocommerce_thankyou
参考文献: