代码之家  ›  专栏  ›  技术社区  ›  Tsakov

当特定产品ID位于购物车中时,设置Woocommerce产品类别项目价格

  •  2
  • Tsakov  · 技术社区  · 7 年前

    我正在努力实现以下目标:

    • 一位客户将产品1(来自分类簿)添加到购物车中,价格为10美元。
    • 然后他添加到购物车产品2。

    如果产品2在购物车中,如何使产品1=0美元,以及从分类帐簿中添加的所有产品=0美元?

    我的想法是,如果客户购买某一产品,这将免费提供某一产品类别的所有产品。

    到目前为止,我得到了这个,但它不起作用,正在使购物车中的所有产品 $0 :

    add_action( 'woocommerce_before_calculate_totals', 'change_price_if_6245_in_cart' );
    function change_price_if_6245_in_cart( $cart_object ) {
            if (woo_in_cartbooks (6245) ) {
        // set our flag to be false until we find a product in that category
        $cat_check = false;
    
        // check each cart item for our category
        foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
    
            $product = $cart_item['data'];
    
            // replace 'books' with your category's slug
            if ( has_term( 'books', 'product_cat', $product->id ) ) {
                $cat_check = true;
                // break because we only need one "true" to matter here
                break;
            }
        }
    
        // if a product in the cart is in our category, do something
        if ( $cat_check  ) {
            // we have the category, do what we want
            foreach ( $cart_object->get_cart() as $hash => $value ) {
                $value['data']->set_price( 0 );
            }
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   LoicTheAztec    6 年前

    以下是使其工作的正确方法(代码已注释):

    add_action( 'woocommerce_before_calculate_totals', 'free_product_category_for_a_specific_product', 20, 1 );
    function free_product_category_for_a_specific_product( $cart ) {
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
    
        if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
            return;
    
        // HERE Below your settings
        $product_category = "books"; // <= The product category (can be an ID, a slug or a name)
        $specific_product_id = 6245; // <= The specific product ID
    
        $found = false;
    
        // 1st cart items Loop: Check for specific product
        foreach ( $cart->get_cart() as $cart_item ) {
            // Check for 'books' with your category's slug
            if ( $cart_item['data']->get_id() == $specific_product_id ) {
                $found = true;
                break; // Found, we stop first loop
            }
        }
        // If specific product is not in cart we exit
        if( ! $found ) 
            return;
    
        // 2nd cart items Loop: check items remaining to "Books" product category when specific product is in cart
        foreach ( $cart->get_cart() as $cart_item ) {
            // If specific product has been found, we set price to 0 for items remaining to "Books" product category
            if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) ) {
                $cart_item['data']->set_price( 0 );
            }
        }
    }
    

    代码进入功能。活动子主题(或活动主题)的php文件。已测试并正常工作。