支付网关的 WooCommerce 订单状态更改
Posted
技术标签:
【中文标题】支付网关的 WooCommerce 订单状态更改【英文标题】:WooCommerce order status change from payment gateway 【发布时间】:2016-12-09 01:35:18 【问题描述】:我已经集成了一个支付网关,以便为我在 woocommerce 上运行的商店接受在线支付。一切正常,但我注意到 woocommerce 默认将所有在线支付订单的订单状态更改为wc-processing
。
根据我商店的功能,我希望所有在线支付订单最初都处于wc-on-hold
状态。
有没有办法阻止 woocommerce 以编程方式将订单状态更改为 wc-processing
?
【问题讨论】:
【参考方案1】:是有办法的,但是你需要修改支付插件或者添加你自己的代码,你可以read this了解支付是如何工作的。
现在,woocommerce 使用$order->payment_complete()
方法来处理已完成的订单,所以你需要挂钩自己的函数来修改状态,here is the description of that method
使用此过滤器:woocommerce_payment_complete_order_status
【讨论】:
你是对的$order->payment_complete()
在我的支付插件中将订单状态更改为 processing
。我会尝试放置我自己的函数并让你知道。
我添加了以下代码而不是$order->payment_complete()
,它按预期工作。 $order->update_status('on-hold'); add_post_meta($order->id, '_paid_date', current_time('mysql'), true); update_post_meta($order->id, '_transaction_id', $txnid); $order->reduce_order_stock();
【参考方案2】:
这里是基于thread 的代码sn-p。我们在这里使用 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;
此代码 sn-ps 继续在您的活动子主题或主题的 function.php 文件中。
您可以轻松做任何您想做的事,支付订单的正确挂钩是woocommerce_thankyou
参考资料:
WooCommerce Class WC_Abstract_Order WooCommerce: Auto complete paid Orders (depending on Payment methods) Renaming WooCommerce Order Status【讨论】:
非常感谢,但在您的解决方案中,订单将变为on-hold
,它已从网关标记为processing
。我的问题是我有一个与订单状态相关的电子邮件警报流,其中on-hold
应该是网关处理的第一个状态。以上是关于支付网关的 WooCommerce 订单状态更改的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 WooCommerce 中管理员端的更改订单设置支付网关
使用自定义 Woocommerce 支付网关的“下订单按钮”的 Javascript 覆盖