Shop pages
/**
* Adds sale text to shop pages.
*
* @see https://wpcodebook.com/woocommerce-add-custom-message-on-sale-products/#shop-pages
* @see https://github.com/woocommerce/woocommerce/blob/8.0.2/plugins/woocommerce/templates/content-product.php#L65
*
* Hook: woocommerce_after_shop_loop_item.
*
* @hooked woocommerce_template_loop_product_link_close - 5
* @hooked woocommerce_template_loop_add_to_cart - 10
*/
add_action( 'woocommerce_after_shop_loop_item', function () {
global $product;
if ( $product->is_on_sale() ) {
echo '<p>' . esc_html__( 'Sale!' ) . '</p>';
}
}, 11 );
Single product pages
/**
* Adds sale text to single product pages.
*
* @see https://wpcodebook.com/woocommerce-add-custom-message-on-sale-products/#single-product-pages
* @see https://github.com/woocommerce/woocommerce/blob/8.0.2/plugins/woocommerce/templates/content-single-product.php#L60
*
* Hook: woocommerce_single_product_summary.
*
* @hooked woocommerce_template_single_title - 5
* @hooked woocommerce_template_single_rating - 10
* @hooked woocommerce_template_single_price - 10
* @hooked woocommerce_template_single_excerpt - 20
* @hooked woocommerce_template_single_add_to_cart - 30
* @hooked woocommerce_template_single_meta - 40
* @hooked woocommerce_template_single_sharing - 50
* @hooked WC_Structured_Data::generate_product_data() - 60
*/
add_action( 'woocommerce_single_product_summary', function () {
global $product;
if ( $product->is_on_sale() ) {
echo '<p>' . esc_html__( 'Sale!' ) . '</p>';
}
}, 31 );