Диагностика задачи: зачем менять цены автоматически
В интернет-магазинах на WooCommerce часто возникает необходимость менять цены на товары по расписанию — например, для акций, сезонных скидок или повышения цен с определённой даты. Ручное обновление неэффективно и чревато ошибками. Автоматизация процесса позволяет сэкономить время и избежать человеческого фактора.
Как реализовать автоматическое изменение цен в WooCommerce
Основные подходы
Есть два основных способа автоматизировать изменение цен по расписанию:
- Использовать WP-Cron и кастомный PHP-код для периодической проверки и обновления цен;
- Интегрировать сторонний планировщик задач на сервере (например, системный cron) для запуска скрипта вне зависимости от посещаемости сайта.
В данной статье рассмотрим вариант с WP-Cron — он проще для большинства хостингов и не требует доступа к серверу.
Создание функции обновления цены
Для начала напишем функцию, которая будет менять цену у конкретного товара по ID:
function wpmart_update_product_price( $product_id, $new_price ) {
$product = wc_get_product( $product_id );
if ( ! $product ) {
return false;
}
$product->set_regular_price( $new_price );
// Чтобы цена отображалась сразу, можно сбросить цену продаж
$product->set_sale_price('');
$product->save();
return true;
}Эта функция безопасно обновляет регулярную цену товара и сохраняет изменения.
Добавление задачи в WP-Cron
Далее регистрируем событие, которое будет срабатывать ежедневно и менять цены по расписанию:
add_action( 'wpmart_daily_price_update', 'wpmart_run_price_updates' );
function wpmart_schedule_daily_price_update() {
if ( ! wp_next_scheduled( 'wpmart_daily_price_update' ) ) {
wp_schedule_event( time(), 'daily', 'wpmart_daily_price_update' );
}
}
add_action( 'wp', 'wpmart_schedule_daily_price_update' );
function wpmart_run_price_updates() {
// Пример: меняем цену товара с ID 123 на 799 рублей с 1 июня 2024
$current_date = current_time( 'Y-m-d' );
if ( $current_date >= '2024-06-01' ) {
wpmart_update_product_price( 123, 799 );
}
// Здесь можно добавить другие условия и товары
}Этот код устанавливает ежедневное событие, которое проверяет дату и меняет цену при наступлении условия.
Проверка результата после внедрения
Чтобы убедиться, что всё работает:
- В админке WooCommerce откройте страницу товара и проверьте цену;
- Для теста можно временно изменить дату в коде на текущую;
- Также можно вручную запустить действие через WP-CLI:
wp cron event run wpmart_daily_price_update; - Обратите внимание на логи ошибок PHP и WooCommerce (если включены) — отсутствие ошибок говорит о корректной работе.
Частые ошибки и как их исправлять
- Неправильный ID товара: Функция
wc_get_productвозвращает null — проверьте ID; - WP-Cron не запускается из-за низкой посещаемости: На слабых сайтах можно настроить системный cron или использовать плагин WP Crontrol для запуска вручную;
- Кэширование мешает видеть изменения: Очистите кеш сайта и браузера после обновления;
- Цена не обновляется в корзине: Проверьте, что после изменения цены вызывается
$product->save();и кеш WooCommerce сбрасывается.
Практические советы по безопасности и производительности
- Избегайте частого запуска WP-Cron, чтобы не нагружать сервер;
- Используйте системный cron для более надежного запуска задач на больших сайтах;
- Проверяйте права пользователя, если планируете добавлять интерфейс для управления ценами;
- Храните расписание и параметры обновления в опциях или отдельной таблице для удобства управления;
- Для массовых обновлений цен используйте WP_Query с
wc_get_productsпо мета-данным, чтобы минимизировать количество запросов.
Сравнение подходов автоматизации изменения цен
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron | Легко настроить, не требует доступа к серверу | Зависит от посещаемости сайта, возможны задержки |
| Системный cron | Надежный запуск в нужное время, не зависит от трафика | Требует доступа к серверу и навыков администрирования |
| Плагины (например, WP All Import с расписанием) | Готовые решения, удобный интерфейс | Могут быть платными, лишний функционал |