WP-Cron отвечает за отложенные задачи в WordPress: отправку писем, публикацию материалов, очистку временных данных, синхронизацию и работу плагинов. В отличие от системного cron, WP-Cron обычно запускается во время посещения сайта.
После удаления или замены плагина его запланированные события не всегда исчезают автоматически. В расписании cron могут оставаться хуки, для которых обработчики уже отсутствуют. Это создает лишние попытки запуска, усложняет диагностику и может увеличивать нагрузку на сайт. Ниже приведен безопасный алгоритм проверки и очистки таких событий.
Что такое WP-Cron и почему в нем накапливаются ненужные события
WP-Cron — это встроенный планировщик задач WordPress. Плагин или тема регистрирует событие, указывая имя hook, время первого запуска и периодичность. Когда на сайт поступает запрос, WordPress проверяет, какие задачи уже пора выполнить, и запускает соответствующие callback-функции.
Проблема возникает, когда плагин создает событие, но при деактивации или удалении не отменяет его. Причиной также могут быть ошибки в коде, дублирование событий после повторной активации плагина или одноразовые задачи, которые не завершились корректно.
Наличие старого события не всегда означает критическую проблему. Сначала нужно выяснить, кому принадлежит hook, активен ли соответствующий компонент и действительно ли задача больше не нужна.
- события, связанные с уже удаленным плагином;
- одноразовые задачи с временем запуска в прошлом;
- дубликаты одного hook, созданные несколько раз;
- события со слишком коротким интервалом, например каждую минуту, если это не предусмотрено логикой плагина;
- задачи, которые постоянно появляются снова после удаления.
Как просмотреть список событий WP-Cron через WP-CLI
Перед очисткой создайте резервную копию базы данных или убедитесь, что на сервере доступна актуальная копия. Команды WP-CLI нужно выполнять из каталога WordPress либо указывать правильный путь к установке с помощью параметра --path.
Для просмотра запланированных событий используйте:
wp cron event list --fields=hook,time,next_run_gmt,recurrence
На что обратить внимание в выводе
В столбце hook указано техническое имя события. По нему часто можно определить плагин или функциональный модуль, которому оно принадлежит. Поле next_run_gmt показывает ближайшее время запуска в часовом поясе GMT, поэтому не путайте его с локальным временем сервера или сайта.
Поле recurrence помогает отличить периодические события от одноразовых. Если время запуска события уже прошло, это еще не доказывает наличие неисправности: задача могла ожидать следующего cron-запроса или быть временно заблокирована. Анализируйте контекст, а не удаляйте все просроченные записи без проверки.
- запишите названия подозрительных hook перед удалением;
- сравните список с перечнем активных плагинов и mu-plugin;
- проверьте, не принадлежит ли событие WordPress Core, WooCommerce, теме или сервису синхронизации;
- обратите внимание на количество одинаковых событий и частоту их повторения.
Как определить владельца подозрительного события
Имя hook не всегда напрямую совпадает с названием плагина. Разработчик может использовать сокращение, название внутреннего модуля или собственный префикс. Поэтому перед удалением найдите регистрацию события в файлах активных компонентов.
Искать нужно вызовы wp_schedule_event(), wp_schedule_single_event(), wp_schedule_single_event() и функций отмены wp_clear_scheduled_hook() или wp_unschedule_event(). На сервере с доступной командой grep поиск может выглядеть так:
grep -R "wp_schedule_event\|wp_schedule_single_event\|wp_clear_scheduled_hook" wp-content/plugins wp-content/mu-plugins wp-content/themes
Проверка кода и документации
Если hook найден в файлах активного плагина, не удаляйте его автоматически. Сначала проверьте, не является ли он штатной задачей. Одни плагины регистрируют событие только после определенного действия, другие — при каждой загрузке WordPress.
Особенно внимательно проверяйте события WooCommerce, резервного копирования, кеширования, рассылок, импорта товаров и интеграций с внешними API. Их удаление может остановить важный процесс, даже если название hook кажется непонятным.
- деактивированный плагин — веский признак того, что его старые события можно удалить, но сначала проверьте зависимости;
- mu-plugin нужно анализировать отдельно, поскольку он не отключается стандартным способом;
- если событие принадлежит теме, оно может исчезнуть или появиться снова после смены темы;
- событие, которое регистрируется заново после каждого запроса, требует исправления кода, а не многократного удаления.
Как безопасно удалить ненужное событие WP-Cron
После того как владелец hook установлен и вы убедились, что задача больше не нужна, ее можно удалить через WP-CLI. Параметр --all удаляет все запланированные экземпляры события с таким hook, поэтому используйте его только после проверки.
wp cron event delete plugin_task --all
Удаление конкретного экземпляра
Если нужно удалить не все события, а только одно, сначала просмотрите его точное время и используйте адресное удаление. В разных версиях WP-CLI доступны параметры для работы с hook и timestamp, поэтому перед выполнением проверьте справку конкретной команды:
wp help cron event delete
Чего не следует делать
Не очищайте весь массив cron непосредственно в базе данных и не удаляйте опцию cron вручную через SQL. Данные WP-Cron хранятся во внутренней структуре WordPress, и грубая очистка может нарушить работу легитимных запланированных задач.
Не удаляйте все hook с подозрительным словом в названии с помощью массовых скриптов, если их происхождение не проверено. Безопаснее обработать несколько конкретных событий и проверить результат.
- не удаляйте события Core, WooCommerce и активных критически важных плагинов без документации;
- не запускайте очистку на рабочем сайте без резервной копии;
- не считайте любое событие с прошедшим временем запуска ненужным;
- не редактируйте вручную сериализованные данные cron в таблице options.
Проверка после очистки
После удаления запустите задачи, срок выполнения которых уже наступил. Это поможет обнаружить ошибки активных компонентов и убедиться, что WordPress может обрабатывать текущее расписание cron.
wp cron event run --due-now
Что проверить после выполнения команды
Просмотрите вывод WP-CLI, журналы PHP и журнал веб-сервера. Если во время выполнения появляются ошибки callback, обратите внимание на название hook и плагин, который его вызывает.
Через некоторое время снова выведите список событий. Если удаленный hook не вернулся, очистка, скорее всего, выполнена успешно. Если он появился снова, активный код повторно регистрирует это событие.
- проверьте работу отправки писем, импорта, синхронизации и других связанных процессов;
- убедитесь, что количество дубликатов не увеличивается;
- проверяйте cron в период низкой нагрузки, если сайт посещает много пользователей;
- зафиксируйте название hook, время проверки и выполненные команды для дальнейшей диагностики.
Что делать, если событие появляется снова
Повторное появление события означает, что какой-то код регистрирует его заново. Это может быть активный плагин, тема, mu-plugin или оставшийся фрагмент пользовательского кода. В таком случае удаление через WP-CLI лишь временно убирает результат, но не устраняет причину.
Найдите вызов wp_schedule_event() или wp_schedule_single_event() и проверьте условия его выполнения. Типичная ошибка — регистрация периодического события при каждой загрузке WordPress без проверки, существует ли оно уже. Другая проблема — отсутствие wp_clear_scheduled_hook() при деактивации плагина.
Если после удаления плагина его hook продолжает возвращаться, проверьте mu-plugins, drop-in-файлы, код темы и остатки пользовательской интеграции. В сложных случаях временно отключите подозрительные компоненты на тестовой копии сайта и сравните списки событий.
- исправьте регистрацию события, если она создает дубликаты;
- добавьте корректную отмену cron-событий при деактивации собственного плагина;
- проверьте, не создается ли одноразовая задача повторно после неудачного запуска;
- для критически важных сайтов сначала тестируйте изменения на staging-среде.
Когда стоит настроить системный cron
На сайтах с большим трафиком или большим количеством задач запуск WP-Cron через посещения может быть нестабильным: события выполняются с задержкой или несколько задач запускаются одновременно. В такой ситуации часто отключают автоматический запуск WP-Cron во время веб-запросов и настраивают системный cron на сервере.
Это не заменяет очистку ненужных событий. Системный cron лишь обеспечивает регулярный запуск планировщика, но не исправляет неправильную регистрацию hook, дубликаты или остатки удаленных плагинов. Конкретный способ настройки зависит от хостинга, доступа по SSH и конфигурации WordPress.
- сначала очистите очевидно ненужные события;
- проверьте, какие задачи должны выполняться и с какой частотой;
- согласуйте изменения с администратором сервера или хостинг-провайдером;
- после перехода контролируйте журналы и фактическое время выполнения задач.
Частые вопросы
Можно ли удалить все события WP-Cron и позволить плагинам создать их заново?
Это опасный подход. Часть событий принадлежит WordPress Core, WooCommerce или важным интеграциям и может не восстановиться автоматически. Удаляйте только конкретные hook, назначение которых проверено.
Является ли просроченное событие WP-Cron ошибкой?
Не обязательно. Оно может ожидать следующего запуска WP-Cron, особенно если сайт посещает мало пользователей или cron работает с задержкой. Сначала проверьте, выполняется ли событие через wp cron event run --due-now и появляются ли ошибки.
Как понять, какому плагину принадлежит hook?
Сравните его название с активными компонентами и найдите в файлах вызовы wp_schedule_event() и wp_schedule_single_event(). Также проверьте mu-plugins, тему и пользовательский код.
Почему удаленное событие появляется снова?
Его повторно регистрирует активный плагин, тема, mu-plugin или другой код. Нужно найти место вызова планировщика и исправить логику регистрации, а не постоянно удалять hook вручную.
Вывод
Безопасная очистка WP-Cron начинается не с массового удаления, а с инвентаризации событий и определения их владельцев. Просмотрите список через WP-CLI, проверьте подозрительные hook в коде, удаляйте только подтвержденные остатки, а затем запустите просроченные задачи.
Если событие возвращается, проблема заключается в коде, который его регистрирует. Устранение этой причины вместе с регулярной проверкой расписания cron поможет избежать дубликатов, ошибок callback и лишней нагрузки на WordPress.