Диагностика задачи: зачем автоматизировать изменение цены в WooCommerce
В магазинах на WooCommerce часто требуется менять цену товара автоматически при определённых условиях: например, при покупке определённого количества, для определённых категорий товаров, или в зависимости от даты. Ручное обновление цен неудобно и ошибочно, особенно при большом ассортименте. В этой статье расскажу, как реализовать автоматическое изменение цены товара через код, без использования тяжёлых плагинов, с примерами и проверкой результата.
Как реализовать автоматическое изменение цены товара при добавлении в корзину
Использование фильтра woocommerce_before_calculate_totals
Для динамического изменения стоимости товара в корзине используется фильтр woocommerce_before_calculate_totals. В примере ниже мы уменьшим цену на 10% для товаров из определённой категории «sale».
add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_adjustment', 20, 1);
function custom_dynamic_price_adjustment( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Предотвращаем повторное применение
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
$product = $cart_item['data'];
if ( has_term( 'sale', 'product_cat', $product->get_id() ) ) {
$original_price = $product->get_regular_price();
$discounted_price = $original_price * 0.9; // скидка 10%
$product->set_price( $discounted_price );
}
}
}
Этот код проверяет каждый товар в корзине, если он в категории «sale», уменьшает цену на 10%.
Проверка результата изменения цены
- Добавьте в корзину товар, относящийся к категории «sale».
- Перейдите на страницу корзины — цена должна отобразиться с учётом скидки.
- Убедитесь, что в админке цена товара не меняется — скидка применяется только в корзине.
Изменение цены товаров на странице каталога и страницах магазина
Изменение цены только в корзине может быть недостаточно. Чтобы отобразить новую цену на странице товара и каталога, нужно использовать фильтр woocommerce_get_price_html, который отвечает за вывод цены.
add_filter('woocommerce_get_price_html', 'custom_price_html_for_sale_category', 100, 2);
function custom_price_html_for_sale_category( $price, $product ) {
if ( has_term( 'sale', 'product_cat', $product->get_id() ) ) {
$regular_price = $product->get_regular_price();
$discounted_price = $regular_price * 0.9;
$price = wc_price( $discounted_price ) . ' <del>' . wc_price( $regular_price ) . '</del>';
}
return $price;
}
Этот код показывает цену со скидкой и зачёркнутую исходную цену для товаров из категории «sale».
Чек-лист для внедрения автоматизации изменения цены в WooCommerce
- Определить условие изменения цены (категория, количество, дата, пользователь и т.п.)
- Использовать
woocommerce_before_calculate_totalsдля изменения цены в корзине - Для отображения цены в каталоге использовать
woocommerce_get_price_html - Проверить, что цены меняются корректно без влияния на базовую цену товара
- Провести тесты с разными ролями пользователей и разнообразными товарами
- Убедиться, что не возникает конфликтов с другими плагинами скидок
Проверка результата после внедрения кода
После добавления кода в файл functions.php или в отдельный плагин, выполните:
- Очистите кэш сайта и браузера
- Добавьте в корзину товар из категории «sale»
- Проверьте цену в корзине и на странице товара
- Измените количество товара, чтобы убедиться, что цена пересчитывается
- Проверьте, что цены на товары вне категории «sale» не изменились
Частые ошибки при автоматическом изменении цены в WooCommerce и способы их исправления
- Цена не меняется в корзине: убедитесь, что код подключён с правильным приоритетом (например, 20) и что в условии нет ошибок.
- Скидка применяется несколько раз: используйте проверку
did_action('woocommerce_before_calculate_totals')чтобы избежать повторных изменений. - Цена меняется в админке или базе: используйте методы
set_priceтолько для объекта товара в корзине, не меняйте напрямую цену в базе. - Конфликты с плагинами скидок: тестируйте на чистой установке, при необходимости корректируйте приоритеты хука.
Практические советы по безопасности и производительности
- Не храните изменённую цену в метаполях товара — это может привести к путанице и проблемам при обновлениях.
- Всегда проверяйте, что код не выполняется в админке и AJAX-запросах, если это не нужно, чтобы избежать лишних нагрузок.
- Для сложных условий используйте кэширование результатов проверок, особенно если условие зависит от пользовательских данных.
- Регулярно обновляйте WooCommerce и проверяйте совместимость вашего кода.
Сравнение подходов к изменению цены в WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Фильтр woocommerce_before_calculate_totals | Динамическое изменение цены в корзине | Гибко, не меняет базу данных | Цена меняется только в корзине |
Фильтр woocommerce_get_price_html | Изменение отображаемой цены на страницах магазина | Визуально понятно для пользователя | Цена не изменяется в корзине и заказе без woocommerce_before_calculate_totals |
| Изменение цены товара через метаполя | Изменение цены в базе данных | Цена изменяется повсеместно | Риск ошибок, сложность отката изменений |