Диагностика задачи: зачем менять цену товара автоматически
В WooCommerce часто возникает потребность автоматически корректировать цену товара при его обновлении. Например, это может быть изменение цены с учётом новой закупочной стоимости, сезонные скидки или автоматическое округление цены по заданным правилам. Вручную менять цены неудобно, особенно при большом каталоге.
Задача: реализовать автоматическое изменение цены товара при его обновлении в админке или через импорт, используя встроенные хуки WooCommerce и WordPress.
Выбор подходящего хука для автоматического изменения цены
Для изменения цены при обновлении товара используется хук save_post_product — вызывается при сохранении записи типа product. Он позволяет получить объект товара, проверить данные и изменить цену программно.
Важно: изменение цены в этом хуке должно происходить корректно, чтобы не возникало бесконечных циклов сохранения.
Пример базового кода для изменения цены при обновлении товара
add_action('save_post_product', 'auto_update_product_price', 20, 3); function auto_update_product_price($post_ID, $post, $update) { // Проверяем, что это обновление, а не создание нового товара if (!$update) return; // Получаем объект товара $product = wc_get_product($post_ID); if (!$product) return; // Получаем текущую цену $current_price = floatval($product->get_regular_price()); // Логика изменения цены - например, прибавляем 10% $new_price = $current_price * 1.10; // Округляем до двух знаков $new_price = round($new_price, 2); // Если цена изменилась, обновляем if ($new_price !== $current_price) { $product->set_regular_price($new_price); $product->save(); } }Пошаговое решение: как внедрить и протестировать
- Подключитесь к сайту по FTP или через редактор тем.
- Добавьте приведённый выше код в файл
functions.phpвашей дочерней темы или в отдельный плагин. - Перейдите в админку WooCommerce и отредактируйте существующий товар.
- Сохраните товар и проверьте, изменилась ли цена на 10% больше.
- Если вы используете импорт товаров, убедитесь, что после импорта цены также автоматически обновляются (при условии, что происходит триггер сохранения товара).
Проверка результата после внедрения
- Откройте любой товар для редактирования в админке и сохраните его без изменений.
- Проверьте цену — она должна увеличиться на 10%.
- Для контроля добавьте логирование в функцию, например,
error_log(), чтобы отследить срабатывание кода. - Проверьте на фронтенде, что цена отображается корректно.
Частые ошибки и как их исправить
- Бесконечный цикл сохранения товара. Если в хуке
save_post_productвы вызываете$product->save()без условий, это может вызвать повторное срабатывание хука. Решение: вызывайтеsave()только если цена действительно изменяется, как в примере выше. - Неправильный тип записи. Убедитесь, что хук привязан именно к
save_post_product, а не кsave_postобщего вида, чтобы не влиять на другие записи. - Ошибка при получении объекта товара. Функция
wc_get_product()может вернутьfalse, если товар удалён или недоступен. Добавляйте проверку на объект. - Проблемы с импортом. Некоторые импортеры не вызывают стандартные хуки сохранения. В этом случае нужно либо доработать импорт, либо запускать отдельный скрипт для массового обновления цен.
Практические советы для безопасности и производительности
- Не используйте слишком сложные вычисления или запросы внутри хука
save_post_product, чтобы не замедлять сохранение товара. - Добавьте проверку прав пользователя, если планируете запускать логику только для админов, например:
if (!current_user_can('edit_product', $post_ID)) return;. - Логируйте изменения цены через
error_logили собственный лог-файл для отладки. - Если нужно массовое изменение цен, лучше сделать отдельный WP-CLI скрипт или пакетный импорт с учетом новой логики.
Сравнение способов автоматического изменения цены
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
Хук save_post_product | Простая реализация, срабатывает при обновлении товара | Риск бесконечного цикла, не срабатывает при массовом импорте без сохранения | Код из статьи |
| WP-CLI скрипт | Массовое изменение без нагрузки на сайт | Требует доступа к серверу, знания WP-CLI | Отдельный PHP-скрипт |
| Плагин для импорта с фильтрами | Управление ценами при импорте | Зависимость от стороннего плагина | Плагин WP All Import с PHP-правилами |