Что такое WP-Cron и зачем он нужен для отложенных задач
WP-Cron — встроенный механизм планировщика задач в WordPress, который позволяет выполнять определённые действия по расписанию. Это удобно для автоматизации рутинных операций: публикации постов, очистки базы данных, отправки уведомлений и прочего. Однако по умолчанию WP-Cron запускается при каждом визите пользователя, что не гарантирует точное время выполнения и может влиять на производительность.
Диагностика проблем с WP-Cron
Частые признаки проблем с WP-Cron:
- Запланированные задачи не выполняются вовремя (например, отложенная публикация не срабатывает, автоматические очистки не происходят).
- В журнале ошибок или отладке вы видите сообщения об ошибках cron-задач.
- Сайт замедляется при частых визитах из-за постоянного запуска WP-Cron.
Чтобы проверить, работают ли cron-задачи, можно использовать плагин WP Crontrol или выполнить следующий код в файле темы (например, functions.php) для вывода запланированных задач:
add_action('admin_init', function() {
if (current_user_can('manage_options')) {
$crons = _get_cron_array();
echo '<pre>';
print_r($crons);
echo '</pre>';
}
});Если массив пуст или задачи не появляются, значит WP-Cron не работает.
Настройка WP-Cron для надёжного и точного выполнения
Отключение стандартного запуска WP-Cron на каждый запрос
Для снижения нагрузки добавьте в wp-config.php строку, отключающую автоматический запуск:
define('DISABLE_WP_CRON', true);Настройка системного cron для запуска WP-Cron по расписанию
Вместо запуска на каждый запрос настроим системный cron (например, на сервере Linux) для вызова задачи раз в 5 минут:
*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1<Или с помощью curl:
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Замените https://example.com на адрес вашего сайта.
Регистрация собственной задачи WP-Cron
Чтобы добавить пользовательскую задачу, нужно зарегистрировать событие и функцию-обработчик. Например, ежедневная очистка временных данных:
function clear_temporary_data() {
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_temp_%'");
}
add_action('clear_temp_hook', 'clear_temporary_data');
function schedule_clear_temp() {
if (!wp_next_scheduled('clear_temp_hook')) {
wp_schedule_event(time(), 'daily', 'clear_temp_hook');
}
}
add_action('wp', 'schedule_clear_temp');Такое решение гарантирует, что очистка будет выполняться раз в сутки.
Проверка результата после внедрения
1. Убедитесь, что в wp-config.php стоит define('DISABLE_WP_CRON', true);
2. Проверьте наличие записи в системном cron (команда crontab -l для текущего пользователя).
3. Запустите cron вручную (например, через терминал или браузер) по адресу https://example.com/wp-cron.php?doing_wp_cron, чтобы проверить выполнение.
4. Включите временный лог для вашей задачи, чтобы убедиться, что она срабатывает:
function clear_temporary_data() {
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_temp_%'");
error_log('Temporary data cleared at ' . date('Y-m-d H:i:s'));
}Проверьте логи сервера (например, error.log), чтобы увидеть записи.
Частые ошибки и их исправление
- Запланированная задача не создаётся: проверьте, что функция
schedule_clear_tempвызывается — лучше использовать хукinitвместоwpдля раннего запуска. - Системный cron не срабатывает: убедитесь, что команда в crontab корректна и имеет права на выполнение; проверьте путь к
wgetилиcurl. - WP-Cron запускается при каждом запросе: проверьте, что
DISABLE_WP_CRONопределён и серверный cron настроен правильно. - Ошибки доступа при вызове
wp-cron.php: убедитесь, что URL доступен, нет блокировок по IP или firewall.
Практические советы по безопасности и производительности
- Для вызова
wp-cron.phpиспользуйте HTTPS — это защитит от перехвата и подделки запросов. - Ограничьте частоту запуска системного cron — 5 минут оптимальны на большинстве сайтов, реже для сайтов с низкой активностью.
- Избегайте тяжелых задач в WP-Cron, лучше разбивайте их на мелкие части.
- Регулярно очищайте устаревшие и неиспользуемые cron-задачи, чтобы избежать накопления мусора.
Сравнение способов запуска WP-Cron
| Метод | Плюсы | Минусы | Рекомендуем для |
|---|---|---|---|
| Автозапуск на каждый запрос (по умолчанию) | Простота настройки, нет необходимости в серверных правах | Нет гарантии точного времени, нагрузка при большом трафике | Маленькие сайты с низкой нагрузкой |
| Системный cron (Linux cron) | Точное выполнение, меньше нагрузки сайта | Требует доступа к серверу и базовых навыков работы с crontab | Любые сайты с доступом к серверу |
| Внешние сервисы (например, EasyCron) | Не нужен доступ к серверу, удобный интерфейс | Зависимость от стороннего сервиса, возможные ограничения | Хостинги без доступа к cron |