Saya menggunakan Ubah Status Pesanan Woocommerce berdasarkan Metode Pengiriman kode dan berfungsi dengan baik untuk menetapkan kembali status pesanan khusus saya "menunggu penjemputan" di WooCommerce berdasarkan string metode pengiriman.

Ini kode saya:

add_action( 'woocommerce_thankyou', 'shipping_method_update_order_status', 10, 1 );
    function shipping_method_update_order_status( $order_id ) {
        if ( ! $order_id ) return;
    
        $search = 'local_pickup'; // 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 "pickup" method is used, we change the order to "awaiting-pickup" status
            if( strpos( $shipping_item->get_method_title(), $search ) !== false ){
                $order->update_status('awaiting-pickup');
                $order->save();
                break;
            }
        }
    }

Saya perlu bantuan untuk memperluas ini untuk menerapkan beberapa aturan berbeda berdasarkan metode pengiriman lain seperti untuk 'free_shipping' dan 'flat_rate' yang ingin saya tetapkan kembali sebagai 'menunggu pengiriman' juga.

$search = 'flat_rate' OR 'free_shipping';
$order->update_status('awaiting-delivery');

Instance pengiriman terstruktur seperti ini:

'local_pickup:2'
'local_pickup:5'
'local_pickup:7'
'local_pickup:10'

'flat_rate:3'
'flat_rate:6'
'flat_rate:9'

'free_shipping:11'
'free_shipping:12'
'free_shipping:13'

Setiap kali saya membuat zona pengiriman baru, instance pengiriman tambahan yang dilampirkan ke zona itu akan memiliki nomor baru yang dilampirkan jenis metode. Pada akhirnya saya membutuhkan sesuatu yang menggunakan logika berikut:

IF      'local_pickup' IN string
THEN    $order->update_status('awaiting-pickup');
ELSEIF  'flat_rate' OR 'free_shipping' IN string
THEN    $order->update_status('awaiting-delivery');
END
2
beerismysavior 15 November 2020, 20:28

1 menjawab

Jawaban Terbaik

Perbarui 2

Karena Anda menggunakan ID metode pengiriman asli di sini, Anda tidak perlu mencari string. Maka akan lebih mudah untuk membuatnya bekerja untuk beberapa Id metode pengiriman sebagai berikut:

add_action( 'woocommerce_thankyou', 'shipping_method_update_order_status', 10, 1 );
function shipping_method_update_order_status( $order_id ) {
    if ( ! $order_id ) return;
    
    // Here define your shipping methods Ids
    $shipping_methods_ids_1 = array('local_pickup');
    $shipping_methods_ids_2 = array('flat_rate', 'free_shipping');

    // 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 ){
        // For testing to check the shipping method slug (uncomment the line below):
        // echo '<pre>'. print_r( $shipping_item->get_method_id(), true ) . '</pre>';

        // When "Local pickup" method is used, we change the order to "awaiting-pickup" status
        if( in_array( $shipping_item->get_method_id(), $shipping_methods_ids_1 ) && ! $order->has_status('awaiting-pickup') ){
            $order->update_status('awaiting-pickup'); // Already use internally save() method
            break; // stop the loop
        }
        // When 'Flat rate' or 'Free shipping' methods are used, we change the order to "awaiting-delivery" status
        elseif( in_array( $shipping_item->get_method_id(), $shipping_methods_ids_2 ) && ! $order->has_status('awaiting-delivery') ){
            $order->update_status('awaiting-delivery'); // Already use internally save() method
            break; // stop the loop
        }
    }
}

Kode masuk ke file functions.php dari tema anak aktif (atau tema aktif). Ini harus bekerja.

2
LoicTheAztec 16 November 2020, 00:02