скидка - число в %

PHOTO EMBED

Thu Aug 04 2022 12:49:14 GMT+0000 (Coordinated Universal Time)

Saved by @mastaklance

/**
 * Show sale price in percentage
 */

function my_product_block( $html, $data, $product ) {
    $html = '<li class="wc-block-grid__product">
        <div class="image-wrap">
            <a href="' . $data->permalink . '" class="wc-block-grid__product-link">' . $data->image . '</a>
        </div>
        <h3><a href="' . $data->permalink . '">' . $data->title . '</a></h3>
        ' . $data->badge . '
        ' . $data->price . '
        ' . $data->rating . '
        <a href="' . $data->permalink . '" class="button addtocartbutton">View Product</a>        
    </li>';
    return $html;
}
add_filter( 'woocommerce_blocks_product_grid_item_html', 'my_product_block', 10, 3);







// Display the Woocommerce Discount Percentage on the Sale Badge for variable products and single products
add_filter( 'woocommerce_sale_flash', 'display_percentage_on_sale_badge', 20, 3 );
function display_percentage_on_sale_badge( $html, $post, $product ) {

  if( $product->is_type('variable')){
      $percentages = array();

      // This will get all the variation prices and loop throughout them
      $prices = $product->get_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 ) );
          }
      }
      // Displays maximum discount value
      $percentage = max($percentages) . '%';

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

       // This will get all the variation prices and loop throughout them
      $children_ids = $product->get_children();

      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));
          }
      }
     // Displays maximum discount 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__( 'up to -', 'woocommerce' ) . ' '. $percentage . '</span>'; // If needed then change or remove "up to -" text
}




// v2 - new option

add_filter( 'woocommerce_sale_flash', 'ds_replace_sale_text' );

function ds_replace_sale_text($text) {
    global $product;

    // Get product stock status and type
    $stock = $product->get_stock_status();
    $product_type = $product->get_type();

    // Initialize sale price and regular price
    $sale_price = 0;
    $regular_price = 0;

    // Variable products
    if ($product_type == 'variable') {
        $product_variations = $product->get_available_variations();
        foreach ($product_variations as $variation) {
            if ($variation['display_price'] < $variation['display_regular_price']) {
                $sale_price = $variation['display_price'];
                $regular_price = $variation['display_regular_price'];
                break; // Stop loop after finding the first sale price
            }
        }

        // Calculate discount percentage
        if ($regular_price > $sale_price && $stock != 'outofstock') {
            $product_sale = intval(((intval($regular_price) - floatval($sale_price)) / floatval($regular_price)) * 100);
            if ($product_sale > 5) {
                return '<span class="onsale"> <span class="sale-icon" aria-hidden="true" data-icon="&#xe0da"></span> Supersale ' . esc_html($product_sale) . '% OFF</span>';
            } else {
                return '<span class="onsale"> <span class="sale-icon" aria-hidden="true" data-icon="&#xe0da"></span>Sale!</span>';
            }
        } else {
            return '';
        }
    }
    // Simple products
    else {
        $regular_price = get_post_meta(get_the_ID(), '_regular_price', true);
        $sale_price = get_post_meta(get_the_ID(), '_sale_price', true);

        // Calculate discount percentage
        if ($regular_price > 5) {
            $product_sale = intval(((floatval($regular_price) - floatval($sale_price)) / floatval($regular_price)) * 100);
            return '<span class="onsale"> <span class="sale-icon" aria-hidden="true" data-icon="&#xe0da"></span> Supersale ' . esc_html($product_sale) . '% OFF</span>';
        } elseif ($regular_price >= 0 && $regular_price <= 5) {
            $product_sale = intval(((floatval($regular_price) - floatval($sale_price)) / floatval($regular_price)) * 100);
            return '<span class="onsale"> <span class="sale-icon" aria-hidden="true" data-icon="&#xe0da"></span>Sale!</span>';
        } else {
            return '';
        }
    }
}
content_copyCOPY

2ой блок для вариативного товара

https://wpsimplehacks.com/how-to-display-the-discount-percentage-on-the-sale-badge/