Получилась немного нестандартная задача с нестандартным и, возможно, спорным решением, но на момент сдачи сайта оно было признано приемлемым.
Итак, у нас интернет-магазин мягкой мебели. На странице товара есть возможность выбрать цвет ткани дивана, но набор тканей настолько большой (около 3000 наименований в 11 категориях), что делать все возможные вариации мы посчитали нецелесообразным — получилось бы просто чудовищное количество вариаций, которое Woocommerce мог не вывезти.
Поэтому было принято решение, что для базовой категории тканей делаем шесть вариантов цветов, а остальные виды тканей выводим блоком «Ткани» на странице товара, добавляем цены и блок «Заказать диван с выбранной тканью». Да, костыль, но получилось неплохо.
Блок с тканями
Ткани сгруппированы по категориям в аккордеоне. Под каждой тканью выводим стоимость дивана с этой тканью.
Под блоком с тканями призыв заказать диван с той тканью, которая понравилась, в форме радио-кнопки с выбором типа ткани. С подбором конкретного цвета уже работают менеджеры.
Произвольные поля с ценами
Чтобы добавить цены, установили плагин Advanced Custom Fields. Достаточно бесплатной версии. В нём создали по одному полю для каждой категории ткани и ещё одно поле для задания скидки.
Тип поля — число, чтобы можно было рассчитывать скидку, а не вводить значение вручную.
Осталось только вывести цены на странице товаров.
Шорткод для вывода дополнительной цены
Поскольку мы использовали визуальный конструктор страницы товара, выводим цены шорткодами. Для каждой категории тканей отдельный шорткод.
Ниже пример только для одной, остальные идентичны, отличается только номер категории.
fabric4-price
— название шорткода, который будет добавляться на страницу товара, fabric4_price_func
— функция, которая будет срабатывать при наличии шорткода на странице.
//Шорткод для вывода цены на ткань категории 4
add_shortcode( 'fabric4-price', 'fabric4_price_func' );
function fabric4_price_func() {
//Получаем значение цены из произвольного поля
$fabric_price = get_field('fabric_4_regular');
//Получаем процент скидки из произвольного поля
$sale_percent = get_field('sale-percent');
//Считаем цену со скидкой
$sale_price = $fabric_price - ($fabric_price * ($sale_percent / 100));
//Форматируем цену, чтобы были десятичные разделители и неразрывный пробел между тысячами
$output_fabric_price = number_format($fabric_price, 0, '.', ' ');
$output_sale_price = number_format($sale_price, 0, '.', ' ');
//Проверяем, задан ли процент скидки. Если да, выводим зачёркнутую обычную цену и цену со скидкой
if( get_field('sale-percent') ) {
return '<div class="price-wrapper"><p class="price product-page-price price-on-sale"><del><span class="woocommerce-Price-amount amount">' . $output_fabric_price . ' ₽</span></del> <ins><span class="woocommerce-Price-amount amount">' . $output_sale_price . ' ₽</span></ins></p></div>';
}
//Если скидки нет, выводим только обычную цену
else {
return '<div class="price-wrapper"><p class="price product-page-price price-on-sale"><span class="woocommerce-Price-amount amount">' . $output_fabric_price . ' ₽</span></p></div>';
}
}
В вывод была добавлена разметка цен от самого Woocommerce, чтобы внешний вид цены был таким же, как и обычная цена, выводимая магазином.