phpwordpresswoocommerceproductproduct-variations

Display the default variation price and savings amount on Woocommerce 3


I need to display default variation price & with regular price & savings amount on my Woocommerce Homepage & Category Page

I found following code on this links answer Display lowest variation price and discounted percentage in WooCommerce

add_filter( 'woocommerce_get_price_html', 'custom_price_format', 10, 2 );
add_filter( 'woocommerce_variable_price_html', 'custom_price_format', 10, 2 );
function custom_price_format( $price, $product ) {

    // Main Price
    $regular_price = $product->is_type('variable') ? $product->get_variation_regular_price( 'min', true ) : $product->get_regular_price();
    $sale_price = $product->is_type('variable') ? $product->get_variation_sale_price( 'min', true ) : $product->get_sale_price();


    if ( $regular_price !== $sale_price && $product->is_on_sale()) {
    // Percentage calculation and text
    $percentage = round( ( $regular_price - $sale_price ) / $regular_price * 100 ).'%';
    $percentage_txt = __(' Save', 'woocommerce' ).' '.$percentage;

    $price = '<del>' . wc_price($regular_price) . '</del> <ins>' . wc_price($sale_price) . $percentage_txt . '</ins>';
    }
    return $price;
}

Now this code works perfectly on my site but this code shows price for 'Lowest' variation and savings in percentage where I need to show the price for 'Default' variation & Actual saving amount.


Solution

  • Try the following, where we search first for variable products, the default variation prices.

    add_filter( 'woocommerce_get_price_html', 'custom_price_format', 10, 2 );
    add_filter( 'woocommerce_variable_price_html', 'custom_price_format', 10, 2 );
    function custom_price_format( $price, $product ) {
    
        // 1. Variable products
        if( $product->is_type('variable') ){
    
            // Searching for the default variation
            $default_attributes = $product->get_default_attributes();
            // Loop through available variations
            foreach($product->get_available_variations() as $variation){
                $found = true; // Initializing
                // Loop through variation attributes
                foreach( $variation['attributes'] as $key => $value ){
                    $taxonomy = str_replace( 'attribute_', '', $key );
                    // Searching for a matching variation as default
                    if( isset($default_attributes[$taxonomy]) && $default_attributes[$taxonomy] != $value ){
                        $found = false;
                        break;
                    }
                }
                // When it's found we set it and we stop the main loop
                if( $found ) {
                    $default_variaton = $variation;
                    break;
                } // If not we continue
                else {
                    continue;
                }
            }
            // Get the default variation prices or if not set the variable product min prices
            $regular_price = isset($default_variaton) ? $default_variaton['display_price']: $product->get_variation_regular_price( 'min', true );
            $sale_price = isset($default_variaton) ? $default_variaton['display_regular_price']: $product->get_variation_sale_price( 'min', true );
        }
        // 2. Other products types
        else {
            $regular_price = $product->get_regular_price();
            $sale_price    = $product->get_sale_price();
        }
    
        // Formatting the price
        if ( $regular_price !== $sale_price && $product->is_on_sale()) {
            // Percentage calculation and text
            $percentage = round( ( $regular_price - $sale_price ) / $regular_price * 100 ).'%';
            $percentage_txt = __(' Save', 'woocommerce' ).' '.$percentage;
    
            $price = '<del>' . wc_price($regular_price) . '</del> <ins>' . wc_price($sale_price) . $percentage_txt . '</ins>';
        }
        return $price;
    }
    

    Code goes in function.php file of your active child theme (or active theme). Tested and works.

    Now this code will never get the selected variation price as it's a live event on client browser that is much more complicated to handle (Php and Jquery will be needed in this case).

    Related linked answer: Display lowest variation price and discounted percentage in WooCommerce