Woocommerce - проблема с get_items, возвращающим правильное количество - PullRequest
0 голосов
/ 01 ноября 2019

Возникла проблема, когда функция вызывается, когда я не думаю, что это должно быть, и часто она вызывается несколько раз, надеясь, что кто-то может помочь!

Мой код предназначен только для вызоваФункция create_delivery (), если в заказе есть хотя бы 1 товар с количеством 1 или более. (То есть, чтобы предотвратить создание поставок, если все количества равны 0).

По большей части это работает нормально, однако проблема, с которой я сталкиваюсь, иногда вызывается create_delivery несколько раз (Не каждый раз, только периодически), когда создаются заказы, и он создает поставки для заказов с 0 количествами, что, как я думал, должен предотвратить этот код.

Это происходит чаще с заказами, в которых по какой-то причине первоначальный платеж не прошел. Когда происходит такой сценарий, при успешной оплате доставка создается правильно с правильными количествами. В случаях, когда оплата не удалась, поставки создаются, но с 0 количествами, что не должно происходить. Он должен создаваться только при количестве 1 или более.

Правильно ли мое понимание get_items () здесь? Я думал, что он должен возвращать продукты только в таком порядке, а количество всегда должно присутствовать?

Я предполагаю, что код, запускаемый несколько раз, вызван тем, что woocommerce_checkout_update_order_meta запускается более одного раза (?), Что было бы хорошо, если бы часть моего кода работала с проверкой количества.

Кто-нибудь может увидеть, что я здесь сделал неправильно?

Большое спасибо

// Check at least 1 item in the order has a quantity above 0 before creating delivery
add_action( 'woocommerce_checkout_update_order_meta', 'save_delivery', 11, 1 );
function save_delivery( $order_id ) {
    // Set defaults
    $has_qtys = false;

    // Get order
    $order = wc_get_order( $order_id );

    // Proceed if we have an order object
    if($order){

        // Get the orders items
        $order_items = $order->get_items();

        if($order_items){
            foreach( $order_items as $item_key => $item_values ) {
                $item_data = $item_values->get_data();

                if((int)$item_data['quantity'] >= 1){
                    $has_qtys = true;
                }
            }

            if($has_qtys == true){
                create_delivery($order_id);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...