代码之家  ›  专栏  ›  技术社区  ›  Rose Thorn

有条件地更改Woomerce中的特定产品价格

  •  2
  • Rose Thorn  · 技术社区  · 6 年前

    我想在Woocomerce中修改一个特定的产品,在原来的基础上添加10美元的程序, 除了那些情况 :

    • 在特定的产品页面上,可预订出租产品(WooCommerce预订),属于特定类别“C”。
    • 如果任何购物车项目属于“C”类。

    我在用 this answer code to one of my questions 直到现在。但是我需要在任何地方显示这个特定的产品变更价格,除了在前端的可预订产品页面上。

    我还有这个代码,它显示了标题旁边的强制销售价格。这仍应在“强制销售”部分的可预订产品页面上显示具体的产品原始价格:

    function wc_forcesells_product_price( $name, $product ) {
        // Only in single product pages
        if( ! is_product() ) return $name;
    
        // The product name + the product formatted price
        return $name . ' (' . wc_price( wc_get_price_to_display( $product ) ) . ')';
    }
    add_filter( 'woocommerce_product_title', 'wc_forcesells_product_price', 20, 2 );
    

    以上参考: Add price beside Woocommerce Force Sells .

    1 回复  |  直到 6 年前
        1
  •  1
  •   LoicTheAztec    6 年前

    必要时更新以处理多个产品ID

    请尝试以下操作,该操作将在任何地方为特定产品ID显示自定义价格 除了 :

    • 关于预订要租用的产品页面
    • 当产品类别在购物车中时

    此代码还将更改购物车项目中的此自定义产品价格 除了 当特定产品类别在购物车项目中时。

    您必须在这些函数中设置:

    • 此特定产品ID
    • 要雇用的预订产品ID
    • 附加价格金额
    • 产品类别(ID段塞或名称)

    代码:

    // Change product ID 87 price everywhere on front end EXCEPT:
    // - On booking products to hire pages
    // - When a product category is in cart
    add_filter( 'woocommerce_get_price_html', 'product_id_87_displayed_price', 10, 2 );
    function product_id_87_displayed_price( $price_html, $product ) {
        // Only for product ID 87
        if( in_array( $product->get_id(), array( 87, 2799 ) ) ){ 
            return $price_html; // Exit
    
        // HERE set booking products IDs to hire in the array
        $product_ids_to_hire = array( 53, 738 );
    
        // HERE set your product category term ID, slug or name
        $product_category = 'hoodies';
    
        // HERE set the price additional amount
        $addp = 10;
    
        // EXCEPT on booking products to hire pages
        if( is_single($product_ids_to_hire) ) return $price_html; // Exit
    
        // Checking for the product category in cart items loop
        foreach ( WC()->cart->get_cart() as $cart_item ) {
            if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) )
                 return $price_html; // Product category found ==> Exit
        }
    
        if ( '' !== $product->get_price() && ! $product->is_on_sale() ) {
            $price_html = wc_price( wc_get_price_to_display( $product ) + $addp ) . $product->get_price_suffix();
        }
        return $price_html;
    }
    
    // Add custom calculated price to cart item data for product ID 87
    add_filter( 'woocommerce_add_cart_item_data', 'add_cart_simple_product_custom_price', 20, 2 );
    function add_cart_simple_product_custom_price( $cart_item_data, $product_id ){
        // Only for product ID 87
        if( ! in_array( $product->get_id(), array( 87 ) ) ) 
            return $cart_item_data; // Exit
    
        // HERE set the price additional amount
        $addp = 10;
    
        $product = wc_get_product($product_id); // The WC_Product Object
        $price   = (float) $product->get_price(); // The product price
    
        // Set the custom amount in cart object
        $cart_item_data['new_price'] = $price + $addp;
    
        return $cart_item_data;
    }
    
    // Set custom calculated price to cart for product ID 87
    add_action( 'woocommerce_before_calculate_totals', 'set_cart_simple_product_custom_price', 20, 1 );
    function set_cart_simple_product_custom_price( $cart ) {
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
    
        if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
            return;
    
        // HERE set your product category term ID, slug or name
        $product_category = 'hoodies';
    
        // 1st cart items Loop: checking for the product category
        foreach ( $cart->get_cart() as $cart_item ) {
            if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) )
                return; // Product category found ==> We EXIT from this function
        }
    
        // 2nd Loop: Changing cart item prices (Product category not found)
        foreach ( $cart->get_cart() as $cart_item ) {
            if( isset($cart_item['new_price']))
                $cart_item['data']->set_price( $cart_item['new_price'] );
        }
    }
    

    代码位于活动子主题(或活动主题)的function.php文件中。测试和工作。

    它也应该和你的 wc_forcesells_product_price() 功能。