我已经集成了支付网关来接受在woocommerce上运行的商店的在线支付。一切正常,但我注意到woocommerce默认情况下将所有在线付款订单的订单状态更改为wc-processing
。WooCommerce订单状态从支付网关变更
根据我的商店功能,我希望所有在线付款订单最初都在wc-on-hold
状态。
有没有办法阻止woocommerce以编程方式将订单状态更改为wc-processing
?
我已经集成了支付网关来接受在woocommerce上运行的商店的在线支付。一切正常,但我注意到woocommerce默认情况下将所有在线付款订单的订单状态更改为wc-processing
。WooCommerce订单状态从支付网关变更
根据我的商店功能,我希望所有在线付款订单最初都在wc-on-hold
状态。
有没有办法阻止woocommerce以编程方式将订单状态更改为wc-processing
?
是的,有一种方法,但您需要修改付款插件或添加您自己的代码,您可以read this了解付款的工作方式。
现在,woocommerce使用$order->payment_complete()
方法来处理完成的订单,所以你需要连接自己的函数来修改状态,here is the description of that method
使用此过滤器:woocommerce_payment_complete_order_status
这是基于代码片段在这thread。我们在这里使用woocommerce_thankyou
(只支付已经完成之后被解雇)挂钩我们的功能,'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:
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
参考文献:
非常感谢您,但在您的解决方案中,订单将会从“网关”转变为“暂停”,并已标记为“正在处理”。我的问题是我有一个电子邮件警报流程连接到订单状态,其中''等待''应该从网关处理的第一状态。 – krishna89
您说得对''order-> payment_complete()'正在将我的付款插件中的订单状态更改为'处理'。我会尝试放置我自己的功能,让你知道。 – krishna89
而不是'$ order-> payment_complete()'我添加了下面的代码,它按照我的预期工作。 '$命令 - > update_status( '保留'。); add_post_meta($ order-> id,'_paid_date',current_time('mysql'),true); update_post_meta($ order-> id,'_transaction_id',$ txnid); $ order-> reduce_order_stock();' – krishna89