Диагностика задачи: зачем автоматизировать изменение цен в WooCommerce
В интернет-магазинах на WooCommerce часто требуется динамически изменять стоимость товаров — например, в зависимости от времени, статуса пользователя, акций или других условий. Ручное обновление цен неудобно и подвержено ошибкам, поэтому стоит использовать хуки WooCommerce для автоматизации.
Какие хуки WooCommerce отвечают за цену товара
Цена товара в WooCommerce хранится в метаполях _price, _regular_price и _sale_price. Для динамической корректировки цены при отображении на сайте используют фильтры:
woocommerce_product_get_price— цена для расчётов и отображенияwoocommerce_product_get_regular_price— базовая цена товараwoocommerce_product_get_sale_price— цена со скидкой
Изменения через эти фильтры не меняют данные в базе, а влияют только на вывод и расчёты.
Пошаговое решение: как автоматически изменить цену товара через хук
Пример: увеличить цену на 10% для всех товаров категории "Акционные"
add_filter('woocommerce_product_get_price', 'custom_dynamic_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_dynamic_price', 10, 2);
add_filter('woocommerce_product_get_sale_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
if (has_term('aktsionnye', 'product_cat', $product->get_id())) {
$price = $price * 1.10; // увеличиваем на 10%
}
return $price;
}
Объяснение кода
- Подключаемся к трём фильтрам, чтобы цена менялась во всех местах
- Проверяем, принадлежит ли товар категории с ярлыком
aktsionnye - Если да, умножаем цену на 1.1
Проверка результата после внедрения
- Откройте карточку товара из категории "Акционные" — цена должна быть увеличена на 10% относительно базовой.
- Перейдите в корзину и оформите заказ — цена там также обновится динамически.
- В панели администратора стоимость товара останется без изменений.
Частые ошибки и как их исправить
- Хук срабатывает не для всех типов цен. Нужно подключить фильтры для всех трёх типов:
get_price,get_regular_price,get_sale_price. - Цена возвращается строкой, а не числом. Следите, чтобы возвращаемое значение было числом с плавающей точкой для корректных вычислений.
- Кэширование мешает обновлению цены. Очистите кэш WooCommerce и плагинов кэширования после внесения изменений.
- Использование хуков без проверки категории. Это может привести к изменению цен у всех товаров.
Практические советы по безопасности и производительности
- Не сохраняйте динамические цены в базу данных напрямую — используйте фильтры для изменения цены при выводе.
- Проверяйте наличие категории через
has_term— это быстро и не нагружает БД. - Код лучше размещать в дочерней теме или собственном плагине, чтобы не потерять изменения при обновлении.
- Для сложных условий используйте transient API, чтобы кешировать результаты дорогостоящих вычислений.
Сравнение вариантов реализации изменения цены
| Способ | Плюсы | Минусы |
|---|---|---|
| Фильтры WooCommerce (как в примере) | Динамическая цена без изменения базы, простота реализации | Цена меняется только при выводе, не подходит для учета в бэкенде |
| Обновление цены через cron и wp_update_post_meta | Меняет цену в базе, видно в админке | Нагрузка на базу, сложнее поддерживать |
| Плагины динамического ценообразования | Готовое решение с интерфейсом | Может быть дорого, избыточно для простых задач |