Что такое WP-Cron и зачем он нужен в тикет-системе
WP-Cron — встроенный механизм планирования задач в WordPress, который позволяет автоматически запускать функции по расписанию. Для тикет-системы это удобно для автоматической обработки тикетов: рассылки уведомлений, очистки старых записей, смены статусов и других рутинных операций без участия админа.
Диагностика: как понять, что WP-Cron в вашей системе работает неправильно
Частые признаки проблем с WP-Cron в тикет-системе:
- Отсутствие автоматических уведомлений по расписанию;
- Не меняются статусы тикетов по расписанию;
- Не удаляются старые тикеты, если настроена автоматическая очистка;
- Ошибка при выполнении фоновых задач или их задержка.
Для проверки работы WP-Cron можно использовать плагин WP Crontrol. Он отображает все запланированные события и позволяет их запускать вручную.
Пошаговое решение: как настроить WP-Cron для автоматизации задач в тикет-системе
1. Добавляем собственное событие и расписание
Если нужна периодичность, отличная от стандартных (час, день и т.д.), добавим новое расписание:
add_filter('cron_schedules', function($schedules) {
$schedules['every_five_minutes'] = [
'interval' => 300, // 300 секунд = 5 минут
'display' => 'Каждые 5 минут'
];
return $schedules;
});2. Регистрируем событие при активации плагина или темы
register_activation_hook(__FILE__, function() {
if (!wp_next_scheduled('process_ticket_updates')) {
wp_schedule_event(time(), 'every_five_minutes', 'process_ticket_updates');
}
});
register_deactivation_hook(__FILE__, function() {
wp_clear_scheduled_hook('process_ticket_updates');
});3. Создаем функцию-обработчик задачи
add_action('process_ticket_updates', function() {
global $wpdb;
// Пример: автоматическое закрытие тикетов старше 30 дней
$date_limit = date('Y-m-d H:i:s', strtotime('-30 days'));
$wpdb->query($wpdb->prepare(
"UPDATE {$wpdb->prefix}tickets SET status = 'closed' WHERE status != 'closed' AND created_at < %s",
$date_limit
));
// Здесь можно добавить другие автоматические операции
});Проверка результата после внедрения
Чтобы проверить, что автоматизация работает:
- Убедитесь, что событие
process_ticket_updatesзапланировано: в WP Crontrol или через функциюwp_next_scheduled('process_ticket_updates')вернёт метку времени; - Запустите событие вручную в WP Crontrol и проверьте изменения в базе — например, закрылись ли старые тикеты;
- Подождите 5 минут и проверьте, что изменения происходят автоматически без вашего участия;
- Просмотрите логи ошибок сервера и WordPress для выявления возможных сбоев.
Частые ошибки и как их исправить
- WP-Cron не запускается автоматически: По умолчанию WP-Cron запускается при обращении к сайту. Если трафика мало, задачи не выполняются. Решение: настроить системный cron на сервере для вызова
wp-cron.phpкаждые 5 минут.*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1 - Несколько одинаковых задач запланированы: Используйте
wp_next_scheduled, чтобы не создавать дубликаты событий. - Ошибки в SQL-запросах при обновлении базы: Проверяйте корректность таблиц и полей, используйте
$wpdb->prepare()для безопасности. - Функция-обработчик занимает много времени: Разбейте задачи на несколько событий или используйте очередь (WP Queue, Action Scheduler).
Практические советы по безопасности и производительности
- Обязательно используйте
wp_nonce_fieldи права доступа, если функции запускаются из интерфейса. - Для тяжелых операций лучше запускать WP-Cron через системный cron, а не полагаться на заходы пользователей.
- Проверяйте время выполнения функций и избегайте блокирующих операций в обработчиках WP-Cron.
- Используйте транзиенты (transients API) для кеширования промежуточных данных при частых запусках.
Сравнение вариантов автоматизации в тикет-системе
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron (по умолчанию) | Прост в настройке, не требует доступа к серверу | Зависит от посещаемости сайта, может не запускаться вовремя |
| Системный cron + wp-cron.php | Точный запуск по расписанию, надежность | Требует доступа к серверу, настройка сложнее |
| Плагины планировщиков (Action Scheduler и др.) | Управление очередями, повторяющиеся задачи, надежность | Дополнительная нагрузка, требует изучения API |