Сначала приведу код, а потом объясню, как я его использовал и для чего.
Вставляем в functions.php вашей темы:
/*Шорткод для вывода цены продукта по id в произвольном месте*/
function custom_price_shortcode_callback( $atts ) {
$atts = shortcode_atts( array(
'id' => null,
), $atts, 'product_price' );
$html = '';
if( intval( $atts['id'] ) > 0 && function_exists( 'wc_get_product' ) ){
$product = wc_get_product( intval( $atts['id'] ) );
// Получаем цены товара
$price = wc_get_price_to_display( $product, array( 'price' => $product->get_price() ) );
$regular_price = wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ); // Получаем регулярную цену
$sale_price = wc_get_price_to_display( $product, array( 'price' => $product->get_sale_price() ) ); // Получаем цену распродажи
// Formatting price settings (for the wc_price() function)
$args = array(
'ex_tax_label' => false,
'currency' => 'RUB', //Указываем валюту магазина
'decimal_separator' => '.', //Разделитель десятичных
'thousand_separator' => ' ', //Разделитель тысяч
'decimals' => 0, //Количество знаков после запятой
'price_format' => '%2$s %1$s',
);
// Вывод в HTML
if( ! empty( $sale_price ) && $sale_price != 0 && $sale_price < $regular_price )
$html = "<del>" . wc_price( $regular_price, $args ) . "</del> <ins>" . wc_price( $sale_price, $args ) . "</ins>"; // Sale price is set
else
$html = "<ins>" . wc_price( $price, $args ) . "</ins>"; // No sale price set
}
return $html;
}
add_shortcode( 'product_price', 'custom_price_shortcode_callback' );
Шорткод для вывода цены:
[product_price id="1234"]
где 1234 — id товара.
Чтобы вывести цену вариации, укажите в шорткоде id вариации товара.
Решение было взято со StackOverflow. В исходном коде также были использованы дополнительные стили для оформления выводимых цен. Поскольку у меня в теме все необходимые стили уже есть, я убрал эту часть кода.
Где я применил вывод цен по ID
Работая над интернет-магазином фабрики мягкой мебели, встала задача добавить новый тип товаров — кровати. При этом, в цену кровати матрас, как это часто бывает, не входит. Поэтому на странице с описанием кровати было решено добавить блок с матрасами, чтобы пользователь мог сразу выбрать подходящий ему по характеристикам матрас и добавить его в корзину, не покидая страницу кровати.
Всего четыре матраса с вариациями по размеру. Кровати же — каждый размер отдельным товаром, чтобы можно было выводить для каждой только матрасы нужного размера.
В итоге сверстал вот такой блок с матрасами:
Цены вывел шорткодами Product not found
, указывая в id идентификатор нужной вариации матраса. Теперь при изменении цен на матрасы или завершении распродажи, не придётся вручную менять стоимость на каждой странице с кроватями.
Добавление товара в корзину без перезагрузки страницы
В первую очередь в настройках Woocommerce во вкладке «Товары» проверяем, чтобы была включена галочка «Включить Ajax для кнопки добавления в корзину из архивов».
На странице с любой рубрикой нужно скопировать код кнопки «В корзину» из любой карточки товара.
В моём случае он выглядит так:
<a href="?add-to-cart=123" data-quantity="1" class="primary is-small mb-0 button product_type_simple add_to_cart_button ajax_add_to_cart is-outline" data-product_id="123" data-product_sku="" aria-label="Добавить «Диван-кровать Loft» в корзину" rel="nofollow">В корзину</a>
После копирования нужно заменить идентификаторы на нужные вариации (выделил жирным) и поменять текст на кнопке.
Код может отличаться в зависимости от используемой вами темы. У меня в данном случае используется Flatsome.