Неоднократно приходилось сталкиваться с такой задачей: на странице каталога и на страницах категорий товаров 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>';