wpmoney.ru wordpress WP Money

Как использовать WooCommerce хуки для автоматического изменения цен при распродаже

Диагностика задачи: почему автоматизация изменения цен важна

В интернет-магазинах на WooCommerce часто приходится вручную менять цены товаров при распродажах. Это неудобно и приводит к ошибкам, особенно если товаров много. Автоматическое применение скидок позволяет быстро адаптировать цены и избежать потерь из-за человеческого фактора.

Основная задача — изменить цену товара динамически, используя встроенные хуки WooCommerce, чтобы скидка применялась только в нужном промежутке времени или при определённых условиях.

Какие хуки WooCommerce подходят для изменения цены

Для изменения цены товара в WooCommerce без изменения в базе данных обычно используются фильтры:

  • woocommerce_get_price — фильтр для получения базовой цены (обычной цены товара).
  • woocommerce_get_sale_price — фильтр для получения цены со скидкой.
  • woocommerce_product_get_price и woocommerce_product_get_sale_price — фильтры, применяемые к объекту товара (WC_Product).

В большинстве случаев лучше работать с woocommerce_product_get_price, так как он универсален и работает с объектом товара.

Пошаговое решение: автоматическое изменение цены с помощью хука

1. Определение условий распродажи

Например, пусть скидка 20% действует с 1 по 7 июля. Применим скидку только в этот период.

2. Добавление фильтра для изменения цены

add_filter('woocommerce_product_get_price', 'apply_custom_sale_price', 10, 2);
function apply_custom_sale_price($price, $product) {
    $start_date = strtotime('2024-07-01');
    $end_date = strtotime('2024-07-07 23:59:59');
    $now = current_time('timestamp');

    // Проверяем, что сейчас в период распродажи
    if ($now >= $start_date && $now <= $end_date) {
        // Применяем скидку 20% только к товарам с базовой ценой больше 0
        if ($price > 0) {
            $discounted_price = $price * 0.8;
            return round($discounted_price, wc_get_price_decimals());
        }
    }
    return $price;
}

Это простая реализация, которая не меняет цену в базе, а возвращает изменённую цену при выводе.

3. Дополнительное условие: исключение товаров с уже установленной скидкой

Чтобы не применять двойную скидку, проверим, что у товара нет заданной цены распродажи.

add_filter('woocommerce_product_get_price', 'apply_custom_sale_price', 10, 2);
function apply_custom_sale_price($price, $product) {
    $start_date = strtotime('2024-07-01');
    $end_date = strtotime('2024-07-07 23:59:59');
    $now = current_time('timestamp');

    if ($now >= $start_date && $now <= $end_date) {
        $sale_price = $product->get_sale_price();
        if (empty($sale_price) && $price > 0) {
            $discounted_price = $price * 0.8;
            return round($discounted_price, wc_get_price_decimals());
        }
    }
    return $price;
}

Проверка результата после внедрения

  1. Откройте страницу товара в магазине на фронтенде в период действия скидки (установите системное время), проверьте цену — она должна быть снижена на 20%.
  2. Проверьте админку: цена товара в базе не изменилась, скидка отображается только на сайте.
  3. Проверьте другие товары с установленной скидкой — их цена не должна изменяться дополнительно.
  4. Выключите фильтр (закомментируйте код) и убедитесь, что цена вернулась к оригиналу.

Частые ошибки и как их исправить

  • Ошибка: Скидка применяется дважды.
    Причина: Не проверяется наличие цены распродажи у товара.
    Решение: Добавьте проверку if (empty($product->get_sale_price())).
  • Ошибка: Цена отображается некорректно в корзине или на странице оформления заказа.
    Причина: Фильтр не применяется к корзине и заказам.
    Решение: Добавьте фильтры woocommerce_cart_item_price и woocommerce_cart_item_subtotal для согласования цен.
  • Ошибка: Неверное время скидки.
    Причина: Используется неправильная временная зона.
    Решение: Используйте current_time('timestamp') для получения времени в настройках WordPress.

Практические советы по производительности и безопасности

  • Не используйте тяжелые запросы или сложные вычисления в фильтрах цены — это вызывается очень часто.
  • Если скидка должна применяться к большому количеству товаров, рассмотрите возможность предварительной генерации цен и хранения их в метаполях.
  • Всегда проверяйте, что пользователь не может обойти скидку через REST API или напрямую изменяя корзину.

Чек-лист для внедрения автоматического изменения цены в WooCommerce

  • Определить условия применения скидки (даты, категории, теги).
  • Реализовать фильтр для изменения цены с проверкой существующей скидки.
  • Добавить фильтры для корректного отображения цены в корзине и заказах.
  • Проверить работу на тестовом окружении с разными товарами.
  • Тестировать работу в разных временных зонах и с кэшированием.

Сравнение вариантов реализации скидок в WooCommerce

МетодПлюсыМинусы
Изменение цены через фильтрНе изменяет базу, быстро и без плагиновМожно пропустить цену в некоторых местах (нужны дополнительные фильтры)
Использование стандартных цен распродажиПолная интеграция WooCommerce, поддержка кэшированияНе подходит для динамических условий, нужно редактировать товары вручную или программно
Плагины для автоматических скидокМного функций, удобный интерфейсНагрузка на сайт, возможные конфликты
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше