我想同时添加到购物车两个产品,一个是原始(当前)产品,第二个是从下拉列表中
add_action('woocommerce_add_to_cart', 'custome_add_to_cart');
$cnt=2
function custome_add_to_cart() {
global $woocommerce;
$cnt = $cnt + 1;
echo $cnt."X";
echo $p_id=$_POST['assessories'];
$woocommerce->cart->add_to_cart($p_id, 1);
}
输出: - 正如您在下面的输出图像中看到的,它在购物车中多次添加相同的下拉项目,但我只想将1个数量添加到购物车。似乎add_to_cart函数运行了很多次。 我应该怎么做或如何添加过滤器,并将第二个下拉产品作为参数添加到购物车功能?所以我也可以在购物车中添加这个产品。
答案 0 :(得分:9)
这应该有效:
add_action('woocommerce_add_to_cart', 'custome_add_to_cart');
function custome_add_to_cart() {
global $woocommerce;
$product_id = $_POST['assessories'];
$found = false;
//check if product already in cart
if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
$_product = $values['data'];
if ( $_product->id == $product_id )
$found = true;
}
// if product not found, add it
if ( ! $found )
WC()->cart->add_to_cart( $product_id );
} else {
// if no products in cart, add it
WC()->cart->add_to_cart( $product_id );
}
}
基于以下来源:https://docs.woothemes.com/document/automatically-add-product-to-cart-on-visit/
答案 1 :(得分:7)
woocommerce" add_to_cart"函数运行钩子" woocommerce_add_to_cart"。所以,在你的代码" add_to_cart"正在运行" woocommerce_add_to_cart"它运行你的代码,运行" add_to_cart",etcetera etcetera ......你创建了一个递归循环。
您需要找到替代方法,或停止在自己的代码中调用$woocommerce->cart->add_to_cart($p_id, 1);
。
答案 2 :(得分:0)
您可能正在寻找具有某些属性的可变产品!
无论如何,如果您真的想这样做,则只需要remove_action函数:
add_action('woocommerce_add_to_cart', 'custome_add_to_cart');
function custome_add_to_cart() {
$p_id=$_POST['assessories'];
remove_action('woocommerce_add_to_cart', __FUNCTION__);
WC()->cart->add_to_cart( $p_id );
}
这可以防止操作无限循环,这非常简单。因此,该产品仅添加一次。您可能想获取添加到购物车的数量,并将其作为第二个参数提供给WC()->cart->add_to_cart
函数,以便它们都是相同的数量
__FUNCTION__
是一个神奇的PHP标记,只是为您提供当前功能的名称作为字符串,例如,如果函数名称不同,它将仍然有效
答案 3 :(得分:-1)
这可能是旧的,但您是否尝试在添加到购物车后取消设置评估参数?这会打破循环。
function custome_add_to_cart() {
global $woocommerce;
if(isset($_POST['assessories'])){
$cnt = $cnt + 1;
echo $cnt . "X";
echo $p_id = $_POST['assessories'];
$woocommerce->cart->add_to_cart($p_id, 1);
unset($_POST['assessories']);
}
}