Support » Plugin: WooCommerce » Show % Discount on Sales Badge

  • Resolved grunauer

    (@grunauer)


    Please, I need help I don’t know what to do as I don’t know to code things.

    I want the sales badge to show the discount rate of a product which price is below the base price for example:

    Instead of saying ” save 12 dollars” make it say “40% off” and let the site itself calculate the discount rate by itself every time the price of a product is changed

    Please help me, cause I don’t know how to do it for free with codes.

    The page I need help with: [log in to see the link]

Viewing 15 replies - 1 through 15 (of 17 total)
  • It appears that you have managed to achieve the result you wanted. Can I ask how you did it as I am looking to do something similar on my site?

    Plugin Support Rynald0s.a11n

    (@rynald0s)

    Automattic Happiness Engineer

    Hi @nigel52!

    You can use something like this:

    add_filter( 'woocommerce_sale_flash', 'add_percentage_to_sale_badge', 20, 3 );
    function add_percentage_to_sale_badge( $html, $post, $product ) {
        if( $product->is_type('variable')){
            $percentages = array();
    
            // Get all variation prices
            $prices = $product->get_variation_prices();
    
            // Loop through variation prices
            foreach( $prices['price'] as $key => $price ){
                // Only on sale variations
                if( $prices['regular_price'][$key] !== $price ){
                    // Calculate and set in the array the percentage for each variation on sale
                    $percentages[] = round(100 - ($prices['sale_price'][$key] / $prices['regular_price'][$key] * 100));
                }
            }
            $percentage = max($percentages) . '%';
        } else {
            $regular_price = (float) $product->get_regular_price();
            $sale_price    = (float) $product->get_sale_price();
    
            $percentage    = round(100 - ($sale_price / $regular_price * 100)) . '%';
        }
        return '<span class="onsale">' . esc_html__( 'SALE', 'woocommerce' ) . ' ' . $percentage . '</span>';
    }

    You can use a free plugin like https://wordpress.org/plugins/code-snippets/ to add the code to your site.

    Cheers!

    Plugin Support Rynald0s.a11n

    (@rynald0s)

    Automattic Happiness Engineer

    Howdy!

    We haven’t heard back from you in a while, so I’m going to go ahead and mark this thread as resolved. If you have any other questions please start a new thread.

    Cheers!

    Hi,

    I’m using this code, but it’s not working! here prajamart.com

    I have added the below code after the above code din’t work
    //showing save percentage value
    add_filter( ‘woocommerce_get_price_html’, ‘change_displayed_sale_price_html’, 10, 2 );
    function change_displayed_sale_price_html( $price, $product ) {
    // Only on sale products on frontend and excluding min/max price on variable products
    if( $product->is_on_sale() && ! is_admin() && ! $product->is_type(‘variable’)){
    // Get product prices
    $regular_price = (float) $product->get_regular_price(); // Regular price
    $sale_price = (float) $product->get_price(); // Active price (the “Sale price” when on-sale)

    // “Saving Percentage” calculation and formatting
    $precision = 1; // Max number of decimals
    $saving_percentage = round( 100 – ( $sale_price / $regular_price * 100 ), 1 ) . ‘%’;

    // Append to the formated html price
    $price .= sprintf( __(‘<p class=”saved-sale”>Save: %s</p>’, ‘woocommerce’ ), $saving_percentage );
    }
    return $price;
    }

    This displays save percentage, however how to show it for variable products as well?

    • This reply was modified 1 year, 8 months ago by stouch. Reason: added code

    Hi: the code worked great for me, thks a lot!

    Hello @rynald0s
    Thaks for your code.

    I have changed this
    $percentage = max($percentages) . '%';
    With This:
    $percentage = round(max($percentages)) . '%';
    In this case, when I used to have a rounded price, the percentage resulted in decimal form.
    Anyway, for grouped prducts I have an Error:

    SALE NAN% – Warning: Division by zero in /home/miosito.it/htdocs/wp-content/plugins/code-snippets/php/snippet-ops.php(446) : eval()’d code on line 24.

    How Can I resolve?

    • This reply was modified 1 year, 4 months ago by nikostar73.

    This works for simple products but gives me two errors for variable products. In the sale flash on the archive I get NAN% with error “A non-numeric value encountered”.

    Hi, I am very interested in the topic, but I am a newbie and I don’t know where I have to put the code. I tried the functions.php file but after trying the two codes neither works for me. Can somebody help me? Thank you

    Plugin Support Rynald0s.a11n

    (@rynald0s)

    Automattic Happiness Engineer

    Hi @saadtahir581!

    I am unable to replicate the same error on variable products. It works with the most recent core release and Storefront theme. If it isn’t working for you, there might be a conflict from your theme or another plugin, and you would need to test for conflict as per https://docs.woocommerce.com/document/how-to-test-for-conflicts/

    @castaway7

    The code still works. You can use https://wordpress.org/plugins/code-snippets/ to add the code. The correct way to add the code > http://rynaldo.com/how-to-add-custom-code-to-your-woocommerce-wordpress-site-the-right-way/

    Cheers!

    Great, now it works perfectly. I used the code snippets plugin to enter the code and everything is perfect.

    Once the code is inserted, can I deactivate or delete the code snippets plugin?

    Plugin Support Rynald0s.a11n

    (@rynald0s)

    Automattic Happiness Engineer

    Hi @castaway7!

    Once the code is inserted, can I deactivate or delete the code snippets plugin?

    No, you’ll need to keep it enabled. If you remove the plugin it will no longer work.

    Cheers!

    Hi @rynald0s How would I do the same thing for Woocommerce blocks ? I have homepage built with gutenburg and woocommerce blocks but sale percent never shows only works on Product Page and Category Pages also not shown on main Shop page loop ??

    Many thanks

    Glyn

    danielbmxd

    (@danielbmxd)

    Hi @rynald0s ,
    Is it possible to add a condition where it shows out of stock in the case of having 0 stocks of a certain product? In the case of variable products, the one that woocommerce has in simple products does not work.
    I have tried the following code, disabling the default sale flash, but I’m not sure if it is correctly set

    add_action(‘woocommerce_before_shop_loop_item_title’,’custom_before_shop_loop_item_title’, 2 );
    add_filter( ‘woocommerce_sale_flash’, ‘__return_null’ );
    add_action( ‘woocommerce_before_single_product_summary’, ‘show_product_loop_outofstock_badge’ );
    function custom_before_shop_loop_item_title(){
    remove_action(‘woocommerce_before_shop_loop_item_title’,’woocommerce_show_product_loop_sale_flash’, 10 );
    remove_action( ‘woocommerce_before_single_product_summary’, ‘woocommerce_show_product_sale_flash’, 10 );
    add_action(‘woocommerce_before_shop_loop_item_title’,’show_product_loop_outofstock_badge’, 10 );
    }

    function show_product_loop_outofstock_badge(){
    global $post, $product;
    if ( $product->get_stock_status() == ‘outofstock’ ){
    echo ‘<span class=”onsale outofstock”>’. esc_html__(‘Empty’, ‘woocommerce’) .'</span>’;}
    else{
    if( $product->is_on_sale()){
    if( $product->is_type(‘variable’)){
    $percentages = array();

    // Get all variation prices
    $prices = $product->get_variation_prices();

    // Loop through variation prices
    foreach( $prices[‘price’] as $key => $price ){
    // Only on sale variations
    if( $prices[‘regular_price’][$key] !== $price ){
    // Calculate and set in the array the percentage for each variation on sale
    $percentages[] = round(100 – ($prices[‘sale_price’][$key] / $prices[‘regular_price’][$key] * 100));
    }
    }
    $percentage = max($percentages) . ‘%’;
    } else {
    $regular_price = (float) $product->get_regular_price();
    $sale_price = (float) $product->get_sale_price();

    $percentage = round(100 – ($sale_price / $regular_price * 100)) . ‘%’;
    }
    echo ‘<span class=”onsale”>’ . esc_html__( ‘-‘, ‘woocommerce’ ) . ‘ ‘ . $percentage . ‘</span>’;
    }}
    }

    Hi
    Can anyone can tell me how to replace the text “SALE ..%” by “-..%”
    Thanks in advance 🙂

    Hi @nguyengato

    Just change the ‘SALE’ to ‘-‘ in the last line.. as below

    return ‘<span class=”onsale”>’ . esc_html__( ‘SALE’, ‘woocommerce’ ) . ‘ ‘ . $percentage . ‘</span>’;
    to
    return ‘<span class=”onsale”>’ . esc_html__( ‘-‘, ‘woocommerce’ ) . ‘ ‘ . $percentage . ‘</span>’;

    Cheers!

    • This reply was modified 9 months, 1 week ago by iglitztech.
Viewing 15 replies - 1 through 15 (of 17 total)
  • You must be logged in to reply to this topic.