Customize sale badge for woocommerce and discount rule

Customize sale badges for WooCommerce and discount rules.

add_filter('advanced_woo_discount_rules_use_sale_badge_customization', '__return_true');

add_filter('advanced_woo_discount_rules_on_sale_badge_html', function($html, $post, $product) {

    $discounted_price = apply_filters('advanced_woo_discount_rules_get_product_discount_price_from_custom_price', false, $product, 1, 0, 'discounted_price', true, false);
    if($discounted_price === false) {
        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 - ( floatval($prices['sale_price'][$key]) / floatval($prices['regular_price'][$key]) * 100 ) );
                }
            }
// We keep the highest value
            $percentage = max($percentages) . '%';

        } elseif( $product->is_type('grouped') ){
            $percentages = array();

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

// Loop through variation prices
            foreach( $children_ids as $child_id ){
                $child_product = wc_get_product($child_id);

                $regular_price = (float) $child_product->get_regular_price();
                $sale_price = (float) $child_product->get_sale_price();

                if ( $sale_price != 0 || ! empty($sale_price) ) {
// Calculate and set in the array the percentage for each child on sale
                    $percentages[] = round(100 - ($sale_price / $regular_price * 100));
                }
            }
// We keep the highest value
            $percentage = max($percentages) . '%';

        } else {
            $regular_price = (float) $product->get_regular_price();
            $sale_price = (float) $product->get_sale_price();

            if ( $sale_price != 0 || ! empty($sale_price) ) {
                $percentage = round(100 - ($sale_price / $regular_price * 100)) . '%';
            } else {
                return $html;
            }
        }


        return '<span class="onsale">' . esc_html__( '-', 'woocommerce' ) . $percentage . '</span>';
    }
    return $html;
}, 100, 3);