Что такое WP-Cron и зачем он нужен для WooCommerce
WP-Cron — внутренний планировщик задач WordPress, который позволяет запускать определённые действия по расписанию. В контексте WooCommerce WP-Cron полезен для автоматизации повторяющихся задач, например, автоматического обновления статусов заказов, очистки устаревших данных или отправки напоминаний.
Диагностика: почему WP-Cron не работает или работает с задержкой
Частая проблема с WP-Cron — он запускается только при посещении сайта, поэтому если трафик низкий, задачи могут запускаться с задержкой или вообще не запускаться.
- Проверьте, активен ли WP-Cron: в файле
wp-config.phpне должна быть установлена константаDISABLE_WP_CRONвtrue. - Проверьте наличие задач: используйте плагин WP Crontrol для просмотра и управления запланированными задачами.
- Проверьте логи ошибок сервера и WooCommerce на предмет сбоев при выполнении задач.
Пошаговое руководство: как создать и настроить WP-Cron задачу для автоматизации заказов WooCommerce
Шаг 1. Создаём функцию для обработки заказов
function wppuzzle_woocommerce_auto_update_orders() {
// Получаем заказы со статусом "обработка" старше 3 дней
$args = [
'limit' => -1,
'status' => 'processing',
'date_created' => '<' . ( time() - 3 * DAY_IN_SECONDS )
];
$orders = wc_get_orders($args);
foreach ($orders as $order) {
// Меняем статус на "завершён"
$order->update_status('completed', 'Автоматическое обновление статуса после 3 дней обработки');
}
}Шаг 2. Регистрируем WP-Cron событие при инициализации темы или плагина
add_action('wppuzzle_auto_update_orders_hook', 'wppuzzle_woocommerce_auto_update_orders');
function wppuzzle_schedule_auto_update_orders() {
if (! wp_next_scheduled('wppuzzle_auto_update_orders_hook')) {
// Запускаем задачу раз в сутки
wp_schedule_event(time(), 'daily', 'wppuzzle_auto_update_orders_hook');
}
}
add_action('wp', 'wppuzzle_schedule_auto_update_orders');Шаг 3. Очистка расписания при деактивации плагина или темы
function wppuzzle_clear_auto_update_orders_schedule() {
$timestamp = wp_next_scheduled('wppuzzle_auto_update_orders_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wppuzzle_auto_update_orders_hook');
}
}
register_deactivation_hook(__FILE__, 'wppuzzle_clear_auto_update_orders_schedule');Как проверить, что задача работает
- Убедитесь, что в админке WooCommerce в заказах есть заказы со статусом
processingстарше 3 дней. - Проверьте, что после запуска WP-Cron эти заказы меняют статус на
completed. - Используйте плагин WP Crontrol для ручного запуска события
wppuzzle_auto_update_orders_hookи просмотра логов. - Добавьте в функцию запись в лог, например,
error_log('WP-Cron обработал заказы');, чтобы удостовериться в вызове.
Частые ошибки и как их исправить
- WP-Cron не запускается из-за DISABLE_WP_CRON: Проверьте
wp-config.phpи удалите или изменитеdefine('DISABLE_WP_CRON', true);. - Задача не добавляется в расписание: Убедитесь, что хук
wpсрабатывает (например, используйтеinitвместо). - Функция не находит заказы: Проверьте правильность параметров
wc_get_orders, используйте отладку или var_dump. - Сбой из-за таймаута: Если обработка занимает много времени, разбейте задачу на части или используйте WP CLI для запуска.
Практические советы по безопасности и производительности
- Не используйте WP-Cron для задач, требующих точного времени исполнения — лучше настроить системный cron на сервере, вызов
wp-cron.php. - Ограничьте количество обрабатываемых заказов за один запуск, чтобы избежать перегрузки сервера.
- Используйте nonce и проверки прав, если WP-Cron запускает действия, доступные через AJAX или REST.
- Логи ошибок и действий сохраняйте в отдельный файл, чтобы не засорять системный лог.
Сравнение вариантов автоматизации заказов WooCommerce
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron | Легко настроить Не требует доступа к серверу | Зависит от посещаемости сайта Может работать с задержкой | Пример выше |
| Системный cron | Точный тайминг Стабильность | Требует доступа к серверу Настройка сложнее | curl https://example.com/wp-cron.php?doing_wp_cron |
| Плагины автоматизации | Удобный интерфейс Дополнительные функции | Может замедлить сайт Зависит от стороннего кода | WP Crontrol, AutomateWoo |