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

前端 未结 2 708
挽巷
挽巷 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:15

    If you want to make it work to change the products price on single produt page. Please follow this code there I have added my product ID "99":

    add_action( 'woocommerce_single_product_summary', 'e_coding_change_simple_product_price_html', 9 );
    function e_coding_change_simple_product_price_html() {
        global $product;
    
    // Only for product ID 99
    if( $product->get_id() != 99 ) return;
    
    // HERE set your product category term ID, slug or name
    $product_category = 'my-book';
    
    // 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 '<p class="price">' . apply_filters( 'woocommerce_get_price_html', $price, $product ) .'</p>';
    }
    
    // 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 != 99 )
        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;
    }
    
    
    function cw_change_product_price_display( $price ) {
    
        $price .= ' At Each Item Product';
        return $price;
    
    }
    
    add_filter( 'woocommerce_get_price_html', 'cw_change_product_price_display' );
    add_filter( 'woocommerce_cart_item_price', 'cw_change_product_price_display' );
    
    0 讨论(0)
  • 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 '<p class="price">' . apply_filters( 'woocommerce_get_price_html', $price, $product ) . '</p>';
    }
    
    // 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.

    0 讨论(0)
提交回复
热议问题