在我提交自定义添加到购物车表单后,我尝试使用wp_loaded操作将产品添加到woocommerce购物车。
add_action( 'wp_loaded', 'custom_process_form' );
function custom_process_form(){
global $woocommerce;
if(isset($_POST["addcoupon"])){
foreach($_POST as $key=>$value){
if($key=="addcoupon"){
continue;
}
$valarr=explode("_",$key);
if ($valarr[0]=="couponid"){
$woocommerce->cart->add_to_cart($valarr[1],1);
$count++;
}
}
}
}
它工作正常,除非它第一次加载时,购物车认为我添加了2个产品而不是1.由于某种原因,它运行WC_Cart->calculate_totals()
两次而$this->cart_contents_count
没有重置为零,所以数量增加两倍。 (当我重新加载页面时,购物车显示正确的项目数量)
使用自定义表单添加产品的正确方法是什么?我找不到任何这方面的例子。我使用了错误的动作吗?
答案 0 :(得分:0)
我在自己的安装上进行了实验,并且可以确认发生了同样的情况。对我来说,calculate_totals()
通过添加到购物车进程调用一次,然后通过WooCommerce订阅插件再次调用,从会话中获取购物车。你有这个插件吗?
那说我不认为调用calculate_totals()
确实是个问题。真正的问题是$this->cart_contents_count
应该重置。我通过将此代码添加到functions.php
来解决这个问题。
function reset_quantities( $cart )
{
$cart->cart_contents_count = 0;
}
add_action( 'woocommerce_before_calculate_totals', 'reset_quantities' );
编辑:实际上这对我不起作用。原因是WooCommerce Subscriptions插件通过'woocommerce_before_calculate_totals'操作调用calculate_totals()
。这可以防止同一动作的其他功能被触发。在这张票上提到了这一点。 https://core.trac.wordpress.org/ticket/17817
试试这个
function reset_quantities( $cart_object )
{
$cart = $cart_object->get_cart();
$cart_object->cart_contents_count = 0;
foreach ( $cart as $cart_item_key => $values ) {
$cart_object->cart_contents_count += $values['quantity'];
}
}
add_action( 'woocommerce_after_calculate_totals', 'reset_quantities', 10, 1 );
EDIT2 我刚刚查看了Github上最新的WooCommerce提交,calculate_totals()
已经发生了很大变化。您可能想尝试下载它以查看它是否能解决您的问题。