WordPress по умолчанию использует систему wp-cron для запуска запланированных задач (cron jobs). Однако, механизм wp-cron срабатывает только при заходе пользователя на сайт, что вызывает постоянные HTTP-запросы (пинги), создавая дополнительную нагрузку на сервер и замедляя работу сайта. В этой статье мы подробно рассмотрим, как реализовать отложенный запуск задач в WordPress без пингов, используя альтернативные методы и примеры кода.
Почему стандартный wp-cron может быть проблемой: минусы пингов
Система wp-cron запускает задачи при каждом посещении сайта, если время для задачи наступило. Это приводит к следующим недостаткам:
- Постоянные HTTP-запросы к самому себе увеличивают нагрузку на сервер и могут замедлять отклик сайта.
- Если на сайт не заходят пользователи долгое время, задачи wp-cron не выполняются вовремя.
- Проблемы с хостингами, которые ограничивают количество запросов или не позволяют запускать cron по расписанию.
Поэтому часто возникает необходимость отключить стандартный wp-cron и заменить его на более эффективный механизм с отложенным запуском задач.
Отключение wp-cron и настройка системного cron
Первый шаг — отключить автоматический запуск wp-cron при загрузке страниц. Для этого в файл wp-config.php добавьте следующую строку:
define('DISABLE_WP_CRON', true);
Далее настроим системный cron на сервере, который будет вызывать wp-cron.php по расписанию, например, раз в 15 минут. Для этого добавьте в crontab следующую строку:
*/15 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Где https://example.com замените на адрес вашего сайта.
Этот способ устраняет лишние пинги, так как задачи запускаются по расписанию сервером.
Реализация отложенного запуска задач без пингов с помощью плагина Clearfy Pro
Если у вас нет доступа к системному cron или вы хотите более гибкое управление, можно использовать плагин Clearfy Pro. Он позволяет оптимизировать wp-cron и уменьшить нагрузку за счёт отложенного запуска и группировки задач.
Плагин автоматически отключает стандартные пинги и заменяет их на более эффективные триггеры. Также Clearfy Pro предоставляет настройки для контроля частоты запуска и приоритетов задач.
Пример функции для отложенного запуска задачи с контролем времени
Рассмотрим пример, как в коде темы или плагина реализовать отложенный запуск задачи с помощью transient API для контроля времени запуска без постоянных пингов.
function wpskills_schedule_deferred_task() {
// Проверяем, когда последний раз запускалась задача
$last_run = get_transient('wpskills_deferred_task_last_run');
if ($last_run !== false && (time() - $last_run) < 900) { // 900 сек = 15 минут
return; // Задача запускалась недавно, пропускаем
}
// Логика задачи
// Например, очистка кэша, обновление данных и т.д.
error_log('WPSkills: Deferred task running at ' . date('Y-m-d H:i:s'));
// Обновляем время последнего запуска
set_transient('wpskills_deferred_task_last_run', time(), 0);
}
// Хук, который срабатывает при init, но задача выполняется не чаще раза в 15 минут
add_action('init', 'wpskills_schedule_deferred_task');
Этот код не запускает задачу при каждом заходе, а только если прошло более 15 минут с последнего запуска. Таким образом снижается количество пингов, и задача выполняется с отложенным запуском.
Использование WP-CLI для запуска задач по расписанию
Если у вас есть доступ к командной строке, можно запускать задачи WordPress через WP-CLI:
wp cron event run --due-now
Это команда запускает все запланированные задачи, срок которых наступил. Настройте системный cron для периодического вызова этой команды без выполнения пингов, что ещё более эффективно.
Выводы и рекомендации
- Отключайте стандартный wp-cron, если хотите избавиться от лишних пингов.
- Настраивайте системный cron для запуска wp-cron.php или WP-CLI команд.
- Используйте плагины, например, Clearfy Pro, для оптимизации и управления задачами.
- Для простых отложенных задач используйте transient API и проверяйте время последнего запуска.
- Обязательно проверяйте логи и корректность работы задач после миграции на новый механизм.