Диагностика задачи: зачем менять цену и наличие по расписанию?
В интернет-магазинах на WooCommerce часто возникает необходимость автоматически менять цену товара или его доступность в определённое время. Это может быть связано с акциями, сезонными скидками, распродажами или управлением запасами. Ручное обновление неэффективно и подвержено ошибкам, поэтому автоматизация через код или плагины — лучший подход.
Как определить, что задача актуальна?
- Есть товары с временными скидками или акциями.
- Товары появляются и исчезают из наличия по расписанию.
- Необходимо обновлять цены и статусы без участия администратора.
Пошаговое решение с использованием WP-Cron и хуков WooCommerce
Шаг 1. Создайте функцию для обновления цены и наличия
Напишем функцию, которая будет изменять цену и статус наличия для заданного товара.
function wpdev_update_product_price_and_stock( $product_id, $new_price, $stock_status ) {
$product = wc_get_product( $product_id );
if ( ! $product ) {
return false;
}
// Обновляем цену
$product->set_price( $new_price );
$product->set_regular_price( $new_price );
$product->save();
// Обновляем статус наличия
update_post_meta( $product_id, '_stock_status', $stock_status );
wc_update_product_stock_status( $product_id, $stock_status );
wc_delete_product_transients( $product_id );
return true;
}Шаг 2. Создайте функцию для задания расписания
Используем WP-Cron для запуска обновления по расписанию.
function wpdev_schedule_price_stock_update() {
if ( ! wp_next_scheduled( 'wpdev_cron_update_products' ) ) {
// Запускаем задачу каждый день в 03:00
wp_schedule_event( strtotime('03:00:00'), 'daily', 'wpdev_cron_update_products' );
}
}
add_action( 'wp', 'wpdev_schedule_price_stock_update' );Шаг 3. Обработчик крон-задачи с логикой обновления
В этом примере меняем цену и наличие для нескольких товаров с разным расписанием, которое можно хранить в метаполях товара или в отдельной таблице.
add_action( 'wpdev_cron_update_products', 'wpdev_cron_update_products_callback' );
function wpdev_cron_update_products_callback() {
$products_to_update = [
['id' => 123, 'price' => 499, 'stock' => 'instock'],
['id' => 124, 'price' => 0, 'stock' => 'outofstock'],
];
foreach ( $products_to_update as $item ) {
wpdev_update_product_price_and_stock( $item['id'], $item['price'], $item['stock'] );
}
}Проверка результата после внедрения
- Подождите или вручную запустите крон-задачу через WP-CLI:
wp cron event run wpdev_cron_update_products. - Проверьте на фронтенде и в админке WooCommerce, что цена и статус наличия изменились у нужных товаров.
- Проверьте логи ошибок сервера для исключения сбоев.
Частые ошибки и как их исправить
- Крон не запускается: убедитесь, что WP-Cron включён, или настройте системный cron на сервере.
- Цена не меняется: проверьте, правильно ли указан ID товара, и вызывается ли
$product->save(). - Наличие не обновляется: используйте
wc_update_product_stock_status()и обновляйте метаполе_stock_status. - Кэш не обновляется: вызовите
wc_delete_product_transients()для очистки кеша товара.
Практические советы по безопасности и производительности
- Не используйте WP-Cron для слишком частых задач (меньше одного раза в минуту), чтобы не нагружать сервер.
- Проверяйте права пользователя при запуске функций, если добавляете возможность запуска из админки.
- Для большого количества товаров вынесите расписание в отдельную таблицу и обновляйте только нужные позиции.
- Кешируйте результаты запросов к базе, если логика усложняется.
Сравнение вариантов реализации изменения цены и наличия товаров
| Вариант | Плюсы | Минусы |
|---|---|---|
| Код на WP-Cron + хуки WooCommerce | Гибкость, нет зависимости от плагинов, полный контроль | Требует навыков программиста, возможны ошибки в расписании |
| Плагины акций и расписания (например, WooCommerce Scheduler) | Простота настройки, готовый интерфейс | Могут конфликтовать с другими плагинами, нагрузка на сайт |
| Ручное обновление через админку | Простота, не требует программирования | Много ручной работы, ошибки, не автоматизировано |