Автоматическое изменение стоимости товаров в 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 Изменение цены на лету без изменения БД Лёгкий в реализации, не изменяет данные Цена в базе не меняется, возможны проблемы с совместимостью
Массовое обновление метаданных Меняет цену прямо в базе данных Цена отображается везде одинаково, совместимость с отчетами Нагрузка при обновлении, нужно контролировать процесс
Использование плагинов скидок Готовые решения для динамических цен Функциональность без кода Может нагружать сайт, ограничена кастомизация
Как отключить AJAX в WordPress без потери производительности
13.01.2026
Как использовать PHPMailer в WordPress для отправки писем
04.03.2026
Как добавить автоматическое обновление плагинов WordPress без помощи SSH
24.03.2026
Как использовать REST API WordPress для создания приложений
30.11.2025
Как установить ограничение на количество попыток входа в WordPress
21.03.2026