В WordPress часто возникает необходимость запускать определённые задачи не сразу, а с отложенным запуском — например, отправлять уведомления, обновлять кеш или выполнять фоновые процессы. Для этого обычно используют встроенную систему планировщика задач WP-Cron. Однако не всегда удобно жестко задавать время или частоту запуска задачи: часто полезно дать пользователю плагина возможность самому настраивать эти параметры через панель администратора.
Почему важно реализовать настройку отложенного запуска в плагине WordPress
Если плагин выполняет ресурсоёмкие операции, запуск которых не должен происходить при каждом запросе, лучше вынести их в отложенный режим. Это разгружает сервер и улучшает пользовательский опыт. Но жёстко зашитые интервалы могут не подходить для всех сайтов, поэтому настройка времени запуска через интерфейс — это гибкость и удобство.
Кроме того, WP-Cron зависит от активности посетителей сайта — задача запускается при посещении, что не идеально для сайтов с низкой посещаемостью. Давая возможность отключать WP-Cron и запускать задачи вручную или с помощью системного cron, мы расширяем возможности плагина.
Создаем страницу настроек плагина с выбором интервала запуска задачи
Для начала необходимо добавить страницу настроек в админ-панель и вывести на ней поле выбора интервала запуска (например, раз в час, раз в сутки, раз в неделю). Для хранения настроек используем стандартное API WordPress — функцию register_setting и опции.
function wpplugins_register_settings() {
register_setting('wpplugins_settings_group', 'wpplugins_cron_interval');
add_settings_section('wpplugins_section', 'Настройки отложенного запуска', null, 'wpplugins_settings');
add_settings_field('wpplugins_cron_interval', 'Интервал запуска задачи', 'wpplugins_cron_interval_callback', 'wpplugins_settings', 'wpplugins_section');
}
add_action('admin_init', 'wpplugins_register_settings');
function wpplugins_cron_interval_callback() {
$value = get_option('wpplugins_cron_interval', 'hourly');
?>
<select name="wpplugins_cron_interval">
<option value="hourly" <?php selected($value, 'hourly'); ?>>Ежечасно</option>
<option value="daily" <?php selected($value, 'daily'); ?>>Раз в сутки</option>
<option value="weekly" <?php selected($value, 'weekly'); ?>>Раз в неделю</option>
</select>
<?php
}Далее добавим меню для вывода этой страницы:
function wpplugins_add_settings_page() {
add_options_page('Настройки WPPlugins', 'WPPlugins', 'manage_options', 'wpplugins_settings', 'wpplugins_render_settings_page');
}
add_action('admin_menu', 'wpplugins_add_settings_page');
function wpplugins_render_settings_page() {
?>
<div class="wrap">
<h1>Настройки отложенного запуска WPPlugins</h1>
<form method="post" action="options.php">
<?php
settings_fields('wpplugins_settings_group');
do_settings_sections('wpplugins_settings');
submit_button();
?>
</form>
</div>
<?php
}Реализация пользовательских интервалов для WP-Cron
WordPress по умолчанию поддерживает интервалы 'hourly', 'twicedaily' и 'daily'. Чтобы расширить набор интервалов, например, добавить недельный, используем фильтр cron_schedules:
function wpplugins_custom_cron_schedules($schedules) {
if (!isset($schedules['weekly'])) {
$schedules['weekly'] = array(
'interval' => 604800, // 7 дней в секундах
'display' => __('Раз в неделю')
);
}
return $schedules;
}
add_filter('cron_schedules', 'wpplugins_custom_cron_schedules');Теперь можно использовать значение 'weekly' в настройках интервала.
Запланировать и перезапланировать событие в зависимости от настроек пользователя
При активации плагина или изменении настроек нужно создать или обновить событие WP-Cron с выбранным интервалом. Для этого используем функции wp_schedule_event и wp_clear_scheduled_hook.
function wpplugins_schedule_cron_job() {
$interval = get_option('wpplugins_cron_interval', 'hourly');
$hook = 'wpplugins_cron_task';
// Удаляем старое событие
if (wp_next_scheduled($hook)) {
wp_clear_scheduled_hook($hook);
}
// Запланировать новое событие
wp_schedule_event(time(), $interval, $hook);
}
add_action('wpplugins_cron_interval_changed', 'wpplugins_schedule_cron_job');
register_activation_hook(__FILE__, 'wpplugins_schedule_cron_job');
register_deactivation_hook(__FILE__, function() {
wp_clear_scheduled_hook('wpplugins_cron_task');
});Чтобы отслеживать изменение интервала в настройках и запускать функцию перезапуска планировщика, добавим:
function wpplugins_save_settings($old_value, $value, $option) {
if ($option === 'wpplugins_cron_interval' && $old_value !== $value) {
do_action('wpplugins_cron_interval_changed');
}
}
add_action('update_option', 'wpplugins_save_settings', 10, 3);Реализация самой отложенной задачи и примеры использования
Теперь создадим функцию, которая будет запускаться по расписанию. Например, она может чистить устаревшие записи или отправлять отчеты.
function wpplugins_cron_task_function() {
// Пример: удаляем записи из таблицы wp_wpplugins_logs старше 30 дней
global $wpdb;
$table = $wpdb->prefix . 'wpplugins_logs';
$wpdb->query($wpdb->prepare("DELETE FROM $table WHERE log_date < %s", date('Y-m-d H:i:s', strtotime('-30 days'))));
// Можно добавить логику отправки почты, очистки кеша и т.д.
}
add_action('wpplugins_cron_task', 'wpplugins_cron_task_function');Этот пример демонстрирует, как удобно связать пользовательские настройки с функционалом отложенного запуска, давая пользователю контроль над интервалом и обеспечивая удобное управление задачами.
Советы по оптимизации и отладке WP-Cron
1. Для сайтов с низкой посещаемостью лучше отключить WP-Cron и настроить системный cron на выполнение файла wp-cron.php с нужной периодичностью. Это повышает надежность запуска задач.
2. Используйте плагины для мониторинга WP-Cron, например, WP Crontrol, чтобы видеть и управлять запланированными событиями.
3. При отладке включайте логирование в задаче, чтобы понимать, когда и как она срабатывает.
4. Для плагинов из каталога WPSHOP, например, Clearfy Pro, можно создавать аналогичные настройки для отложенных операций, повышая удобство пользователей.
Заключение
Создание настройки плагина WordPress для управления отложенным запуском — важный шаг к гибкому и оптимальному исполнению фоновых задач. Используя описанный подход, вы сможете легко внедрить функционал с настраиваемыми интервалами, что повысит удобство и производительность вашего решения.