В WordPress часто требуется выполнять периодические задачи, например, очистку базы данных, отправку рассылок или обновление информации. Обычно для этого используют плагины, но иногда хочется обойтись без них, чтобы снизить нагрузку, избежать конфликтов и повысить безопасность. В этой статье разберём, как создать и использовать автоматические задачи (cron jobs) в WordPress без плагинов, используя встроенный механизм WP-Cron и системные cron-задания.
Что такое WP-Cron и как он работает в WordPress
WP-Cron — это собственный планировщик задач WordPress, который имитирует работу системного cron. Он запускается при каждом посещении сайта: если настало время для выполнения запланированной задачи, она выполняется в этот момент. Это удобно, но имеет недостатки:
- Задачи могут не выполняться вовремя, если на сайт долго не заходят посетители.
- При большом количестве задач или посетителей WP-Cron может создавать нагрузку и замедлять сайт.
Чтобы обойти эти ограничения, можно отключить встроенный WP-Cron и настроить системный cron на сервере для вызова wp-cron.php по расписанию.
Отключение WP-Cron и настройка системного cron
Для отключения автоматического запуска WP-Cron при посещении сайта добавьте в wp-config.php строку:
define('DISABLE_WP_CRON', true);Далее создайте системное cron-задание на сервере, которое будет вызывать скрипт wp-cron.php с нужной периодичностью, например, каждую минуту:
* * * * * 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Это гарантирует, что задачи будут запускаться регулярно и вовремя, независимо от посещаемости сайта.
Как создавать и регистрировать свои задачи в WP-Cron
Чтобы добавить новую задачу, нужно зарегистрировать событие и назначить функцию-обработчик. В WordPress для этого есть функции wp_schedule_event, add_action и wp_clear_scheduled_hook.
Пример: создадим задачу, которая будет запускаться раз в час и выполнять нужные действия.
function wpcode_schedule_my_task() {
if (!wp_next_scheduled('wpcode_hourly_task_hook')) {
wp_schedule_event(time(), 'hourly', 'wpcode_hourly_task_hook');
}
}
add_action('wp', 'wpcode_schedule_my_task');
function wpcode_do_hourly_task() {
// Ваш код, который необходимо выполнять каждый час
error_log('WPCode: Часовая задача выполнена в ' . current_time('mysql'));
}
add_action('wpcode_hourly_task_hook', 'wpcode_do_hourly_task');Объяснение кода:
wpcode_schedule_my_taskпроверяет, есть ли уже запланированное событиеwpcode_hourly_task_hook. Если нет — создаёт его.- Событие запускается раз в час (аргумент
hourly— встроенный интервал). wpcode_do_hourly_task— функция, которая будет вызвана при запуске события. Здесь можно размещать любой код.
Добавление пользовательских интервалов для расписания WP-Cron
По умолчанию доступны интервалы: hourly (час), twicedaily (12 часов), daily (сутки). Если нужен свой интервал, добавьте фильтр:
function wpcode_custom_cron_intervals($schedules) {
$schedules['every_five_minutes'] = array(
'interval' => 300, // 300 секунд = 5 минут
'display' => __('Каждые 5 минут')
);
return $schedules;
}
add_filter('cron_schedules', 'wpcode_custom_cron_intervals');Теперь можно использовать этот интервал при планировании:
wp_schedule_event(time(), 'every_five_minutes', 'wpcode_five_minute_task_hook');Примеры полезных автоматических задач для WordPress
Ниже — несколько идей, которые можно реализовать через автоматические задачи без плагинов.
1. Очистка временных данных и транзиентов
Транзиенты — временные данные для кеширования. Их нужно периодически очищать, чтобы не засорять базу.
function wpcode_clear_expired_transients() {
global $wpdb;
$time = time();
$transients = $wpdb->get_col("SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_timeout_%' AND option_value < $time");
foreach ($transients as $transient) {
$key = str_replace('_transient_timeout_', '', $transient);
delete_transient($key);
}
error_log('WPCode: Очистка транзиентов выполнена');
}
add_action('wpcode_daily_task_hook', 'wpcode_clear_expired_transients');Эту функцию можно запланировать на ежедневный запуск.
2. Автоматический экспорт данных
Например, экспорт заказов WooCommerce для бухгалтерии.
function wpcode_export_wc_orders() {
if (!class_exists('WooCommerce')) {
return;
}
// Здесь можно добавить код для выборки и экспорта заказов в CSV или XML
error_log('WPCode: Экспорт заказов WooCommerce выполнен');
}
add_action('wpcode_daily_task_hook', 'wpcode_export_wc_orders');Отладка и проверка работы автоматических задач
Чтобы проверить, что задача запланирована, используйте функцию wp_next_scheduled:
$next_time = wp_next_scheduled('wpcode_hourly_task_hook');
if ($next_time) {
echo 'Следующий запуск: ' . date('Y-m-d H:i:s', $next_time);
} else {
echo 'Задача не запланирована';
}Для принудительного запуска задачи можно использовать функцию do_action:
do_action('wpcode_hourly_task_hook');Также рекомендуем вести логирование в файлы или использовать error_log для отладки.
Использование WP-Cron с плагином Clearfy Pro для оптимизации
Плагин Clearfy Pro помогает оптимизировать работу WP-Cron: отключить ненужные задачи, управлять расписанием и повышать производительность сайта. Подробнее о плагине и его возможностях можно узнать на wpshop.ru.