My question is related to Add a custom text before the price display in WooCommerce answer.
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.
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.