根据运输方式更改 Woocommerce 订单状态

Posted

技术标签:

【中文标题】根据运输方式更改 Woocommerce 订单状态【英文标题】:Change Woocommerce Order Status based on Shipping Method 【发布时间】:2018-04-27 10:10:14 【问题描述】:

这里的想法是,当订单以“快递”作为运输方式进入时,订单状态将更新为待处理。

因为我有一些不同的“快递”运输方式费率,我认为通过使用stristr() 来查看'express' 一词是否出现在格式化的运输方式标题中的任何位置。但我似乎错过了一些东西,因为我什么也没得到。

我如何检查订单运输方式是否为“快递”以便能够更新订单状态?

这是我的代码:

add_action( 'woocommerce_thankyou', 'express_orders_4865', 10, 1 );
function express_orders_4865( $order_id ) 
    global $woocommerce;

    $order = new WC_Order( $order_id );

    $shipping_method = $order->get_shipping_method();

    if (stristr($shipping_method, 'express') === TRUE) 
        $order->update_status('on-hold');
     else 
        return;
    

编辑------------------------------ -------------

对于使用 Woocommerce Table Rate Shipping 的任何人,get_method_id 返回表费率 id,所以我使用 get_method_title 代替如下,如果有更好的方法请评论...

add_action( 'woocommerce_thankyou', 'express_shipping_update_order_status', 10, 1 );
function express_shipping_update_order_status( $order_id ) 
    if ( ! $order_id ) return;

    $search = 'Express'; // The needle to search in the shipping method ID

    // Get an instance of the WC_Order object
    $order = wc_get_order( $order_id );

    // Get the WC_Order_Item_Shipping object data
    foreach($order->get_shipping_methods() as $shipping_item )
        // When "express delivery" method is used, we change the order to "on-hold" status


        if( strpos( $shipping_item->get_method_title(), $search ) !== false )
            $order->update_status('on-hold');
            break;
        
    

【问题讨论】:

写入调试 $shipping_method 的值是什么。 【参考方案1】:

我更喜欢使用速度更快、内存占用更少的函数 strpos(),因为运输方式 ID 总是小写(就像一种蛞蝓)。

因此,最好使用可用的方法获取这种情况下的WC_Order_Item_Shipping 对象数据。

所以代码应该是:

add_action( 'woocommerce_thankyou', 'express_shipping_update_order_status', 10, 1 );
function express_shipping_update_order_status( $order_id ) 
    if ( ! $order_id ) return;
    
    $search = 'express'; // The needle to search in the shipping method ID

    // Get an instance of the WC_Order object
    $order = wc_get_order( $order_id );

    // Get the WC_Order_Item_Shipping object data
    foreach($order->get_shipping_methods() as $shipping_item )
        // When "express delivery" method is used, we change the order to "on-hold" status
        if( strpos( $shipping_item->get_method_title(), $search ) !== false && ! $order->has_status('on-hold'))
            $order->update_status('on-hold');
            break;
        
    

代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件中。

经过测试并且可以工作……

【讨论】:

嗨@LoicTheAztec,谢谢你的回答,我无法让这个代码用于快递订单?但是,如果我将 !== false 更改为 true,则所有内容都会更改为暂停,这对我来说意味着问题在于使用 strpos。我查看了 strpos 的文档,它只返回一个整数,这可能是问题吗?再次感谢【参考方案2】:

所以上面的代码对我不起作用,我在 FB 小组中有人帮我调试它,这是最后一个对我有用的代码

add_action( 'woocommerce_thankyou', 'express_shipping_update_order_status', 10, 1 );
function express_shipping_update_order_status( $order_id ) 
    if ( ! $order_id ) return;

    $search = 'express'; // The needle to search in the shipping method ID

    // Get an instance of the WC_Order object
    $order = wc_get_order( $order_id );

    // Get the WC_Order_Item_Shipping object data
    foreach($order->get_shipping_methods() as $shipping_item )
        // When "express delivery" method is used, we change the order to "on-hold" status
        if( strpos( $shipping_item->get_method_title(). $search ) !== false )
            $order->update_status('on-hold');
            $order->save();
            break;
        
    

【讨论】:

为什么需要再次加载感谢页面?

以上是关于根据运输方式更改 Woocommerce 订单状态的主要内容,如果未能解决你的问题,请参考以下文章

WooCommerce:根据运输方式自动完成已付款订单

WooCommerce 根据用户角色更改 BACS 订单状态

根据 Woocommerce 中的用户角色更改 COD 支付网关的默认订单状态

在 Woocommerce 中发送特定运输方式的订单保留电子邮件

在 WooCommerce 中更改订单运费总额

支付网关的 WooCommerce 订单状态更改