Search code examples
phpwordpresswoocommercehook-woocommerce

Display Sale Price Before Regular Price (WooCommerce)


I'd like to display the sale price of a product before the regular (discounted) price. I know this has something to do with get_price_html. By default, this outputs something like:

<del>regular price</del>
<ins>sale price</ins>

I want to change the output so it looks like this (basically, the two prices are shown in a different order):

<ins>sale price</ins>
<del>regular price</del>

How can I do this?


Solution

  • Yes you have to alter get_price_html method which can be done by using following hook's:

    1. For Simple Product: woocommerce_get_price_html hook.
    2. For Variable Product: woocommerce_variation_sale_price_html & woocommerce_variation_price_html
    3. For Variable Product Min Max Price: woocommerce_variable_sale_price_html & woocommerce_variable_price_html

    UPDATED 16th Feb 2018

    Here is the code:

    For WooCommerce version 2.6.x or below

    if (!function_exists('my_commonPriceHtml')) {
    
        function my_commonPriceHtml($price_amt, $regular_price, $sale_price) {
            $html_price = '<p class="price">';
            //if product is in sale
            if (($price_amt == $sale_price) && ($sale_price != 0)) {
                $html_price .= '<ins>' . woocommerce_price($sale_price) . '</ins>';
                $html_price .= '<del>' . woocommerce_price($regular_price) . '</del>';
            }
            //in sale but free
            else if (($price_amt == $sale_price) && ($sale_price == 0)) {
                $html_price .= '<ins>Free!</ins>';
                $html_price .= '<del>' . woocommerce_price($regular_price) . '</del>';
            }
            //not is sale
            else if (($price_amt == $regular_price) && ($regular_price != 0)) {
                $html_price .= '<ins>' . woocommerce_price($regular_price) . '</ins>';
            }
            //for free product
            else if (($price_amt == $regular_price) && ($regular_price == 0)) {
                $html_price .= '<ins>Free!</ins>';
            }
            $html_price .= '</p>';
            return $html_price;
        }
    
    }
    
    add_filter('woocommerce_get_price_html', 'my_simple_product_price_html', 100, 2);
    
    function my_simple_product_price_html($price, $product) {
        if ($product->is_type('simple')) {
            $regular_price = $product->regular_price;
            $sale_price = $product->sale_price;
            $price_amt = $product->price;
            return my_commonPriceHtml($price_amt, $regular_price, $sale_price);
        } else {
            return $price;
        }
    }
    
    add_filter('woocommerce_variation_sale_price_html', 'my_variable_product_price_html', 10, 2);
    add_filter('woocommerce_variation_price_html', 'my_variable_product_price_html', 10, 2);
    
    function my_variable_product_price_html($price, $variation) {
        $variation_id = $variation->variation_id;
        //creating the product object
        $variable_product = new WC_Product($variation_id);
    
        $regular_price = $variable_product->regular_price;
        $sale_price = $variable_product->sale_price;
        $price_amt = $variable_product->price;
    
        return my_commonPriceHtml($price_amt, $regular_price, $sale_price);
    }
    
    add_filter('woocommerce_variable_sale_price_html', 'my_variable_product_minmax_price_html', 10, 2);
    add_filter('woocommerce_variable_price_html', 'my_variable_product_minmax_price_html', 10, 2);
    
    function my_variable_product_minmax_price_html($price, $product) {
        $variation_min_price = $product->get_variation_price('min', true);
        $variation_max_price = $product->get_variation_price('max', true);
        $variation_min_regular_price = $product->get_variation_regular_price('min', true);
        $variation_max_regular_price = $product->get_variation_regular_price('max', true);
    
        if (($variation_min_price == $variation_min_regular_price) && ($variation_max_price == $variation_max_regular_price)) {
            $html_min_max_price = $price;
        } else {
            $html_price = '<p class="price">';
            $html_price .= '<ins>' . woocommerce_price($variation_min_price) . '-' . woocommerce_price($variation_max_price) . '</ins>';
            $html_price .= '<del>' . woocommerce_price($variation_min_regular_price) . '-' . woocommerce_price($variation_max_regular_price) . '</del>';
            $html_min_max_price = $html_price;
        }
    
        return $html_min_max_price;
    }
    

    For WooCommerce version 3.0 or above

    if (!function_exists('my_commonPriceHtml')) {
    
        function my_commonPriceHtml($price_amt, $regular_price, $sale_price) {
            $html_price = '<p class="price">';
            //if product is in sale
            if (($price_amt == $sale_price) && ($sale_price != 0)) {
                $html_price .= '<ins>' . wc_price($sale_price) . '</ins>';
                $html_price .= '<del>' . wc_price($regular_price) . '</del>';
            }
            //in sale but free
            else if (($price_amt == $sale_price) && ($sale_price == 0)) {
                $html_price .= '<ins>Free!</ins>';
                $html_price .= '<del>' . wc_price($regular_price) . '</del>';
            }
            //not is sale
            else if (($price_amt == $regular_price) && ($regular_price != 0)) {
                $html_price .= '<ins>' . wc_price($regular_price) . '</ins>';
            }
            //for free product
            else if (($price_amt == $regular_price) && ($regular_price == 0)) {
                $html_price .= '<ins>Free!</ins>';
            }
            $html_price .= '</p>';
            return $html_price;
        }
    
    }
    
    add_filter('woocommerce_get_price_html', 'my_simple_product_price_html', 100, 2);
    
    function my_simple_product_price_html($price, $product) {
        if ($product->is_type('simple')) {
            $regular_price = $product->get_regular_price();
            $sale_price = $product->get_sale_price();
            $price_amt = $product->get_price();
            return my_commonPriceHtml($price_amt, $regular_price, $sale_price);
        } else {
            return $price;
        }
    }
    
    add_filter('woocommerce_variation_sale_price_html', 'my_variable_product_price_html', 10, 2);
    add_filter('woocommerce_variation_price_html', 'my_variable_product_price_html', 10, 2);
    
    function my_variable_product_price_html($price, $variation) {
        $variation_id = $variation->variation_id;
        //creating the product object
        $variable_product = new WC_Product($variation_id);
    
        $regular_price = $variable_product->get_regular_price();
        $sale_price = $variable_product->get_sale_price();
        $price_amt = $variable_product->get_price();
    
        return my_commonPriceHtml($price_amt, $regular_price, $sale_price);
    }
    
    add_filter('woocommerce_variable_sale_price_html', 'my_variable_product_minmax_price_html', 10, 2);
    add_filter('woocommerce_variable_price_html', 'my_variable_product_minmax_price_html', 10, 2);
    
    function my_variable_product_minmax_price_html($price, $product) {
        $variation_min_price = $product->get_variation_price('min', true);
        $variation_max_price = $product->get_variation_price('max', true);
        $variation_min_regular_price = $product->get_variation_regular_price('min', true);
        $variation_max_regular_price = $product->get_variation_regular_price('max', true);
    
        if (($variation_min_price == $variation_min_regular_price) && ($variation_max_price == $variation_max_regular_price)) {
            $html_min_max_price = $price;
        } else {
            $html_price = '<p class="price">';
            $html_price .= '<ins>' . wc_price($variation_min_price) . '-' . wc_price($variation_max_price) . '</ins>';
            $html_price .= '<del>' . wc_price($variation_min_regular_price) . '-' . wc_price($variation_max_regular_price) . '</del>';
            $html_min_max_price = $html_price;
        }
    
        return $html_min_max_price;
    }
    

    Code goes in functions.php file of your active child theme (or theme). Or also in any plugin php files.
    Code is tested and works.

    Hope this helps!