2016-08-03 124 views
2

我已经集成了支付网关来接受在woocommerce上运行的商店的在线支付。一切正常,但我注意到woocommerce默认情况下将所有在线付款订单的订单状态更改为wc-processingWooCommerce订单状态从支付网关变更

根据我的商店功能,我希望所有在线付款订单最初都在wc-on-hold状态。

有没有办法阻止woocommerce以编程方式将订单状态更改为wc-processing

回答

2

是的,有一种方法,但您需要修改付款插件或添加您自己的代码,您可以read this了解付款的工作方式。

现在,woocommerce使用$order->payment_complete()方法来处理完成的订单,所以你需要连接自己的函数来修改状态,here is the description of that method

使用此过滤器:woocommerce_payment_complete_order_status

+0

您说得对''order-> payment_complete()'正在将我的付款插件中的订单状态更改为'处理'。我会尝试放置我自己的功能,让你知道。 – krishna89

+0

而不是'$ 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

2

这是基于代码片段在这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

参考文献:

+0

非常感谢您,但在您的解决方案中,订单将会从“网关”转变为“暂停”,并已标记为“正在处理”。我的问题是我有一个电子邮件警报流程连接到订单状态,其中''等待''应该从网关处理的第一状态。 – krishna89