Set a specific product price conditionally on Woocommerce single product page & cart

前端 未结 2 707
挽巷
挽巷 2021-01-07 04:49

In Woocommerce I would like to alter the price of a specific product (in this case with an ID of 87) on both the single product page and for related cart items.

The

2条回答
  •  囚心锁ツ
    2021-01-07 05:21

    Update 3 (Only for a defined product ID)

    To make it work as you want to change the simple products prices only on single product pages (without altering archives product prices, related product prices, upsells and cross-sells) if any cart item doesn't belong to a specific product category.

    Then you will need all this following code:

    // Change displayed price on single product pages
    add_action( 'woocommerce_single_product_summary', 'change_simple_product_price_html', 9 );
    function change_simple_product_price_html() {
        global $product;
    
        // Only for product ID 87
        if( $product->get_id() != 87 ) return;
    
        // HERE set your product category term ID, slug or name
        $product_category = 't-shirts';
    
        // 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; // Product category found ==> We EXIT from this function
        }
    
        remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
        add_action( 'woocommerce_single_product_summary', 'custom_simple_product_price_html', 10 );
    }
    
    function custom_simple_product_price_html(){
        global $product;
    
        $addp = 10; // Here the price additional amount
    
        if ( '' !== $product->get_price() && ! $product->is_on_sale() ) {
            $price = wc_price( wc_get_price_to_display( $product ) + $addp ) . $product->get_price_suffix();
        }
        echo '

    ' . apply_filters( 'woocommerce_get_price_html', $price, $product ) . '

    '; } // Add custom calculated price to cart item data 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( $product_id != 87 ) return $cart_item_data; $product = wc_get_product($product_id); // The WC_Product Object // Only if product is not on sale if( $product->is_on_sale() ) return $cart_item_data; $price = (float) $product->get_price(); // Set the custom amount in cart object $cart_item_data['new_price'] = $price + 10; return $cart_item_data; } // Set custom calculated price to cart 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 = 't-shirts'; // 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'] ); } }

    Code goes in function.php file of your active child theme (or active theme). Tested and works.

提交回复
热议问题