WP-Cron — это встроенный механизм планировщика задач в WordPress, который позволяет запускать определённые действия в заданное время или с определённым интервалом. В этой статье разберём, как правильно использовать WP-Cron, избежать типичных проблем и оптимизировать его работу на вашем сайте.
Что такое WP-Cron и как он работает
WP-Cron не запускается постоянно в фоновом режиме, как системный cron в Linux. Вместо этого он срабатывает при каждом заходе пользователя на сайт, проверяя, есть ли запланированные задачи, которые нужно выполнить. Это удобно для многих сайтов, но может вызывать задержки или пропуски задач при низкой посещаемости.
Механизм работает так: когда пользователь открывает страницу, WordPress проверяет, есть ли просроченные задачи в очереди. Если есть — запускает их выполнение. Это значит, что точное время запуска зависит от трафика сайта, а не от реального времени.
Как правильно регистрировать задачи в WP-Cron
Для добавления собственной задачи в WP-Cron используется функция wp_schedule_event. Важно проверять, что задача не зарегистрирована повторно, иначе будут дубли.
Пример функции регистрации задачи в стиле wp-pro:
function wp_pro_register_daily_event() {
if (!wp_next_scheduled('wp_pro_daily_task')) {
wp_schedule_event(time(), 'daily', 'wp_pro_daily_task');
}
}
add_action('wp', 'wp_pro_register_daily_event');Здесь мы регистрируем задачу wp_pro_daily_task, которая будет выполняться ежедневно. Обратите внимание, что хук wp запускается при каждом заходе, поэтому проверка через wp_next_scheduled обязательна, чтобы не создавать множество одинаковых событий.
Создание собственного интервала времени
Если вам нужны нестандартные интервалы, например каждые 10 минут, добавьте их через фильтр cron_schedules:
function wp_pro_custom_cron_schedules($schedules) {
if (!isset($schedules['every_ten_minutes'])) {
$schedules['every_ten_minutes'] = array(
'interval' => 600, // 600 секунд = 10 минут
'display' => __('Каждые 10 минут')
);
}
return $schedules;
}
add_filter('cron_schedules', 'wp_pro_custom_cron_schedules');Теперь можно использовать этот интервал при планировании задач.
Обработка и выполнение задач
Чтобы задать, что именно должна делать задача, добавьте обработчик на хук события:
function wp_pro_execute_daily_task() {
// Здесь код, который нужно выполнить ежедневно
error_log('WP-Pro: ежедневная задача выполнена в ' . date('Y-m-d H:i:s'));
}
add_action('wp_pro_daily_task', 'wp_pro_execute_daily_task');Так вы сможете отлаживать работу и видеть в логах запуск задачи.
Проблемы с WP-Cron и способы их решения
1. Задачи не запускаются вовремя
Причина — низкий трафик или отсутствие заходов на сайт. Для решения можно отключить внутренний WP-Cron и использовать системный cron (если есть доступ к серверу):
define('DISABLE_WP_CRON', true);Добавьте эту строку в wp-config.php, затем настройте системный cron, например, с запуском команды каждые 5 минут:
*/5 * * * * wget -q -O - 'https://example.com/wp-cron.php?doing_wp_cron' > /dev/null 2>&1Это гарантирует выполнение задач независимо от посещаемости.
2. Дублирование задач
Ошибка часто возникает, если не проверять наличие задачи перед планированием. Используйте wp_next_scheduled как в примерах выше.
3. Задачи выполняются слишком долго
Если в задаче сложные операции, например массовое обновление записей, разбейте её на несколько мелких частей и запускайте с разными интервалами. Это снизит нагрузку на сервер и предотвратит таймауты.
Полезные плагины для работы с WP-Cron
Для удобства мониторинга и управления задачами можно использовать плагины:
- WP Crontrol — позволяет просматривать, редактировать, удалять и запускать задачи вручную.
- Clearfy Pro — улучшает производительность и управление WordPress, в том числе оптимизирует WP-Cron.
Пример: автоматическое удаление старого контента с помощью WP-Cron
Допустим, нужно каждый день удалять записи старше 180 дней. Вот пример кода:
function wp_pro_register_cleanup_event() {
if (!wp_next_scheduled('wp_pro_cleanup_old_posts')) {
wp_schedule_event(time(), 'daily', 'wp_pro_cleanup_old_posts');
}
}
add_action('wp', 'wp_pro_register_cleanup_event');
function wp_pro_cleanup_old_posts() {
global $wpdb;
$days = 180;
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$posts = $wpdb->get_results($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_date < %s AND post_status = 'publish'",
$date
));
foreach ($posts as $post) {
wp_delete_post($post->ID, true);
}
error_log('WP-Pro: удалено старых записей: ' . count($posts));
}
add_action('wp_pro_cleanup_old_posts', 'wp_pro_cleanup_old_posts');Этот код автоматически очищает сайт от устаревшего контента, снижая нагрузку и поддерживая актуальность.
Выводы и рекомендации
WP-Cron — мощный инструмент для автоматизации задач в WordPress, но требует грамотной настройки и контроля. Используйте проверку перед регистрацией задач, создавайте нужные интервалы, следите за выполнением с помощью логов или плагинов. При необходимости подключайте системный cron для стабильности.
Благодаря этим методам вы сможете значительно расширить функциональность вашего сайта и автоматизировать рутинные процессы без потерь производительности.