За това какработи вътрешен Cron на WordPress - Internetchik с опит
Всичко започна с факта, че трябваше да правя нещо редовно в един от моите проекти. По-конкретно, разработих плъгин за един офис, който има блог и в същото време има онлайн магазин. Магазинът има колона „ТОП продукти на седмицата“ и ми беше дадена задачата да напиша плъгин, който също да показва този в блога. По принцип няма проблеми, особено след като програмистите на сайта ми предоставиха XML на този топ, но не исках да тегля този XML всеки път и няма смисъл, ако този топ се променя веднъж седмично.
Първо си помислих просто да напиша скрипт на трета страна, но след това се сетих, че WordPress има собствен cron. Не беше задача да го използвам преди и реших да намеря някои решения в мрежата. Намерихтази статия от SeoCoder. Копирах скрипта, сложих го в папката plugins и го активирах. И ... всъщност не работи. (по-късно открих 2 грешки, от които считам и двете за критични) Влязох по-навътре в тирнет и видях, че тази статия с този код е открадната из целия тирнет. Вероятно само мързеливите не са публикували този код. Но проблемът беше, че кодът не работи. Затова трябваше сам да избера кода на WordPress и да разбера какво е какво. Предоставяте ви резултат, който със сигурност работи, но в същото време ще ви кажа какво и какво прави всяка функция. Да започваме...
Веднага трябва да кажа, че за нормалната работа на WordPress cron са необходими 2 функции (+2 е рядко, но понякога е необходимо), въпреки че всъщност има още няколко от тях. Освен това в началото на статията искам да насоча вниманието ви към факта, че е необходимо да регистрирате кука (кука, която ще се изпълнява всеки път, когато потребителят влезе). Прави се така:
Тукnew_cron_hook е заглавиетокука. Именно това име ще използвам по-късно за пример. Иmy_function_cron е името на функцията, която ще бъде изпълнена, когато внезапно някъде посоча името на моята прясно регистрирана кука. Тогава ще разберете как работи.
Да преминем към функциите:
-
wp_schedule_event($time, $period, $name_hook); – функция, която задава cron задачата, т.е. инициализира (или инсталира така, чели)
$time е времето (във UNIX формат), от което стартира cron задачата. Обикновено те започват от текущото време, така че указват time() $period - периодът, през който cron ще бъде изпълнен. час - веднъж на час, два пъти дневно - веднъж на всеки 12 часа, ежедневно - веднъж на ден $name_hook - само името на куката, регистрирано от нас чрез действието, в нашия пример е 'new_hook_cron'
wp_reschedule_event( $time, $period, $name_hook, $args (по избор)); – функция, която пренасрочва задачата за друго време (например, ако вече имате стартирана кука и сте променили параметрите или следващото време на стартиране в настройките, тогава трябва да използвате тази конкретна функция.
$time, $period и $name_hook се използват тук по същия начин, както в предишната функция. И последният параметър (аргументи) изобщо не е задължителен и е необходим само ако трябва да подадете пароли или някои специфични параметри за функцията, към която е прикрепена вашата кука.
Често се случва тази функция изобщо да не се използва и това води до някои грешки, т.к. ако вашият плъгин има настройки на cron, тогава мисля, че тази функция трябва да се използва. Въпреки че в някои (дори моите първоначални) решения има конструкции, когато куката се затваря (със следващата функция) и веднага се отваря отново (с предишната функция), но с вече актуализирани параметри.
wp_clear_scheduled_hook($name_hook); е проста функция, чиято задача е да убие (изключи или как да кажем изчисти cron от) кука, която е регистрирана в WordPress cron. Той трябва да бъде поставен във функцията, която се изпълнява по време на конструкцията register_deactivation_hook, т.е. в момента, в който деактивирате вашия плъгин.
$name_hook - както вероятно вече се досещате, това е името на нашата cron кука, т.е. в нашия примерnew_cron_hook.
много несъзнателно използват друга функция вместо тази функция, а именно wp_unschedule_event, и в същото време я използват неправилно и cron не се изключва. (но повече за това по-долу)
wp_schedule_single_event($time, $name_hook); – функция, много подобна на първата (wp_schedule_event) функция, но, както виждате, тук няма параметър период, т.е. като посочите времето, стартирането ще бъде направено само веднъж.
Това също е доста специфична функция, която се използва по-рядко, но за някои решения може да бъде много полезна.
Внимателен читател вероятно ще попита, но какво да кажем за функцията, която беше обещана да бъде обсъдена по-долу, така че ще говоря за нея, но първо ще обясня спецификата (или по-скоро как най-често) използват стартирането на cron. Така че най-често срещаният начин за стартиране на cron е следният:wp_schedule_event(time(), 'hour', 'new_hook');
Тук ви моля да обърнете внимание как се обозначава часа, а именно, че ние самите не знаем колко часа пускаме. Казваме просто да изпълним функцията с текущото време и да използваме функция без параметри във форматаtime(), за да направим това. Искам да обърна внимание на това, че нямаме представа точно колко е часът в настоящия момент под формата на „UNIX timestamp“, а просто казваме „започвайки от текущия“.
След това бих искал да отбележа, че дори да знаемчислото, което въведохме в параметъра за време, след един час (12 часа или ден) времето на следващото стартиране ще се промени и ние вече не го знаем.
Но отново, повтарям, поради невежество, хората използват функцията wp_unschedule_event, за да завършат заданието на cron и в същото време пишат това:wp_unschedule_event(time(), 'new_hook') ; т.е. буквално казвайки това: "Изключете куката, чието следващо стартиране ще бъде точно в текущата секунда от времето."
Естествено, вероятността следващото време за стартиране да съвпадне с текущото време просто не се взема предвид, защото. възможно само в американското кино 🙂 за малоумници. И това означава, че дори ако сте изключили плъгина, cron продължава да работи и оттогава. няма текуща функция, тя просто ще създаде грешки, които зареждат сървъра.
Но най-смешното е какво се случва в момента, в който активирате отново приставката. И се получава следното - задачите на krone се множат и се получава много интересен каламбур. Когато сте включили плъгина 10 пъти по време на отстраняване на грешки и сте го изключили и т.н. стартира 10 еднакви задачи (например, нека вмъкваме публикация на всеки час). И така, отидохте да пиете чай, след това се разсеяхте и се върнахте след час и решихте да тествате и актуализирате страницата си и какво виждате? И виждате, че за час вместо един пост бяха добавени 10 еднакви.
Това ме хвърли в някакъв шок и го включих и изключих (тествах плъгина) пак като 50 и стигна до там, че вече визуално започнах да усещам грешно натоварване, когато плъгинът беше изключен. Естествено реших всичко с функциятаwp_clear_scheduled_hook, която уби всички процеси и по-късно започнах да я използвам.
В края на статията искам да предоставя правилния (с акцент върху E) код, който демонстрира как работи cron:
/* Име на приставката: (Zu) Всеки часПлакат URI на приставката: http://jawsik.com Описание: Публикувай всеки час Автор: ZUMA Версия: 0.2 URI адрес на автора: http://jawsik.com */
функция zu_cron_activation() < wp_schedule_event(time(), 'hourly', 'cron_hourly'); >
функция zu_cron_deactivation() < wp_clear_scheduled_hook('cron_hourly'); >
функция zu_cron_hourly() < $my_post = array('post_title' => 'Създадена е нова публикация:' .date('Y-m-d in H:i:s'), 'post_content' => 'Това е друга публикация Време на създаване на Unix:' .time(), 'post_status' => 'publish', 'post_author' => 1, 'post_ category'' => array(0) ); wp_insert_post( $my_post); >
register_activation_hook(__FILE__, 'zu_cron_activation'); register_deactivation_hook(__FILE__, 'zu_cron_deactivation'); add_action('cron_hourly'', 'zu_cron_hourly'); ?>
О, между другото, обърнете внимание на кавичките в кода ... иначе WordPress обича да ги променя.
Между другото, забележете:
Ще добавя 🙂 В WordPress се задават два интервала на час и на ден, ако трябва да направите свой собствен интервал, помага да поставите филтър на функцията cron_schedules. например: функция more_reccurences($schedules) $schedules['my_period'] = array('interval' => 21600, 'display' => __('На всеки 6 часа')); връща $schedules; > add_filter('cron_schedules', 'more_reccurences');
Между другото, страхотна находка за добавяне на филтър ...
Duc, все още беше SHUT knows which wordpress и всичко работи при мен)
Благодаря за статията, помогна много при писането на моя плъгин, който публикувах навреме ...
Когато пишат "ето правилния код" - това не е правилно :)
Благодаря ви, същността на работата с планировчика е много ясно описана!