Изменение статуса заказа Woocommerce в зависимости от различных способов доставки

Я использую Изменить статус заказа Woocommerce в зависимости от способа доставки код, и он прекрасно работает для переназначения моего пользовательского статуса заказа ожидает самовывоз в WooCommerce на основе строки метода доставки.

Вот мой код:

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;
            }
        }
    }

Мне нужна помощь в расширении этого, чтобы применить несколько различных правил, основанных на других методах доставки, таких как «free_shipping» и «flat_rate», которые я также хотел бы переназначить как «ожидает доставки».

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

Экземпляры доставки структурированы следующим образом:

'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'

Каждый раз, когда я создаю новую зону доставки, дополнительные экземпляры доставки, прикрепленные к этой зоне, будут иметь новые номера, прикрепленные к типу метода. В конечном итоге мне нужно что-то, что использует следующую логику:

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

person beerismysavior    schedule 15.11.2020    source источник


Ответы (1)


Обновление 2

Поскольку здесь вы используете настоящий идентификатор способа доставки, вам не нужно искать строку. Тогда будет проще заставить его работать для нескольких идентификаторов методов доставки следующим образом:

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
        }
    }
}

Код находится в файле functions.php активной дочерней темы (или активной темы). Должно сработать.

person LoicTheAztec    schedule 15.11.2020
comment
Спасибо, что помогли мне с этим! Я обновил свой вопрос, чтобы лучше отразить некоторые особенности проблемы, с которой я сталкиваюсь. А именно, мне нужно что-то, что просматривает строку, поскольку мы продолжаем добавлять зоны доставки с течением времени, потому что существует несколько пронумерованных экземпляров с каждым типом доставки. Кроме того, мне нужен один набор методов доставки, чтобы присвоить статус заказа «ожидает-самовывоз», в то время как два других метода доставки назначают другой статус заказа «ожидает-доставка». Еще раз спасибо за помощь в решении этой проблемы. - person beerismysavior; 16.11.2020
comment
Хорошо, я попробовал этот код, когда вы его писали, и, похоже, он работал не так, как планировалось. Заказ действительно прошел, но оказался в статусе обработки заказа, а также вызвал критическую ошибку для веб-сайта. Я заметил следующее has_status('awaiting-pickup'), поэтому я попытался изменить это на has_status('processing'), если это старое состояние, на которое мы будем ссылаться. В обоих попытках почему-то не сработало. Есть ли другие идеи, которые могут сработать? - person beerismysavior; 16.11.2020
comment
тест сгенерировал flat_rate, когда я использовал приведенный ниже код foreach($order->get_shipping_methods() as $shipping_item ){print_r( $shipping_item->get_method_id()); - person beerismysavior; 16.11.2020
comment
Я столкнулся с проблемой, когда пользователи время от времени возвращались к экрану благодарности, который затем отправлял заказы из завершенного обратно в корзину доставки. Чтобы обойти это, я добавил чек if ($order->has_status('completed')) сразу после $order = wc_get_order( $order_id );, чтобы гарантировать, что после того, как заказы были помечены как выполненные, они не возвращаются к состоянию заказа на основе метода доставки. - person beerismysavior; 27.02.2021