Вопрос или проблема
Я работаю над плагином для регистрации и планирования различных cron-задач. Я:
- использую WP Crontrol (только чтобы увидеть все мои cron-задачи и переопределить их при необходимости)
- установил серверную cron-задачу и определил
define('DISABLE_WP_CRON', true);
Когда я зашел в ‘Cron Events’ в Crontrol, я увидел, что некоторые функции добавлены буквально сотни раз. Конкретно в ‘Cron Events’ регистрируется/отображается функция, а не хук. Упрощенная версия моего кода:
class My_Cron_Manager {
/**
* Конструктор
*/
public function __construct() {
add_filter( 'wp', array( $this, 'my_schedule_cron_jobs' ) );
add_action( 'my_cron_event_func', array( $this, 'my_cron_job_func' ));
}
/**
* Планирование cron-задач
*/
public static function my_schedule_cron_jobs() {
if (! wp_next_scheduled ( 'my_cron_job_func' )) {
wp_schedule_event(time(), 'twicedaily', 'my_cron_job_func');
};
}
/**
* Моя функция
*/
public static function my_cron_job_func() {
// Выполнение задачи
}
}
new My_Cron_Manager();
Я подозреваю, что у меня была ошибка в коде, которая повторно регистрировала функцию, но я не совсем уверен. Правильно ли я использую wp_next_scheduled
и wp_schedule_event
?
Может кто-нибудь, пожалуйста, ответит, вызывает ли мой код дублирование регистрации хуков/функций?
Заранее спасибо!
Хорошо, я считаю, что сделал все правильно. Было бы интересно узнать, если у кого-то есть дополнительные соображения, но, как мне кажется, происходило следующее:
- Я неправильно вызывал свой класс
- Я ссылался на функцию класса в
wp_next_scheduled
иwp_schedule_event
, когда должен был ссылаться на обратный вызов/хук.
Мой пересмотренный код (который был протестирован и я могу подтвердить, что работает).
define( 'MY_CRON_FILE', __FILE__ );
class MY_Cron_Manager {
/**
* Подключение методов.
*/
public static function init() {
register_activation_hook( MY_CRON_FILE, array(__CLASS__, 'my_schedule_cron_jobs' ));
add_action( 'my_cron_job_event_func', array( __CLASS__, 'my_cron_job_func' )); //
}
/**
* Планирование cron-задач
*/
public static function my_schedule_cron_jobs() {
if (! wp_next_scheduled ( 'my_cron_job_event_func' )) {
wp_schedule_event(time(), 'twicedaily', 'my_cron_job_event_func');
};
}
/**
* Моя функция
*/
public static function my_cron_job_func() {
// Выполнение задачи
}
}
MY_Cron_Manager::init();
Ответ или решение
Вопрос об использовании функций wp_next_scheduled
и wp_schedule_event
в вашем плагине для управления cron задачами в WordPress действительно актуален. Давайте подробно разберём вашу ситуацию, учитывая предоставленный вами код и комментарии.
Проблема дублирования Cron задач:
Согласно вашему описанию, вы столкнулись с проблемой дублирования функций в списке Cron событий, что, вероятно, связано с неправильной регистрацией задач cron. Рассмотрим, как ваш первоначальный код мог привести к этой проблеме и какие изменения вы внесли для её устранения.
Техника решения:
-
Изначальный код:
- В начале вы регистрировали фильтр
'wp'
, который выполнял функциюmy_schedule_cron_jobs
. Если страница была перезагружена или обращение к серверу происходило многократно, задача cron могла регистрироваться многократно из-за неправильной логики проверки, какой именно хуку функция подвязана.
- В начале вы регистрировали фильтр
-
Ошибки и их причины:
- Использование метода крон инициализации в конструкторе класса, где он мог вызываться неоднократно, если класс создавался несколько раз, что и стало причиной дублирования.
- Неверная проверка на регистрацию, обращение к функции
wp_next_scheduled
илиwp_schedule_event
могло быть неактуально.
Исправленный подход:
-
Исправленный код:
- Вы перенесли планирование Cron задач в метод статической инициализации класса при активации плагина, используя
register_activation_hook
, что предотвращает многократную регистрацию задачи cron при каждом хитте страницы. - Вы изменили название хука для события cron, сделав его отличным от самой функции выполнения. Это позволило избежать путаницы и лишней нагрузки при обработке событий.
- Вы перенесли планирование Cron задач в метод статической инициализации класса при активации плагина, используя
-
Оптимизации:
- Использование подхода с использованием статических методов класса в целях уменьшения количества экземпляров класса и предотвращения лишнего выполнения логики.
- Назначение хука
my_cron_job_event_func
открыло дальнейшие возможности для гибкого управления cron задачами внутри WordPress.
Итоги и рекомендации:
Теперь ваш код отвечает стандартам лучших практик WordPress для управления cron задачами. Вы сообщили, что это устранило проблему, но дополнительно убедитесь в следующем:
- Регулярно проверяйте наличие конфликтов с другими плагинами, которые могут устанавливать функции с теми же именами cron задач.
- Мониторьте производительность сайта и используйте инструменты, такие как WP Crontrol, для отслеживания состояния ваших cron задач.
На этом мы завершаем наш разбор, желая вам успешного опыта в дальнейшей разработке плагинов для WordPress. Если всё выполнено верно, ваш плагин теперь должен корректно управлять cron задачами без избыточного использования серверных ресурсов.