Автоматическое изменение стоимости товаров в WooCommerce по заданным условиям

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

В крупных интернет-магазинах на WooCommerce часто возникает задача динамического изменения цен в зависимости от различных условий: сезонные скидки, оптовые закупки, акции для определённых пользователей, остатки на складе и пр. Ручное обновление цен неудобно и подвержено ошибкам, поэтому автоматизация через код или плагины — ключевой элемент управления магазином.

Пошаговое решение: как программно менять цены товаров в WooCommerce

1. Использование хука woocommerce_product_get_price для динамического изменения цены

Самый простой способ — перехватывать вызов цены товара и менять её на лету без изменения значения в базе данных. Это удобно, если скидка зависит от внешних условий, например, от роли пользователя.

add_filter('woocommerce_product_get_price', 'custom_dynamic_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
    if (is_admin()) return $price; // Не трогаем админку

    // Пример: скидка 10% для пользователей с ролью 'customer'
    if (current_user_can('customer')) {
        $discount = 0.10;
        $price = $price * (1 - $discount);
    }

    return $price;
}

Этот код нужно добавить в functions.php вашей темы или в кастомный плагин. Обратите внимание, что мы меняем и регулярную цену, чтобы отображение скидки работало корректно.

2. Автоматическое изменение цены при загрузке продукта (обновление базы данных)

Если нужно обновить цену в базе (например, массовая смена цен по остаткам), лучше использовать WP-CLI или крон-задачи с прямым обновлением метаполей.

$args = array(
    'post_type' => 'product',
    'posts_per_page' => -1,
);

$products = new WP_Query($args);
if ($products->have_posts()) {
    while ($products->have_posts()) {
        $products->the_post();
        $product_id = get_the_ID();
        $stock = get_post_meta($product_id, '_stock', true);
        $price = get_post_meta($product_id, '_regular_price', true);

        if ($stock < 10) { // Скидка для малых остатков
            $new_price = $price * 0.85; // 15% скидка
            update_post_meta($product_id, '_price', $new_price);
            update_post_meta($product_id, '_regular_price', $new_price);
        }
    }
    wp_reset_postdata();
}

Такой подход меняет цену в базе, и WooCommerce будет показывать обновлённую стоимость. Запускайте этот код через WP-CLI или в контролируемом cron-скрипте, чтобы не нагружать сайт.

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

  • Откройте страницу товара на сайте под учётной записью с ролью, для которой действует скидка, и проверьте цену.
  • Для массового обновления — проверьте цену в админке и на фронте, очистите кеш, если он используется.
  • Убедитесь, что в заказах сохраняется правильная цена — создайте тестовый заказ.

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

  • Цена не меняется у администратора или в админке. Это нормально, если вы добавили is_admin() в условие. Уберите проверку для теста.
  • Изменение цены не отображается на странице товара. Проверьте, что фильтр применён к обоим хукам: woocommerce_product_get_price и woocommerce_product_get_regular_price.
  • Цена обновилась, но в корзине и заказах старая. Для динамических цен нужно корректно работать с хукми корзины, например, woocommerce_before_calculate_totals, чтобы менять цену товара в корзине.
  • Произошла ошибка при массовом обновлении цен. Проверьте права доступа, наличие метаполей и корректность типов данных в update_post_meta.

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

  • Не выполняйте массовое обновление цен на фронтенде — используйте WP-CLI или cron.
  • Кешируйте результаты расчётов цены, если они сложные, чтобы снизить нагрузку.
  • Используйте is_admin() и другие условия, чтобы не менять цены в нужных местах.
  • Для динамических скидок, завязанных на пользователей, учитывайте кеширование страниц и объектов.

Сравнение подходов изменения цены в WooCommerce

МетодОписаниеПлюсыМинусы
Хуки woocommerce_product_get_price Изменение цены на лету без изменения БД Лёгкий в реализации, не изменяет данные Цена в базе не меняется, возможны проблемы с совместимостью
Массовое обновление метаданных Меняет цену прямо в базе данных Цена отображается везде одинаково, совместимость с отчетами Нагрузка при обновлении, нужно контролировать процесс
Использование плагинов скидок Готовые решения для динамических цен Функциональность без кода Может нагружать сайт, ограничена кастомизация
Как удалить оставшиеся вариации товаров в WooCommerce через код
18.07.2026
Как программно изменить количество вариантов товара в WooCommerce
26.06.2026
Как разрешить доступ к файлам WordPress через .htaccess для конкретных IP
17.04.2026
Как удалить или изменить поля в форме оплаты WooCommerce без плагинов
17.06.2026
Как создать автоматическое удаление старых записей в WordPress по дате
24.01.2026