Бесконечный цикл при настройке количества корзин с foreach в woocommerce - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь программно установить количество товаров, которые в настоящее время находятся в моей корзине Woocommerce, используя следующий код (здесь я ввел число 42 в качестве теста - динамическое значение будет введено, как только оно перестанет плохо себя вести).

Код, который я использую, выглядит следующим образом:

function update_quantity_in_cart( $cart ) {

if( ! is_cart() ) {
return;
}  

// Iterate through each cart item
foreach( $cart->get_cart_contents() as $item_key=>$cart_item ) {
  var_dump($cart);

  if ( isset( $cart_item['quantity'] )){
    $cart->set_quantity( $item_key, 42 ); // I think this line is causing the problem
  }
} // end foreach 
}

add_action( 'woocommerce_before_calculate_totals', 'update_quantity_in_cart', 5, 1 );

Все хорошо, пока я не добавлю строку "$ cart-> set_quantity ($ item_key, 42);"который выдает «Неустранимая ошибка: неперехваченная ошибка: достигнут максимальный уровень вложенности функций« 256 », прерывание!»ошибка.По какой-то причине добавление этой строки, кажется, заставляет ее продолжать цикл бесконечно.

var_dump () для $ cart возвращает объект, включающий в себя public 'cart_contents' (бит, который я пытаюсь получить), public 'remove_cart_contents', public 'apply_coupons' и многое другое.Мой инстинкт заключается в том, что он пытается обновить количество для всех этих, а не просто cart_contents.Если это так, есть ли способ изолировать содержимое корзины и просто вернуть ее.https://docs.woocommerce.com/wc-apidocs/class-WC_Cart.html предполагает, что get_cart_contents () должен это делать, но, очевидно, нет.

Что-то очевидно, что я здесь не так делаю?

1 Ответ

0 голосов
/ 29 ноября 2018

В вашем коде есть некоторые ошибки и недостающие части.Попробуйте это:

add_action( 'woocommerce_before_calculate_totals', 'update_quantity_in_cart' );
function update_quantity_in_cart( $cart ) {
    if ( is_admin() && !defined('DOING_AJAX') )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    foreach( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $cart->set_quantity( $cart_item_key, 42 );
    }
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы).Протестировано и работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...