在 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 文件。测试和工作。
我正在尝试使用以下代码以编程方式设置当前在我的 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 文件。测试和工作。