wp-code.ru wordpress WP-Codе

Как создать автоматические задачи (cron) в WordPress без плагинов

WordPress имеет встроенную систему планировщика задач WP-Cron, которая позволяет запускать автоматические действия по расписанию. Однако многие разработчики сталкиваются с проблемами, когда WP-Cron не срабатывает как надо из-за особенностей работы PHP или сервера. В этой статье мы подробно разберём, как создать, настроить и отладить автоматические задачи в WordPress без использования плагинов, чтобы обеспечить стабильную работу и точное выполнение задач.

Что такое WP-Cron и как он работает

WP-Cron — это имитация системного cron, реализованная на уровне PHP в WordPress. По умолчанию планировщик запускается при каждом посещении сайта: при загрузке страницы проверяется, есть ли задачи, которые нужно выполнить. Если есть — запускаются соответствующие функции. Несмотря на удобство, такой подход имеет несколько недостатков:

  • Задачи не запускаются, если сайт не посещают (например, низкий трафик).
  • Задержки в выполнении задач при больших нагрузках.
  • Проблемы с одновременным выполнением и дублированием задач.

Чтобы решить эти вопросы, часто рекомендуется отключить WP-Cron и настроить системный cron на сервере. Но сначала рассмотрим, как создавать задачи в WP-Cron вручную и управлять ими с помощью кода.

Создание и регистрация собственной автоматической задачи в WordPress

Для создания автоматической задачи нужно зарегистрировать событие с помощью функции wp_schedule_event и привязать к нему обработчик. Рассмотрим пример, который выполняет функцию wp_code_clear_expired_cache каждый час.

function wp_code_clear_expired_cache() {
    // Логика очистки устаревшего кэша
    // Здесь можно подключить очистку кэша плагинов или собственных данных
}
add_action('wp_code_hourly_event', 'wp_code_clear_expired_cache');

function wp_code_schedule_hourly_event() {
    if (!wp_next_scheduled('wp_code_hourly_event')) {
        wp_schedule_event(time(), 'hourly', 'wp_code_hourly_event');
    }
}
add_action('wp', 'wp_code_schedule_hourly_event');

Объяснение:

  • wp_schedule_event регистрирует новое событие с интервалом hourly.
  • wp_next_scheduled проверяет, не запланировано ли оно уже, чтобы не создавать дубликаты.
  • add_action связывает событие с пользовательской функцией.
  • Хук wp используется для регистрации события при загрузке сайта.

Как добавить собственный интервал для WP-Cron

Стандартные интервалы — hourly, twicedaily, daily — подходят не всегда. Можно добавить свои. Например, добавим интервал в 10 минут:

function wp_code_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_code_custom_cron_schedules');

Теперь можно использовать every_ten_minutes в wp_schedule_event.

Как отключить WP-Cron и настроить системный cron на сервере

Чтобы избавиться от проблем с запуском WP-Cron по запросу, рекомендуют отключить его и задать системный cron, который будет вызывать WP-Cron регулярно.

Отключение WP-Cron: добавьте в файл wp-config.php перед строкой /* That's all, stop editing! Happy publishing. */ следующую константу:

define('DISABLE_WP_CRON', true);

Настройка системного cron: В панели управления хостингом или через SSH добавьте задачу, например, на выполнение каждые 15 минут:

wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Или через curl:

curl -s https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Это гарантирует запуск cron независимо от посещаемости сайта.

Отладка и мониторинг WP-Cron задач

Чтобы убедиться, что задачи выполняются, можно использовать несколько методов:

  • Плагин WP Crontrol — позволяет смотреть, редактировать и запускать задачи из админки.
  • Логирование выполнения задач через запись в файл или базу данных.
  • Добавление в функцию обработчик записи в лог, например:
function wp_code_clear_expired_cache() {
    // Очистка кэша
    error_log('WP-Code: Очистка кэша выполнена ' . date('Y-m-d H:i:s'));
}

Важно проверять, не дублируются ли задачи и корректно ли удаляются устаревшие.

Практический пример: автоматическое удаление старых ревизий записей

Для примера создадим задачу, которая каждую ночь будет удалять ревизии постов старше 30 дней, чтобы не засорять базу данных.

function wp_code_delete_old_revisions() {
    global $wpdb;
    $days = 30;
    $time = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
    $deleted = $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM $wpdb->posts WHERE post_type = 'revision' AND post_modified < %s",
            $time
        )
    );
    error_log("WP-Code: Удалено $deleted старых ревизий");
}
add_action('wp_code_daily_event', 'wp_code_delete_old_revisions');

function wp_code_schedule_daily_event() {
    if (!wp_next_scheduled('wp_code_daily_event')) {
        wp_schedule_event(time(), 'daily', 'wp_code_daily_event');
    }
}
add_action('wp', 'wp_code_schedule_daily_event');

Этот код создаст задачу, которая ежедневно будет чистить базу от устаревших ревизий, помогая снизить нагрузку и размер базы.

Рекомендации по безопасности и производительности

При работе с WP-Cron учитывайте:

  • Не запускайте ресурсоёмкие задачи слишком часто.
  • Обрабатывайте ошибки в функциях задач, чтобы не прерывать выполнение.
  • Используйте nonce и проверку прав, если задачи связаны с пользовательскими действиями.
  • Для критичных задач лучше настроить системный cron с внешним мониторингом.

Если хотите упростить создание и управление cron-задачами, обратите внимание на плагин Expert Review — он содержит инструменты для мониторинга и оптимизации сайта, включая управление задачами.

×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее