WP-Cron — это встроенный механизм WordPress для управления задачами, которые должны выполняться периодически или с задержкой. В отличие от системного cron на сервере, WP-Cron запускается только тогда, когда кто-то посещает сайт, что порой приводит к задержкам и пропуску важных задач. В этой статье разберём, как правильно использовать WP-Cron для отложенных задач, повысить его надёжность и избежать типичных ошибок.
Что такое WP-Cron и зачем он нужен для отложенных задач
WP-Cron — это PHP-эмуляция системного cron в WordPress. Он позволяет разработчикам и администраторам сайта планировать выполнение функций в будущем: например, отправку писем, обновление данных или очистку кэша. Планировщик запускает задачи по расписанию, используя внутренние механизмы WordPress.
Однако, поскольку WP-Cron запускается только при посещении сайта, если трафика нет, задачи не выполняются вовремя. Это особенность, которую нужно учитывать при настройке.
WP-Cron подходит, если на сайте есть регулярные посетители, но для сайтов с низким трафиком рекомендуется настроить системный cron, вызывающий wp-cron.php по расписанию.
Как создавать и планировать отложенные задачи с помощью WP-Cron
Регистрация собственной задачи с функцией и расписанием
Для начала создадим свою функцию, которая будет выполняться по расписанию. Например, пусть это будет функция wptemp_custom_cron_task(), которая пишет в лог дату и время запуска.
function wptemp_custom_cron_task() {
if ( defined('WP_DEBUG') && WP_DEBUG ) {
error_log('WP-Cron задача выполнена: ' . current_time('mysql'));
}
}
add_action('wptemp_custom_cron_hook', 'wptemp_custom_cron_task');Теперь нужно зарегистрировать событие с помощью wp_schedule_event(). Обычно это делается при активации плагина или темы, чтобы не создавать дубликаты:
function wptemp_activate_cron() {
if ( ! wp_next_scheduled('wptemp_custom_cron_hook') ) {
wp_schedule_event(time(), 'hourly', 'wptemp_custom_cron_hook');
}
}
register_activation_hook(__FILE__, 'wptemp_activate_cron');
function wptemp_deactivate_cron() {
$timestamp = wp_next_scheduled('wptemp_custom_cron_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wptemp_custom_cron_hook');
}
}
register_deactivation_hook(__FILE__, 'wptemp_deactivate_cron');В этом примере мы планируем запуск функции каждый час.
Добавление собственного интервала расписания
По умолчанию WordPress поддерживает только несколько интервалов: hourly (час), twicedaily (два раза в день), daily (день). Для других интервалов можно добавить свой, используя фильтр cron_schedules:
function wptemp_custom_cron_intervals($schedules) {
$schedules['every_five_minutes'] = array(
'interval' => 300, // 5 минут в секундах
'display' => __('Каждые 5 минут')
);
return $schedules;
}
add_filter('cron_schedules', 'wptemp_custom_cron_intervals');Теперь можно использовать 'every_five_minutes' как интервал при планировании задач.
Практические советы по надежной работе WP-Cron
Отключение встроенного WP-Cron и запуск по системному Cron
Чтобы избежать зависимостей от посещений сайта, рекомендуют отключить встроенный WP-Cron и настроить системный cron-запуск. Для этого в wp-config.php добавьте:
define('DISABLE_WP_CRON', true);Далее на сервере нужно создать cron-задачу, например, вызывающую wp-cron.php каждые 5 минут:
*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1<Это обеспечит выполнение задач по расписанию без участия посетителей сайта.
Диагностика и отладка задач WP-Cron
Если задачи не выполняются, проверьте:
- Активность задач в базе — посмотреть в таблице
wp_optionsпод ключомcron. - Ошибки в логах — добавьте логирование в функции задач.
- Совместимость с плагинами безопасности, которые могут блокировать wp-cron.php.
Для удобства можно использовать плагины, например, WP Crontrol — он позволяет просматривать, редактировать и запускать задачи вручную.
Пример использования WP-Cron для автоматического удаления устаревших ревизий
Рассмотрим практическую задачу: регулярно удалять ревизии записей старше 30 дней, чтобы оптимизировать базу данных.
function wptemp_delete_old_revisions() {
global $wpdb;
$date = date('Y-m-d H:i:s', strtotime('-30 days'));
$revisions = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM $wpdb->posts WHERE post_type = 'revision' AND post_date < %s",
$date
));
if (!empty($revisions)) {
foreach ($revisions as $revision_id) {
wp_delete_post($revision_id, true);
}
}
}
add_action('wptemp_delete_revisions_hook', 'wptemp_delete_old_revisions');
function wptemp_schedule_revision_cleanup() {
if (!wp_next_scheduled('wptemp_delete_revisions_hook')) {
wp_schedule_event(time(), 'daily', 'wptemp_delete_revisions_hook');
}
}
add_action('wp', 'wptemp_schedule_revision_cleanup');Этот код создаёт ежедневную задачу, которая удаляет старые ревизии. Для повышения надежности рекомендуется использовать системный cron, как описано выше.
Интеграция WP-Cron с плагинами WPShop для расширения функционала
Если вы используете на сайте плагины из WPShop, например, для рассылок или отзывов, WP-Cron поможет автоматизировать их задачи.
Например, для плагина WPRemark можно настроить периодическую отправку напоминаний пользователям, используя собственные хуки и задачи WP-Cron.
Важно убедиться, что задачи плагинов запускаются вовремя — для этого настройте системный cron и проверяйте состояние задач через WP Crontrol.