Ar trebui să dezactivez WP_CRON și să declanșez wp-cron.php de pe server?
Se pare că WordPress declanșează inutil WP CRON la fiecare încărcare de pagină. Mă gândesc că, în loc să îl las să ruleze la fiecare vizită, de ce să nu îl programez să ruleze la fiecare 5 minute prin intermediul serverului? Aș putea pur și simplu să declanșez wp-cron.php la fiecare cinci minute și să obțin rezultatul dorit?
Există vreun dezavantaj la această abordare?
Nu există dezavantaje în a rula WP CRON folosind job-urile cron ale serverului. De fapt, aceasta este practica recomandată.
Conform Documentației Oficiale pentru Dezvoltarea de Plugin-uri WordPress:
WP-Cron nu rulează continuu, ceea ce poate fi o problemă dacă există sarcini critice care trebuie executate la timp. Există o soluție simplă pentru aceasta. Configurați pur și simplu programatorul de sarcini al sistemului dumneavoastră să ruleze la intervalele dorite (sau la ora specifică necesară).
Pentru a face acest lucru, trebuie mai întâi să dezactivați comportamentul implicit al cron în wp-config.php
:
define('DISABLE_WP_CRON', true);
Apoi, programați wp-cron.php
de pe serverul dumneavoastră. Pentru Linux, asta înseamnă:
crontab -e
Totuși, în loc să-l rulați în linia de comandă (CLI), rulați-l ca o cerere HTTP. Pentru asta puteți folosi wget
:
*/5 * * * * wget -q -O - https://domeniul-dvs.ro/wp-cron.php?doing_wp_cron
WordPress încarcă toate fișierele de bază necesare, Plugin-uri etc. în wp-cron.php
cu următorul COD:
if ( !defined('ABSPATH') ) {
/** Set up WordPress environment */
require_once( dirname( __FILE__ ) . '/wp-load.php' );
}
Așadar, nu vă faceți griji că WordPress nu încarcă funcționalități importante.

Documentația de pe WordPress.org pe care ai trimis-o menționează wget http://YOUR_SITE_URL/wp-cron.php
fără adăugarea ?doing_wp_cron
. Deci, este una mai bună decât cealaltă? Ce face adăugarea ?doing_wp_cron
pe care versiunea fără acest parametru nu o face?

Probabil doar pentru ca în jurnalele tale să apară șirul de interogare, astfel încât să știi cu siguranță cum a fost apelat.

Nu sunt deloc de acord cu asta. În primul rând, nu este adevărat că este "recomandat". În al doilea rând, această metodă va afecta orice plugin care folosește metoda recomandată pentru programarea evenimentelor. Cred că acesta este un sfat foarte prost. Aproape nimeni nu ar trebui să dezactiveze cron-ul decât dacă ai un motiv FOARTE specific pentru a face asta. Singurul motiv la care mă pot gândi este dacă despărți WordPress pentru un CDN sau ceva similar. Aceasta NU este o practică normală.

@JohnDee: această metodă nu dezactivează de fapt cron, ci dezactivează metoda WP Cron care verifică și încearcă să ruleze joburile cron la fiecare încărcare de pagină. define('DISABLE_WP_CRON', true);
dezactivează doar acea parte a procesului cron și apoi apelarea scriptului cron cu cod precum: */5 * * * * wget -q -O - https://domeniul-tau.ro/wp-cron.php?doing_wp_cron
pe server asigură că joburile cron sunt executate. Orice plugin de programare nici măcar nu va observa diferența.

Linkul de documentație de pe WordPress.org despre acest subiect s-a schimbat în https://developer.wordpress.org/plugins/cron/hooking-wp-cron-into-the-system-task-scheduler/

Există câteva dezavantaje: În primul rând, atunci când utilizați wp-cron.php ca CLI, variabile precum $_SERVER nu sunt setate. Oamenii depășesc această limitare prin utilizarea unei cereri curl către wp-cron.php în schimb.
În al doilea rând, deoarece WP în sine nu este încărcat cu wp-cron.php; dacă utilizați un plugin SMTP mailer, acesta nu va fi încărcat când apelați wp-cron. Din nou, utilizarea unui apel curl depășește această problemă. Curl pare a fi metoda cea mai frecvent utilizată.
Totuși, eu prefer să folosesc wp-cli după setarea corectă a configurărilor de mail în postfix și (pentru nginx) php-fpm și setarea unui crontab precum:
*/5 * * * * wp cron event list --skip-plugins --skip-teme --path="/var/www/vhosts/example.com/httpdocs/wp" --fields=hook,next_run_relative --format=csv | awk -F, '$2=="now" {print $1}' | xargs -r wp --path="/var/www/vhosts/example.com/httpdocs/wp" cron event run $1
(Listează toate cron-urile cu câmpuri specifice în format csv - hook fiind numele cron-ului, next_run_relative fiind timpul. Elimină cele care afișează 'now' ca următoare execuție (cele care sunt datorate acum) folosind AWK, transmite acea listă către xargs pentru a apela wp cron event run $HOOK
pentru fiecare cron.)
Folosirea wp-cli încarcă WordPress corect (eu aleg să sar peste plugin-uri atunci când listez cron-urile, deoarece erorile de cod și avertismentele php vor strica ieșirea scriptată; dar nu să le sar când rulez cron-ul cu xargs, deoarece cron-ul poate avea nevoie de plugin-uri încărcate)
Sper că acest lucru vă oferă câteva indicii despre ce să aveți în vedere.

Ce zici să configurezi: /15 * * * wget -q -O - http://yourdomain.com/wp-cron.php?doing_wp_cron așa cum a sugerat TomMcFarlin - https://tommcfarlin.com/wordpress-cron-jobs/. Pare să facă treaba bine. Aș aprecia comentariul tău.

Da, așa cum am menționat de-a lungul timpului, oamenii aleg să folosească curl (wget sau orice alt apel http) pentru a declanșa cron-urile și nu e nimic în neregulă cu această metodă. Doar avertizam despre problemele apelării directe a fișierului wp-cron.php, care nu ar include fișierele necesare și sugeram o altă metodă alternativă dacă ai vrea să încerci ceva diferit.

Încă nu am găsit un dezavantaj real în a externaliza wp-cron către un serviciu extern. Fac asta de mulți ani deja.
Mai ales în lumea de astăzi, unde poți rula aplicații ca microservicii.
Eu folosesc containere Docker separate pentru fiecare componentă WordPress - php, web, db, crontab, redis și așa mai departe). Am crontab într-un container separat, apelând wp-cron prin http folosind rețeaua locală, rulând doar atunci când am nevoie.
Aceasta reduce stresul pe nodurile de backend și îmbunătățește securitatea prin reducerea suprafeței de atac.
Dacă un developer nu poate să-și dea seama cum să facă lucrurile fără să apeleze wp-cron la fiecare încărcare de pagină, asta doar arată lipsa de experiență din partea lui. "A-l lăsa așa", pentru că nu înțelegi cum funcționează lucrurile, nu este un motiv bun pentru a-l păstra.

Există multe motive pentru a nu dezactiva wp-cron. De fapt, este aproape imposibil să găsești un caz de utilizare în care să fie necesar acest lucru. Nu încetinește site-ul tău și este folosit pentru lucruri de care poate nu ești conștient.
Multe plugin-uri folosesc WP-Cron pentru a programa anumite acțiuni. Acestea pot deveni confuze dacă oprești scheduler-ul.
Există o mulțime de tutoriale pe această temă pentru că este confuză și pentru că dezactivarea lui nu are un impact major asupra site-ului. Ceea ce va face, însă, este să creeze o durere de cap developer-ului care va trebui să rezolve problema misterioasă pe care o va genera în șase luni.
De asemenea, WP Heartbeat rulează la fiecare 15 secunde în zona de administrare, rezolvând această problemă pentru 99% dintre oamenii care cred că o au.

Acesta este un răspuns groaznic - ei -NU- dezactivează WP Cron. Doar dezactivează invocarea WP Cron la încărcarea paginii și o transferă către cron daemon-ul sistemului. Vai de capul meu.

Oricum, motivul principal pentru a-l lăsa în pace este că multe plugin-uri acum folosesc cron-ul pentru rularea extinsă a sarcinilor în fundal. Poți strica ceva ce următoarea persoană face, pentru că ei se așteaptă ca sistemul să funcționeze într-un mod standard. Mult noroc!

dacă un plugin este codat într-un mod care se strică complet dacă wp cron este dezactivat, atunci înseamnă că a fost programat de un incompetent și e mai bine să-l dezinstalezi imediat.

Ei bine, cele două comentarii de aici îmi confirmă punctul de vedere. Ai un developer care spune "asta nu dezactivează cron, ci doar îl mută la cron-ul sistemului de operare" - ceea ce încalcă principiul de neutralitate față de sistemul de operare al WordPress. Apoi alt developer spune "hei, este responsabilitatea dezvoltatorului de plugin să ia în calcul anihilarea wp-cron". Uh, ok. Deci dacă vrei funcționalitate cron, ar trebui să PLANIFICI eliminarea sistemului cron? Cu ce? Un sistem cron de rezervă? Comentariul acela nu are sens [evident].

Oricum, starea actuală este "CONFuzie TOTALĂ". Asta este situația actuală. Singura soluție, din punctul de vedere al framework-ului, este să le spui oamenilor: EXISTĂ UN MOTIV PENTRU CARE SISTEMUL WP-CRON EXISTĂ. NU ÎL DEZACTIVAȚI. Cealaltă opțiune este 10.000 de opinii diferite și variate. Ceea ce avem acum.
