Диагностика проблемы: как автоматически менять цены на товары при акции
В WooCommerce часто требуется менять цену товара не вручную, а автоматически — например, при запуске акции или скидки на определённую категорию или тег товаров. Проблема в том, что базовый функционал WooCommerce не предусматривает автоматическое массовое обновление цен по расписанию или по событию. Без правильной реализации это может привести к ошибкам в отображении цен, потере данных или неправильному учёту скидок.
Как понять, что автоматическое изменение цен необходимо именно в вашем кейсе
- Вы запускаете регулярные распродажи на определённые категории товаров.
- Нужно менять цену динамически по условию (например, сезонные скидки, количество на складе).
- Необходимо автоматическое обновление цен без ручного редактирования карточек.
Пошаговое решение: автоматическое изменение цены товаров с помощью кода
Для автоматического изменения цен рекомендуется использовать хук woocommerce_get_price или woocommerce_product_get_price для динамического изменения цены при выводе без перезаписи данных в базе. Это безопасно и удобно.
Пример кода, который снижает цену на 20% для товаров из категории с ID 15:
add_filter('woocommerce_product_get_price', 'custom_discount_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_discount_price', 10, 2);
function custom_discount_price($price, $product) {
if (has_term(15, 'product_cat', $product->get_id())) {
$discounted_price = $price * 0.8; // скидка 20%
return $discounted_price;
}
return $price;
}Этот код не меняет цену в базе, а динамически снижает цену при отображении.
Автоматическое включение и выключение акции по расписанию
Для автоматического старта и завершения акции добавим проверку даты:
function custom_discount_price($price, $product) {
$start = strtotime('2024-06-01 00:00:00');
$end = strtotime('2024-06-10 23:59:59');
$now = current_time('timestamp');
if ($now >= $start && $now <= $end) {
if (has_term(15, 'product_cat', $product->get_id())) {
return $price * 0.8;
}
}
return $price;
}Это позволит автоматически применять скидку только в период акции без необходимости ручного вмешательства.
Проверка результата после внедрения
- Откройте страницу с товаром из нужной категории в режиме анонимного пользователя.
- Проверьте, что цена отображается с 20% скидкой в период акции.
- Вне периода акции цена должна быть без изменений.
- Проверьте в админке, что цена товара в базе не изменилась.
- При добавлении товара в корзину цена должна соответствовать отображаемой.
Частые ошибки и как их исправить
- Цена меняется в базе данных: Избегайте прямого обновления метаполей
_priceи_regular_price, используйте фильтры для динамического изменения. - Скидка не отображается: Проверьте, что хук добавлен корректно и нет конфликтов с другими плагинами, которые могут переопределять цену.
- Цена в корзине неправильная: Убедитесь, что применяете фильтр и для цены в корзине (например,
woocommerce_cart_item_priceпри необходимости). - Дата и время не совпадают с часовым поясом сайта: Используйте
current_time('timestamp')для получения времени WordPress, а неtime().
Практические советы по безопасности и производительности
- Не храните изменённые цены в базе — это уменьшит риск ошибок и конфликтов с WooCommerce.
- Для больших магазинов с тысячами товаров используйте кэширование результатов фильтра, чтобы не нагружать сервер.
- Тестируйте код на staging-сервере перед запуском на боевом сайте.
- Если нужны более сложные акции, рассмотрите плагины типа Clearfy Pro для тонкой настройки SEO и оптимизации, или коммерческие плагины скидок.
Сравнение вариантов реализации автоматических скидок в WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Фильтр woocommerce_product_get_price | Динамическое изменение цены при отображении | Безопасно, не меняет базу, гибко по условиям | Может не работать в некоторых плагинах с кешем |
| Обновление метаполей в базе | Прямое изменение цены через update_post_meta | Простая реализация, видно в админке | Риск потери данных, конфликт с другими процессами |
| Плагины скидок (например, WooCommerce Dynamic Pricing) | Готовые решения для сложных условий | Много функций, поддержка | Платно, нагрузка на сайт |