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



这里的想法是,当订单以"快递"作为运输方式时,订单状态将更新为"暂停"。

由于我有一些不同的"快递"运输方式费率,我认为通过使用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 表费率运输的人,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;
        }
    }
}

我更喜欢使用更快、更少内存密集型的函数strpos()因为运输方法 ID 总是小写的(就像一种 slug(。

因此,最好使用可用方法获取本例的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;
        }
    }
}

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

经过测试并工作...

所以上面的代码对我不起作用,我让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;
        }
    }
}

我的解决方案假定新订单的正常状态为"正在处理"。

因此,当订单更改为"正在处理"时,请检查运输方式,如果匹配,则将其更改为"暂停"。

add_action('woocommerce_order_status_changed', 'jds_auto_change_status_by_shipping_method');
function jds_auto_change_status_by_shipping_method($order_id) {
    // If the status of an order is changed to PROCESSING and the shipping method contains specific text then change the status.
    if ( ! $order_id ) {
        return;
    }
    global $product;
    $order = wc_get_order( $order_id );
    if ($order->data['status'] == 'processing') { // if order status is processing
        $shipping_method = $order->get_shipping_method();
        if ( strpos($shipping_method, 'express') !== false ) { // if shipping method CONTAINS this text
            $order->update_status('on-hold'); // change status to this
        }
    }   
}

请注意,$shipping_method返回的是买家看到的配送方式的人工读书版本,因此您需要与买家看到的"快递"一词的显示方式完全匹配......是"快递"还是"快递"或"快递">

相关内容

  • 没有找到相关文章

最新更新