Одной из ключевых задач при разработке и поддержке сайта на WordPress является автоматизация периодических процессов — таких как очистка кэша, отправка email-рассылок, обновление данных и многое другое. Часто для этого используют плагины, однако избыточное количество расширений может замедлять сайт и создавать угрозы безопасности. В этой статье мы подробно разберем, как настроить отложенный запуск задач в WordPress без плагинов, используя WP-Cron и системные cron-задания.
Что такое WP-Cron и почему его иногда недостаточно
WP-Cron — это встроенная в WordPress система имитации cron-задач. Она запускает запланированные задачи при обращении к сайту, то есть при загрузке любой страницы. Это удобно, но имеет ряд ограничений:
- Задачи запускаются только при посещении сайта, что приводит к задержкам, если посещаемость низкая.
- При высокой нагрузке WP-Cron может создавать дополнительную нагрузку на сервер.
- Точность запуска задач не гарантирована, из-за чего нельзя рассчитывать на выполнение в строго заданное время.
Если ваш сайт требует более надежного и точного выполнения задач, стоит перейти к использованию системных cron-заданий с отключением имитации WP-Cron.
Отключение стандартного WP-Cron и настройка системного cron
Деактивация WP-Cron в WordPress
Для отключения встроенного WP-Cron откройте файл wp-config.php в корне вашего сайта и добавьте следующую строку, желательно перед строкой /* That's all, stop editing! Happy blogging. */:
define('DISABLE_WP_CRON', true);
Это отключит автоматический запуск cron-задач при загрузке страниц.
Настройка системного cron на сервере
Теперь необходимо настроить системный cron, который будет запускать WordPress cron через curl или wget. В Linux-системах используйте команду crontab -e для редактирования crontab.
Добавьте следующую строку, которая будет запускать cron каждые 5 минут:
*/5 * * * * curl -s https://yelly.ru/wp-cron.php?doing_wp_cron > /dev/null 2>&1
Или с помощью wget:
*/5 * * * * wget -q -O - https://yelly.ru/wp-cron.php?doing_wp_cron > /dev/null 2>&1
Таким образом, системный cron будет регулярно запускать задания WordPress независимо от посещений сайта.
Создание собственной отложенной задачи в WordPress с префиксом yelly
Для примера создадим задачу, которая будет ежедневно очищать определенную таблицу базы данных. Для этого нужно зарегистрировать событие и функцию-обработчик.
Регистрация события
Добавьте следующий код в файл functions.php вашей темы или в файл кастомного плагина:
function yelly_schedule_daily_cleanup() {
if (!wp_next_scheduled('yelly_daily_cleanup_event')) {
wp_schedule_event(time(), 'daily', 'yelly_daily_cleanup_event');
}
}
add_action('wp', 'yelly_schedule_daily_cleanup');
Этот код проверяет, запланировано ли событие, и если нет — регистрирует его на ежедневный запуск.
Обработка события
Теперь создадим функцию, которая будет вызываться при срабатывании cron:
function yelly_do_daily_cleanup() {
global $wpdb;
$table_name = $wpdb->prefix . 'yelly_custom_data';
$deleted = $wpdb->query("DELETE FROM $table_name WHERE date < NOW() - INTERVAL 30 DAY");
if ($deleted !== false) {
error_log("[Yelly] Daily cleanup: удалено записей - " . $deleted);
} else {
error_log("[Yelly] Daily cleanup: ошибка при удалении данных");
}
}
add_action('yelly_daily_cleanup_event', 'yelly_do_daily_cleanup');
В данном примере мы удаляем записи старше 30 дней из кастомной таблицы yelly_custom_data. Это полезная практика для поддержания базы в актуальном состоянии.
Как проверить и отладить работу cron-задач в WordPress
Чтобы убедиться, что ваши задачи работают корректно, можно использовать несколько подходов:
- Логирование: В примере выше используется
error_logдля записи результатов в системный лог сервера. Это помогает понять, когда и сколько записей было удалено. - Проверка запланированных задач: Используйте плагин WP Crontrol для просмотра, изменения и запуска cron-задач вручную. Его можно использовать временно для отладки, а затем удалить.
- Тестовый запуск: Можно вручную вызвать функцию обработки задачи, например, из консоли или через временный вызов в шаблоне.
Дополнительные советы по оптимизации и безопасности
Защита вызова wp-cron.php
Чтобы предотвратить несанкционированный запуск cron из посторонних источников, можно добавить проверку секретного ключа в URL. Например, измените команду cron на сервере:
*/5 * * * * curl -s https://yelly.ru/wp-cron.php?doing_wp_cron&key=secretkey123 > /dev/null 2>&1
А в файле wp-cron.php или в фильтрах вашего сайта проверяйте наличие и корректность этого ключа. Это повысит безопасность.
Не перегружайте cron тяжелыми задачами
Если задача занимает много времени или ресурсов, лучше разбить ее на несколько меньших или запускать реже. WP-Cron не предназначен для выполнения сложных процессов в реальном времени.
Заключение
Отложенный запуск задач — важный инструмент для эффективного управления сайтом на WordPress. Отключение стандартного WP-Cron и переход на системный cron позволяет добиться более стабильной и точной работы. Создание собственных cron-задач с префиксом yelly_ помогает структурировать код и избегать конфликтов с другими плагинами и темами.
Используйте приведенные примеры для реализации своих автоматизаций и улучшения производительности сайта без лишних плагинов.