Диагностика задачи: зачем автоматически менять цену товара после покупки
В WooCommerce иногда требуется изменять цену товара сразу после успешной покупки. Например, чтобы установить скидку для повторных заказов или повысить цену по определённым правилам. В теме GeneratePress это возможно реализовать через хуки WooCommerce и кастомные функции PHP, без использования громоздких плагинов.
Основные хуки для изменения цены товара в WooCommerce
Чтобы динамически менять цену товара после покупки, нам нужна точка входа после оформления заказа. Обычно это хук woocommerce_order_status_completed, который срабатывает при переводе заказа в статус «завершён».
Далее через ID купленных товаров изменяем цену в метаполях товара (например, _regular_price и _price).
Пример кода для снижения цены товара на 10% после первой покупки
add_action('woocommerce_order_status_completed', 'change_price_after_purchase', 10, 1); function change_price_after_purchase($order_id) { $order = wc_get_order($order_id); if (!$order) return; foreach ($order->get_items() as $item_id => $item) { $product = $item->get_product(); if (!$product || $product->is_type('variable')) continue; // пропускаем вариативные $product_id = $product->get_id(); $regular_price = (float) $product->get_regular_price(); if ($regular_price <= 0) continue; $new_price = round($regular_price * 0.9, 2); // минус 10% update_post_meta($product_id, '_regular_price', $new_price); update_post_meta($product_id, '_price', $new_price); $product->set_price($new_price); $product->save(); }}Пошаговое решение: как реализовать и проверить
- Добавьте код в functions.php дочерней темы GeneratePress или в отдельный плагин.
- Создайте тестовый товар с ценой от 100 рублей.
- Создайте заказ и доведите его статус до «завершён».
- Проверьте, что цена товара изменилась в админке WooCommerce и на фронте.
- Очистите кэш сайта и браузера перед проверкой.
Проверка результата после внедрения
- В панели администрирования WooCommerce откройте редактирование товара и убедитесь, что цена уменьшилась на 10%.
- На странице товара на сайте должна отображаться новая цена.
- Создайте ещё один заказ с этим товаром, чтобы увидеть, что цена не меняется повторно (если требуется).
Частые ошибки и как их исправить
- Цена не меняется после покупки: проверьте, что хук
woocommerce_order_status_completedсрабатывает. Можно добавитьerror_logвнутри функции для отладки. - Изменяется цена вариативного товара: в коде есть фильтр, но если вариативные товары не исключены, это может привести к ошибкам.
- Кэш страницы мешает увидеть изменения: очистите кэш или отключите кэширование на время теста.
- Цена изменяется для всех товаров без условий: добавьте дополнительные проверки, например, только для определённых категорий или пользователей.
Практические советы по безопасности и производительности
- Не изменяйте цены товаров напрямую без резервного копирования базы данных.
- Используйте дочернюю тему GeneratePress для внесения изменений, чтобы не потерять их при обновлении.
- Если планируется массовое изменение цен, рассмотрите создание отдельного сервиса или WP-CLI скрипта.
- Добавьте проверку прав пользователя и статуса заказа, чтобы избежать случайных изменений.
- Для сложных правил ценообразования лучше использовать специализированные плагины.
Сравнение способов автоматического изменения цены товара
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код в functions.php (через хуки WooCommerce) | Написать функцию, которая меняет цену после статуса заказа | Легко кастомизировать, бесплатно, гибко | Требует навыков программирования, риск ошибок |
| Плагин динамического ценообразования | Использовать готовый плагин для скидок и изменения цен | Простой в использовании, много функций | Может быть платным, избыточным для простой задачи |
| WP-CLI скрипт | Изменять цены через командную строку | Удобно для массовых изменений | Нужен доступ к серверу, сложнее для новичков |