Диагностика задачи: зачем менять цены товаров по расписанию
В интернет-магазине на WooCommerce часто возникает необходимость автоматически менять цены товаров — например, для проведения акций, сезонных скидок или повышения цены по определённой дате. Встроенного функционала для этого в WooCommerce нет, а использование плагинов иногда нежелательно из-за нагрузки или ограничений. Решение — реализовать автоматическое изменение цен через кастомный код и WP-Cron.
Подготовка: проверяем возможности и ограничения
Перед началом убедитесь, что на вашем хостинге настроен WP-Cron или системный cron, который запускает wp-cron.php регулярно — иначе задачи по расписанию не сработают.
- Проверьте периодичность запуска WP-Cron через файл
wp-config.phpили хостинг. - Проверьте, что у вас есть доступ к функциям WordPress для обновления метаданных товаров.
Пошаговое решение: как создать задачу для изменения цен
1. Добавляем пользовательское расписание в WP-Cron
add_filter('cron_schedules', function($schedules) {
if (!isset($schedules['every_five_minutes'])) {
$schedules['every_five_minutes'] = [
'interval' => 300, // 5 минут в секундах
'display' => __('Каждые 5 минут')
];
}
return $schedules;
});2. Регистрируем событие, если оно ещё не зарегистрировано
if (!wp_next_scheduled('custom_update_product_prices')) {
wp_schedule_event(time(), 'every_five_minutes', 'custom_update_product_prices');
}3. Реализуем функцию изменения цен товаров
add_action('custom_update_product_prices', function() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
];
$query = new WP_Query($args);
$today = current_time('Y-m-d');
while ($query->have_posts()) {
$query->the_post();
$product_id = get_the_ID();
$product = wc_get_product($product_id);
// Пример: если сегодня 1 июля 2024, ставим скидку 10%
if ($today === '2024-07-01') {
$regular_price = (float) $product->get_regular_price();
$new_price = $regular_price * 0.9; // скидка 10%
$product->set_price($new_price);
$product->save();
}
// Добавьте другие условия для других дат или правил
}
wp_reset_postdata();
});4. Очищаем расписание при деактивации темы или плагина
function custom_deactivate_schedule() {
$timestamp = wp_next_scheduled('custom_update_product_prices');
if ($timestamp) {
wp_unschedule_event($timestamp, 'custom_update_product_prices');
}
}
register_deactivation_hook(__FILE__, 'custom_deactivate_schedule');Проверка результата: как убедиться, что цены обновляются
- Проверьте список задач WP-Cron через плагин
WP Crontrolили аналогичный. - Временно добавьте в функцию логирование для отладки:
и смотрите логи сервера.error_log('Обновление цены для товара ID: ' . $product_id); - Измените дату сервера или вручную вызовите событие через
do_action('custom_update_product_prices');в консоли WP-CLI или временно в коде. - Проверьте в админке WooCommerce, что цены товаров изменились.
Частые ошибки и их исправление
- WP-Cron не запускается: убедитесь, что
DISABLE_WP_CRONвwp-config.phpне выставлен в true, либо настройте системный cron на вызовwp-cron.php. - Цены не меняются: проверьте, что функция изменения цены вызывается — добавьте логирование. Убедитесь, что у товаров есть регулярные цены и они корректно считываются.
- Изменения не видны на сайте: кеширование страниц или объектов может мешать — очистите кеш, отключите кеширование на время теста.
- WP_Query загружает слишком много товаров: при очень большом каталоге используйте пагинацию или WP CLI для пакетной обработки.
Практические советы по безопасности и производительности
- Оптимизируйте запросы: добавляйте параметры
'fields' => 'ids'в WP_Query, если нужны только ID. - Пакетная обработка: при большом количестве товаров обрабатывайте их партиями, чтобы избежать таймаутов.
- Права доступа: выполнение кода в WP-Cron — безопасно, но избегайте вывода данных в публичной части без проверки прав.
- Кэширование: после изменения цен сбрасывайте кеши WooCommerce и CDN, чтобы пользователи видели актуальные цены.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Код через WP-Cron (как в статье) | Без плагинов, гибкий, полный контроль | Требует навыков разработки, возможны проблемы с WP-Cron | Изменение цен по расписанию, кастомная логика |
| Плагин автоматизации цен (например, WooCommerce Dynamic Pricing) | Простота настройки, готовый функционал | Может нагрузить сайт, ограниченная кастомизация | Быстрый запуск акций без кода |
| Использование системного cron + WP-CLI | Надёжность, подходит для больших магазинов | Требует доступа к серверу, сложнее в настройке | Пакетное обновление цен с максимальной производительностью |