Диагностика задачи: зачем и когда нужно менять цену автоматически
В интернет-магазинах на WooCommerce часто возникает необходимость менять цены товаров по расписанию. Это может быть связано с сезонными скидками, акциями в определённые дни, динамическим ценообразованием или корректировкой цен в зависимости от спроса. Ручное изменение цен неудобно и чревато ошибками, особенно если товаров много.
Типичные симптомы, что нужна автоматизация:
- Частое изменение цен по расписанию (например, каждую неделю или каждый день).
- Необходимость быстро реагировать на маркетинговые акции.
- Ошибки при ручном обновлении цен.
Выбор подхода: плагин vs код
Существует три основных варианта решения:
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
| Плагины автоматизации цен | Простая настройка, интерфейс, меньше кода | Потенциально лишний вес, зависимости, не всегда точное расписание | WooCommerce Dynamic Pricing, Scheduled Sale |
| Собственный код + WP-Cron | Гибкость, точная логика, без лишних плагинов | Требует навыков, тестирования, поддержки | Пример в статье ниже |
| Внешние скрипты и API | Можно интегрировать с ERP, CRM, гибко | Сложность, требует инфраструктуры | Интеграция через REST API WooCommerce |
Пошаговое решение: автоматическое изменение цены через WP-Cron
1. Создаём функцию для изменения цены товара
Функция принимает ID товара и новую цену, обновляет мета-данные.
function wpassist_update_product_price( $product_id, $new_price ) {
$product = wc_get_product( $product_id );
if ( ! $product ) {
return false;
}
$product->set_regular_price( $new_price );
$product->save();
return true;
}2. Создаём задачу, которая будет запускаться по расписанию
Добавим задачу в WP-Cron, которая будет менять цену в нужное время.
add_action( 'wpassist_scheduled_price_update', 'wpassist_handle_scheduled_price_update' );
function wpassist_handle_scheduled_price_update() {
// Пример: меняем цену товара с ID 123 на 499 рублей
$product_id = 123;
$new_price = 499;
wpassist_update_product_price( $product_id, $new_price );
}3. Регистрируем событие при активации темы или плагина
Добавляем расписание — например, ежедневно в 00:00.
function wpassist_schedule_price_update() {
if ( ! wp_next_scheduled( 'wpassist_scheduled_price_update' ) ) {
wp_schedule_event( strtotime('00:00:00'), 'daily', 'wpassist_scheduled_price_update' );
}
}
add_action( 'wp', 'wpassist_schedule_price_update' );4. Отмена расписания при деактивации
function wpassist_clear_scheduled_price_update() {
$timestamp = wp_next_scheduled( 'wpassist_scheduled_price_update' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpassist_scheduled_price_update' );
}
}Проверка результата после внедрения
- Проверьте, что событие запланировано: в консоли WP можно воспользоваться плагином WP Crontrol или выполнить в консоли базы данных запрос на wp_cron.
- Вручную вызовите функцию
wpassist_handle_scheduled_price_update()через админский интерфейс, чтобы проверить обновление цены. - Перейдите на страницу товара, убедитесь, что цена изменилась.
- Проверьте логи ошибок PHP на наличие проблем при запуске WP-Cron.
Частые ошибки и как их исправить
- Событие WP-Cron не запускается: Проверьте, что на сервере включён WP-Cron (в файле wp-config.php не должна быть отключена константа DISABLE_WP_CRON). Если сайт мало посещают, WP-Cron может не запускаться — настройте системный cron на сервере.
- Цена не обновляется: Убедитесь, что ID товара правильный и товар опубликован. Проверьте, что используете правильные методы WooCommerce (wc_get_product и методы объекта).
- Блокировка кэша: Если используется кэширование, очистите кэш после обновления цены, чтобы изменения отобразились сразу.
Практические советы по безопасности и производительности
- Не делайте массовые обновления цен в одном событии — разбивайте на небольшие группы, чтобы избежать таймаутов и нагрузок.
- Используйте nonce и проверяйте права пользователя, если добавляете интерфейс для ручного запуска обновлений.
- Логируйте изменения цен и ошибки для отладки.
- При необходимости интегрируйте Clearfy Pro для оптимизации базы данных и удаления лишних транзиентов после обновления цен.