自定义Woocommerce购物车添加有错误的项目计数

时间:2015-12-07 16:55:22

标签: php wordpress woocommerce cart

在我提交自定义添加到购物车表单后,我尝试使用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没有重置为零,所以数量增加两倍。 (当我重新加载页面时,购物车显示正确的项目数量)

使用自定义表单添加产品的正确方法是什么?我找不到任何这方面的例子。我使用了错误的动作吗?

1 个答案:

答案 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()已经发生了很大变化。您可能想尝试下载它以查看它是否能解决您的问题。