Возникла проблема, когда функция вызывается, когда я не думаю, что это должно быть, и часто она вызывается несколько раз, надеясь, что кто-то может помочь!
Мой код предназначен только для вызоваФункция 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);
}
}
}
}