我有一个相当简单的函数,它获取几个产品数据,并通过foreach循环将这些产品批量添加到购物车中。问题在于,如果购物车中已经包含了添加的任何产品,则循环中的第一个产品将被跳过而不会添加。任何其他产品后,第一个,得到添加没有问题。如果购物车是空的,所有产品都可以添加,包括第一个。
**我已经使用干净的安装重新创建了问题。**我只激活了WooCommerce和代码段。您可以在此/sample-page/中看到单击“Add All to Cart”按钮的行为。第一次会起作用,但如果重新加载并再次单击,问题就会出现。
add_shortcode( 'add-all-to-cart', 'add_all_to_cart_shortcode' );
function add_all_to_cart_shortcode() {
global $woocommerce;
ob_start();
?>
<form id="add-all-to-cart" method="post">
<button type="submit" name="add-all-to-cart-button" class="add-all button alt">Add all to cart</button>
</form>
<?php
return ob_get_clean();
}
add_action( 'init', 'add_all_to_cart_handler' );
function add_all_to_cart_handler() {
global $woocommerce;
if ( isset( $_POST['add-all-to-cart-button'] ) ) {
$products_data = array(
array(
'product_id' => 18,
'variation_id' => 19,
'quantity' => 1
),
array(
'product_id' => 21,
'variation_id' => 22,
'quantity' => 1
),
array(
'product_id' => 24,
'variation_id' => 26,
'quantity' => 1
)
);
foreach ( $products_data as $product ) {
$product_id = $product['product_id'];
$variation_id = $product['variation_id'];
$quantity = $product['quantity'];
WC()->cart->add_to_cart( $product_id, $quantity, $variation_id );
}
wp_safe_redirect( wc_get_cart_url() );
exit();
}
}
我尝试过的:
我已经转储了所有变量,所有数据都是好的,都是整数。我试着检查cart_item_key
,它被正确分配。我试着改变代码,首先寻找任何给定的产品已经在购物车,只是更新他们的数量,但这并没有解决问题。我也试过在里面放一些WC()->cart->maybe_set_cart_cookies();
语句,但没有成功。
在寻找答案时,我发现一些人在谈论购物车会话和持久购物车。但我不确定这是否有关系。
先谢谢你了!
1条答案
按热度按时间dgiusagp1#
初始化钩子被调用的方式更早,错过了实际的工作在您的代码。
调用
add_all_to_cart_handler
函数时,将init
钩子替换为template_redirect
钩子。