如何为“woocommerce_add_to_cart”添加过滤器或挂钩

时间:2015-02-06 11:43:59

标签: php wordpress filter woocommerce hook

enter image description here

我想同时添加到购物车两个产品,一个是原始(当前)产品,第二个是从下拉列表中

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函数运行了很多次。 我应该怎么做或如何添加过滤器,并将第二个下拉产品作为参数添加到购物车功能?所以我也可以在购物车中添加这个产品。

enter image description here

4 个答案:

答案 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']);
    }
}