在 woocommerce 中使用 foreach 设置购物车数量时无限循环

Infinite loop while setting cart quantity with foreach in woocommerce

我正在尝试使用以下代码以编程方式设置当前在我的 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 );”这会引发 "Fatal error: Uncaught Error: Maximum function nesting level of '256' reached, aborting!" 错误。出于某种原因,添加此行似乎使其无限循环。

A var_dump() for $cart returns 一个对象包括 public 'cart_contents'(我想得到的位),public 'removed_cart_contents'、public 'applied_coupons' 等等。我的直觉是它试图更新所有这些的数量,而不是仅仅 cart_contents。如果是这样,是否有一种方法可以隔离购物车内容并只退回这些内容。 https://docs.woocommerce.com/wc-apidocs/class-WC_Cart.html 建议 get_cart_contents() 应该这样做,但显然不是。

有什么明显的我做错了吗?

您的代码中存在一些错误和遗漏的部分。试试这个:

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 ) {
        if ( $cart_item['quantity'] != 42 )
            $cart->set_quantity( $cart_item_key, 42 );
    }
}

代码进入您的活动子主题(或活动主题)的 function.php 文件。测试和工作。