Диагностика проблемы с изменением стоимости товаров в WooCommerce
При проведении акций в WooCommerce часто возникает задача временно изменить стоимость товаров без изменения базовой цены и без пересчёта сложных атрибутов и вариаций. Стандартные методы, например, изменение цены вариаций или использование скидок WooCommerce, могут приводить к пересчёту атрибутов, сбоям в отображении или конфликтам с другими плагинами.
Это особенно актуально для магазинов с большим ассортиментом и множеством вариаций, где пересчёт цен всех вариантов занимает время и может привести к ошибкам при синхронизации с внешними системами.
Как реализовать автоматическое изменение цены при акциях без пересчёта атрибутов
Использование фильтра woocommerce_get_price_html и woocommerce_product_get_price
Реализация заключается в динамическом изменении отображаемой цены и цены на уровне корзины и оформления заказа с помощью хука, без изменения самой цены товара в базе данных.
Вставьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
add_filter('woocommerce_product_get_price', 'custom_dynamic_sale_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_dynamic_sale_price', 10, 2);
add_filter('woocommerce_get_price_html', 'custom_dynamic_price_html', 10, 2);
function custom_dynamic_sale_price($price, $product) {
// Проверяем, активна ли акция (например, по дате или метке)
$sale_active = false;
$current_time = current_time('timestamp');
$sale_start = strtotime('2024-07-01 00:00:00');
$sale_end = strtotime('2024-07-10 23:59:59');
if ($current_time >= $sale_start && $current_time <= $sale_end) {
$sale_active = true;
}
if ($sale_active) {
// Например, скидка 15%
$price = $price * 0.85;
}
return $price;
}
function custom_dynamic_price_html($price_html, $product) {
$price = $product->get_price();
$regular_price = $product->get_regular_price();
if ($price < $regular_price) {
$price_html = '<del>' . wc_price($regular_price) . '</del> <ins>' . wc_price($price) . '</ins>';
} else {
$price_html = wc_price($price);
}
return $price_html;
}Объяснение кода
custom_dynamic_sale_priceизменяет цену товара на лету, проверяя дату проведения акции.- Используется скидка 15%, которую можно адаптировать под ваши условия.
custom_dynamic_price_htmlкорректно отображает цену с зачёркнутой старой и новой ценой.
Проверка результата после внедрения
- Установите системные даты на время проведения акции или измените даты в коде под текущий момент.
- Перейдите на страницу товара — цена должна отображаться с зачёркнутой старой ценой и новой сниженной.
- Добавьте товар в корзину и перейдите к оформлению заказа — цена там также должна быть снижена.
- Проверьте, что в базе данных в админке цена товара осталась неизменной, т.е. акция проходит без изменения записей.
Частые ошибки и способы их исправления
- Цена не меняется на фронтенде: Проверьте, что даты акции корректны и время сервера совпадает с локальным временем сайта (функция
current_time('timestamp')). - Пересчёт цены происходит, но отображение некорректно: Убедитесь, что фильтр
woocommerce_get_price_htmlприменяется с приоритетом 10 и что нет конфликтов с другими плагинами, которые изменяют цену. - Вариации товаров не изменяют цену: Для вариаций может потребоваться добавить тот же фильтр, но с проверкой на объект вариации
WC_Product_Variation.
Практические советы по безопасности и производительности
- Не изменяйте цены напрямую в базе при акциях. Используйте динамические фильтры, чтобы избежать конфликтов и сохранить целостность данных.
- Кэширование. При использовании кэша (например, object cache или плагинов кеширования) убедитесь, что цена обновляется корректно и кэш сбрасывается при старте и окончании акции.
- Локализация и форматирование цены. Используйте функции WooCommerce
wc_price()для корректного отображения цен с валютой и локализацией.
Альтернативы: плагин vs код
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин для акций (например, WooCommerce Dynamic Pricing) | Простая настройка, UI, поддержка разных условий | Может влиять на производительность, не всегда гибко для нестандартных сценариев | Использовать для простых задач |
| Код на хуках (как в статье) | Легко контролировать, не влияет на БД, гибко | Требует навыков программирования, можно ошибиться с датами | Идеально для разработчиков, настроенных под проект |