Как вывести минимальную цену вариативного товара в каталоге WooCommerce

Неоднократно приходилось сталкиваться с такой задачей: на странице каталога и на страницах категорий товаров WooCommerce нужно выводить цену со скидкой и перечеркнутую старую цену вариативного товара. Ранее я использовал для этой цели найденное на просторах интернета простое решение. Однако оно оказалось не совсем удачным, так как при большом количестве вариаций товара в каталоге выводились корректные цены не для всех товаров.

После очередных поисков было найдено другое решение, как выводить в каталоге Вукоммерс цену со скидкой (или минимальную цену) и перечеркнутую обычную цену на вариативный товар. Исходное решение находится по адресу https://wpcodebook.com/snippets/hide-max-price-for-variable-products-in-woocommerce.

Я внес небольшое изменение в код, потому что мне так привычнее работать — вместо получаемых функцией переменных $price и $_product я использую глобальную переменную global $product. На работе функции это никак не сказывается — ввод цен производится корректно.

Вот собственно сам код, который нужно добавить в файл function.php темы, используемой в вашем интернет магазине.

add_filter( 'woocommerce_variable_sale_price_html', 'hide_variable_max_price', PHP_INT_MAX, 2 );
add_filter( 'woocommerce_variable_price_html', 'hide_variable_max_price', PHP_INT_MAX, 2 );
function hide_variable_max_price() {
   global $product;
   $min_price_regular = $product->get_variation_regular_price( 'min', true );
   $min_price_sale    = $product->get_variation_sale_price( 'min', true );
   return ( $min_price_sale == $min_price_regular ) ?
	wc_price( $min_price_regular ) :
	'<del>' . wc_price( $min_price_regular ) . '</del>' . '<ins>' . wc_price( $min_price_sale ) . '</ins>';
}

Некоторые замечания. В данной функции первой выводится обычная цена, которая перечеркнута, а за ней уже выводится цена со скидкой. Обычно в интернет магазинах, с которыми мне приходилось работать, цена выводиться в обратном порядке — сначала цена со скидкой, а за ней уже перечеркнутая обычная цена. В таком случае нужно просто поменять местами фрагменты кода. Вот так:

'<ins>' . wc_price( $min_price_sale ) . '</ins>' . '<del>' . wc_price( $min_price_regular ) . '</del>';
Поделиться с друзьями