Search code examples
phpwordpresswoocommerceproduct

Add prefix to displayed price in WooCommerce depending on the page and if it's on sale


My question is related to Add a custom text before the price display in WooCommerce answer.

  1. I would like the text 'TEXT' to be displayed only when the product has a discount, and if the product does not have a discount, another text should be displayed(Or by default, no text should be displayed before the price).
  2. I have Related Products on the product page, and I don't want these texts to be displayed in this section, and I only want them to be displayed on the product page (single product).
  3. How can I manage the display of this text in different sections? (For example, one text should be displayed on the Single Product page, another text should be displayed on the Shop page, another text should be displayed on the archive page, in the search list, and so on in other sections)

I used the following code:

add_filter( 'woocommerce_get_price_html', 'cw_change_product_price_display' );
add_filter( 'woocommerce_cart_item_price', 'cw_change_product_price_display' );
function cw_change_product_price_display( $price ) { 
    if ( is_product() && $product->is_on_sale() ){ 
    // Your additional text in a translatable string 
        $text = __('TEXT'); // returning the text before the price return 
        $text. ' ' . $price; 
    } 
    return $price; 
}

But it doesn't give me what I would like.


Solution

  • The following, will add a different string prefix to the displayed price depending if the product is on sale or not and depending and depending on the page type (single product, shop, archives, cart and checkout):

    add_filter( 'woocommerce_get_price_html', 'add_string_prefix_to_price_html', 10, 2 );
    function add_string_prefix_to_price_html( $price_html, $product ) { 
        global $woocommerce_loop;
    
        // Not on related products
        if ( isset($woocommerce_loop['name']) && $woocommerce_loop['name'] === 'related' ) {
            return $price_html; 
        }
    
        $prefix = ''; // Initializing
    
        // Set the text by section type
        if ( is_shop() ) {
            if ( $product->is_on_sale() ){ 
                $prefix = __('ON SALE SHOP', 'woocommerce') . ' ';
            } else {
                $prefix = __('NORMAL SHOP', 'woocommerce') . ' '; // optional
            }
        } elseif( is_tax() ) {
            if ( $product->is_on_sale() ){ 
                $prefix = __('ON SALE ARCHIVES', 'woocommerce') . ' ';
            } else {
                $prefix = __('NORMAL ARCHIVES', 'woocommerce') . ' '; // optional
            }
        } elseif( is_product() ) {
            if ( $product->is_on_sale() ){ 
                $prefix = __('ON SALE PRODUCT', 'woocommerce') . ' ';
            } else {
                $prefix = __('NORMAL PRODUCT', 'woocommerce') . ' '; // optional
            }
        } else {
            if ( $product->is_on_sale() ){ 
                $prefix = __('ON SALE OTHERS', 'woocommerce') . ' ';
            } else {
                $prefix = __('NORMAL OTHERS', 'woocommerce') . ' '; // optional
            }
        }
        return $prefix . $price_html; 
    }
    
    // For cart (optional)
    add_filter( 'woocommerce_cart_item_price', 'add_string_prefix_to_cart_item_price_html', 10, 2 ); 
    function add_string_prefix_to_cart_item_price_html( $price_html, $cart_item ) {
        $prefix = ''; // Initializing
        
        if ( $cart_item['data']->is_on_sale() ){ 
            $prefix = __('ON SALE CART', 'woocommerce') . ' ';
        } else {
            $prefix = __('NORMAL CART', 'woocommerce') . ' '; // optional
        }
        return $prefix . $price_html;
    }
    
    // For checkout (optional)
    add_filter( 'woocommerce_cart_item_subtotal', 'add_string_prefix_to_checkout_item_subtotal_html', 10, 2 );
    function add_string_prefix_to_checkout_item_subtotal_html( $subtotal_html, $cart_item ) {
        $prefix = ''; // Initializing
    
        if( is_checkout() ) {
            if ( $cart_item['data']->is_on_sale() ){ 
                $prefix = __('ON SALE CHECKOUT', 'woocommerce') . ' ';
            } else {
                $prefix = __('NORMAL CHECKOUT', 'woocommerce') . ' '; // optional
            }
        }
        return $prefix . $subtotal_html;
    }
    

    Code goes in functions.php file of your child theme (or in a plugin). Tested and works.