WordPress'да режалаштирилган постларни чоп этиш, плагинлар ва мавзулар янгиланишини текшириш, захира нусха олиш ёки WooCommerce'даги кечиктирилган амаллар WP-Cron деб аталадиган ички механизм орқали бажарилади. Унинг номи "cron" бўлса ҳам, у ҳақиқий сервер режалаштирувчиси эмас. WP-Cron фақат кимдир сайтнинг бирор саҳифасини очганда текширилади: WordPress ҳар бир сўровда "вақти келган вазифа борми?" деб қарайди ва бор бўлса, wp-cron.php файлига фон сўрови юборади. Бу ёндашув ҳар қандай хостингда созлашсиз ишлаши учун ўйлаб топилган, лекин унинг жиддий камчиликлари бор.
WP-Cron қаерда панд беради
Биринчи муаммо кам ташрифли сайтларда юз беради. Агар тунда ҳеч ким сайтга кирмаса, соат 7:00 га режалаштирилган янгилик эрталаб биринчи ташриф буюрувчи келгунча чиқмайди. Баъзан эса WordPress постни ўтказиб юбориб, унинг ёнида "Missed schedule" белгисини кўрсатади. Захира нусха ёки обуначиларга хат юбориш каби вазифалар ҳам худди шундай кечикади.
Иккинчи муаммо, аксинча, кўп ташрифли сайтларда бўлади. Ҳар бир саҳифа очилишида текширув бажарилади ва вақти келган вазифа бўлса, wp-cron.php қайта-қайта чақирилади. Бу PHP ишчиларини банд қилади ва трафик чўққисида сайтни секинлаштиради. Учинчи ҳолат — тўлиқ саҳифа кешлаш: агар саҳифалар кешдан берилса, PHP умуман ишга тушмайди ва WP-Cron ҳам текширилмай қолади.
Сервер cron'и бу муаммоларнинг барчасини ҳал қилади. У ташрифга боғлиқ эмас, белгиланган вақтда аниқ ишга тушади ва битта жараён сифатида ишлайди.
1-қадам: WP-Cron'нинг автоматик ишга тушишини ўчириш
Сайт илдизидаги wp-config.php файлини очинг ва қуйидаги қаторни қўшинг. У "That's all, stop editing!" изоҳидан юқорида, бошқа define қаторлари ёнида туриши керак, акс ҳолда WordPress уни ҳисобга олмаслиги мумкин.
define( 'DISABLE_WP_CRON', true );
Бу созлама вазифаларни ўчирмайди. У фақат WordPress'га саҳифа очилганда wp-cron.php ни ўзи чақирмасликни айтади. Вазифалар рўйхати базада сақланиб қолади ва энди уларни сервер cron'и ишга туширади. Шунинг учун кейинги қадамни ўтказиб юборманг: акс ҳолда режалаштирилган постлар ва янгиланишлар умуман бажарилмай қолади.
2-қадам: сервер cron'ини қўшиш
Энг оддий усул — wp-cron.php файлини PHP CLI орқали тўғридан-тўғри ишга тушириш. Бунда сўров веб-сервердан ўтмайди ва ташриф буюрувчилар учун мўлжалланган ишчиларни банд қилмайди. Кўпчилик сайтлар учун ҳар 5 ёки 15 дақиқа етарли.
*/5 * * * * cd /var/www/user/data/www/misol.uz && /usr/bin/php wp-cron.php >> /var/www/user/data/logs/wp-cron.log 2>&1
Агар серверда WP-CLI ўрнатилган бўлса, ундан фойдаланиш янада аниқроқ. Қуйидаги буйруқ фақат вақти келган вазифаларни бажаради ва натижани матн кўринишида чиқаради, бу эса логни ўқишни осонлаштиради:
*/5 * * * * cd /var/www/user/data/www/misol.uz && /usr/local/bin/wp cron event run --due-now >> /var/www/user/data/logs/wp-cron.log 2>&1
php ва wp буйруқларининг аниқ йўли серверга боғлиқ. Уни терминалда which php ва which wp билан текширинг. Сайтингиз қайси PHP версиясида ишлаётган бўлса, cron'да ҳам айнан шу версия йўлини кўрсатиш керак, акс ҳолда янги плагинлар эски PHP'да синтаксис хатоси бериши мумкин.
Қандай частота танлаш керак
Частотани сайтингиз вазифалари белгилайди. Янгиликлар сайти учун режалаштирилган пост бир неча дақиқа кечикса муаммо йўқ, шунинг учун ҳар 5-10 дақиқа қулай. WooCommerce дўкони учун Action Scheduler навбати ҳам шу йўл билан ишлайди, шунинг учун буюртмалар кўп бўлса ҳар 1-2 дақиқага яқинлаштириш мумкин. Визитка сайт ёки кам ўзгарадиган блог учун ҳар 15-30 дақиқа ҳам етади. Узоқ ишлайдиган вазифалар устма-уст тушмаслиги учун буйруқ олдига flock -n /tmp/wpcron.lock қўшиш фойдали.
3-қадам: ҳаммаси ишлаётганини текшириш
Созлашдан кейин вазифалар рўйхатини WP-CLI билан кўриб чиқинг. Ҳар бир вазифа учун кейинги ишга тушиш вақти кўрсатилади; агар бу вақтлар ўтмишда қотиб қолмаса ва мунтазам янгиланиб турса, сервер cron'и ишлаяпти.
cd /var/www/user/data/www/misol.uz
wp cron event list --fields=hook,next_run_relative
wp cron test
WP-CLI бўлмаса, "WP Crontrol" каби плагин вазифалар рўйхатини админ панелда кўрсатади. Бир неча соатдан кейин лог файлни ҳам кўздан кечиринг: унда PHP хатолари бўлмаслиги керак. Синов учун 10 дақиқадан кейинга пост режалаштириб, у ўз вақтида чиқишини кузатиш ҳам ишончли усул.
Амалий мисол: мактаб сайти
Самарқанддаги хусусий мактаб сайтида маъмурият эълонларни олдиндан ёзиб, эрталаб соат 7:30 га режалаштирарди, чунки ота-оналар айнан шу вақтда Telegram канал орқали ҳаволани олишарди. Тунда сайтга ташриф деярли бўлмагани учун эълонлар кўпинча соат 8 дан кейин, биринчи ташриф буюрувчи келганда чиқар, баъзилари эса "Missed schedule" билан қолиб кетарди. DISABLE_WP_CRON ёқилиб, ҳар 5 дақиқалик сервер cron'и қўшилгандан кейин эълонлар белгиланган вақтдан кўпи билан бир неча дақиқа фарқ билан чиқа бошлади. Шу билан бирга, захира плагини ҳам ҳар кеча аниқ вақтда ишлай бошлади.
Кенг тарқалган хатолар
DISABLE_WP_CRONқўшилган, лекин сервер cron'и қўшилмаган — натижада ҳеч қандай вазифа бажарилмайди.- Cronъда нисбий йўл ишлатилган ёки
cdунутилган —wp-cron.phpWordPress файлларини топа олмайди. - Қатор "That's all, stop editing!" изоҳидан пастга ёзилган — созлама кучга кирмайди.
- Кўп сайтли (multisite) тармоқда фақат асосий сайт учун cron қўшилган — ҳар бир сайт учун алоҳида
--urlбилан чақириш керак бўлади.
sayt.uz хостингида cron вазифасини ISPmanager панелининг "Режалаштирувчи" бўлимида қўшасиз, панелга sayt.uz кабинетидан кирилади. Агар WP-CLI йўлини ёки керакли PHP версияси қаердалигини аниқлай олмасангиз, техник ёрдамга тикет ёзинг.