Dovrei disabilitare WP_CRON e attivare wp-cron.php dal server?
Sembra che WordPress attivi inutilmente WP CRON ad ogni caricamento della pagina. Sto pensando che, invece di farlo eseguire ad ogni visita, perché non programmarlo per essere eseguito ogni 5 minuti tramite il server? Potrei semplicemente attivare wp-cron.php ogni cinque minuti e ottenere il risultato desiderato?
Ci sono degli svantaggi in questo approccio?
Non ci sono svantaggi nell'eseguire WP CRON utilizzando i cron job del server. In effetti, questa è la pratica raccomandata.
Secondo il Documento Ufficiale di Sviluppo Plugin WordPress:
WP-Cron non viene eseguito continuamente, il che può rappresentare un problema se ci sono attività critiche che devono essere eseguite in tempo. C'è una soluzione semplice per questo. Basta configurare il programmatore di attività del sistema per eseguire negli intervalli desiderati (o all'orario specifico necessario).
Per farlo, devi prima disabilitare il comportamento predefinito del cron in wp-config.php
:
define('DISABLE_WP_CRON', true);
Quindi, programma wp-cron.php
dal tuo server. Per Linux, significa:
crontab -e
Tuttavia, invece di eseguirlo nella riga di comando (CLI), eseguilo come una richiesta HTTP. Per questo puoi usare wget
:
*/5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cron
WordPress carica tutti i file core necessari, i Plugin ecc. in wp-cron.php
con il seguente CODICE:
if ( !defined('ABSPATH') ) {
/** Configura l'ambiente WordPress */
require_once( dirname( __FILE__ ) . '/wp-load.php' );
}
Quindi non preoccuparti che WordPress non carichi funzionalità importanti.

La documentazione di WordPress.org che hai linkato menziona wget http://YOUR_SITE_URL/wp-cron.php
senza l'aggiunta di ?doing_wp_cron
. Quindi una versione è meglio dell'altra? Cosa fa l'aggiunta di ?doing_wp_cron
che la versione senza non fa?

Probabilmente solo per far sì che i tuoi log mostrino la query string così da sapere con certezza come è stata chiamata.

Non sono affatto d'accordo con questo. Innanzitutto, non è vero che sia "raccomandato". In secondo luogo, questo metodo comprometterebbe qualsiasi plugin che utilizza il metodo effettivamente raccomandato per la pianificazione degli eventi. Penso che questo sia un consiglio davvero pessimo. Quasi nessuno dovrebbe disattivare il cron a meno che non ci sia un motivo MOLTO specifico per farlo. L'unico motivo che mi viene in mente è se stai frammentando WordPress per una CDN o qualcosa del genere. Questa NON è una pratica normale.

@JohnDee: questo metodo non disabilita realmente il cron, ma disabilita il metodo WP Cron che verifica e tenta di eseguire i lavori cron ad ogni caricamento di pagina. define('DISABLE_WP_CRON', true);
disabilita solo quella parte del processo cron e poi chiamare lo script cron con codice come: */5 * * * * wget -q -O - https://tuo-dominio.com/wp-cron.php?doing_wp_cron
sul server assicura che i lavori cron vengano eseguiti. Qualsiasi Plugin di schedulazione non noterà nemmeno la differenza.

Il link alla documentazione di WordPress.org su questo argomento è cambiato in https://developer.wordpress.org/plugins/cron/hooking-wp-cron-into-the-system-task-scheduler/

Ci sono un paio di svantaggi: Innanzitutto, quando si utilizza wp-cron.php come CLI, variabili come $_SERVER non sono impostate. Le persone superano questa limitazione utilizzando una richiesta curl a wp-cron.php invece.
In secondo luogo, poiché WP stesso non viene caricato con wp-cron.php; se si utilizza un plugin SMTP per le email, questo non verrà caricato quando si chiama wp-cron. Ancora una volta, utilizzare una chiamata curl supera questo problema. Curl sembra essere il metodo più frequentemente utilizzato.
Tuttavia; preferisco utilizzare wp-cli dopo aver impostato correttamente le impostazioni di postfix e (per nginx) la configurazione di php-fpm e aver impostato un crontab come il seguente:
*/5 * * * * wp cron event list --skip-plugins --skip-themes --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
(Elenca tutti i cron con campi specifici in formato csv - hook è il nome del cron, next_run_relative è il tempo. Filtra quelli che mostrano 'now' come prossima esecuzione (quelli in scadenza ora) usando AWK, passa quella lista a xargs per chiamare wp cron event run $HOOK
su ogni cron.)
Utilizzare wp-cli carica WordPress correttamente (scelgo di saltare i plugin quando elenco i cron, poiché errori di codice e avvisi php potrebbero compromettere l'output dello script; ma non di saltarli quando eseguo il cron con xargs, poiché il cron potrebbe aver bisogno che i plugin siano caricati)
Spero che questo ti dia alcuni spunti su cosa prestare attenzione.

Che ne dici di impostare: /15 * * * * wget -q -O - http://yourdomain.com/wp-cron.php?doing_wp_cron come suggerito da TomMcFarlin - https://tommcfarlin.com/wordpress-cron-jobs/. Sembra funzionare bene. Apprezzerei un tuo commento.

Sì, come ho detto in giro, le persone scelgono di usare curl (wget o qualsiasi altra chiamata http) per attivare i cron, e non c'è nulla di sbagliato in quel metodo. Stavo solo segnalando i problemi del chiamare direttamente il file wp-cron.php, che non includerebbe i file necessari, e suggerendo un altro metodo alternativo se volessi dargli un po' di sprint.

Non ho ancora trovato un vero svantaggio nell'esternalizzare wp-cron a un servizio esterno. Lo faccio da molti anni ormai.
Soprattutto nel mondo di oggi dove puoi eseguire applicazioni come microservizi.
Uso container Docker separati per ogni componente di WordPress - php, web, db, crontab, redis e così via). Avere crontab come container separato, che chiama wp-cron via http usando la rete locale, eseguendolo solo quando necessario.
Questo riduce lo stress sui nodi backend e migliora la sicurezza avendo una superficie di attacco più ridotta.
Se uno sviluppatore non riesce a capire come fare le cose senza dover chiamare wp-cron ad ogni caricamento di pagina, beh, questo parla solo della sua inesperienza. "Lasciarlo così", perché non si capisce come funzionano le cose, non è una buona ragione per mantenerlo.

Ci sono molte ragioni per non disabilitare il wp-cron. In effetti, è quasi impossibile trovare un caso d'uso valido per farlo. Non rallenta il tuo sito e viene utilizzato per funzionalità di cui potresti non essere a conoscenza.
Molti plugin utilizzano il WP-Cron per programmare azioni. Potrebbero comportarsi in modo anomalo se disattivi lo scheduler.
Ci sono numerosi tutorial su questo argomento perché crea confusione e perché disabilitarlo non ha un impatto immediato evidente sul sito. Ciò che farà, invece, è creare un mal di testa allo sviluppatore che dovrà risolvere il misterioso problema che causerà tra sei mesi.
Inoltre, il WP Heartbeat viene attivato ogni 15 secondi nell'area di amministrazione, risolvendo questo problema per il 99% delle persone che pensano di averne bisogno.

Questa è una risposta terribile - non stanno disabilitando WP Cron. Stanno semplicemente disabilitando l'invocazione di WP Cron durante il caricamento della pagina e trasferendola al demone cron di sistema invece. Accidenti.

Comunque, il motivo principale per lasciarlo stare è che molti plugin ora utilizzano il cron per l'esecuzione prolungata di task in background. Puoi mandare in tilt qualcosa che la PROSSIMA persona sta facendo, perché si aspetta che il sistema funzioni in modo standard. Buona fortuna!

se un plugin è codificato in modo tale da rompersi completamente se wp cron è disabilitato, significa che è stato programmato da un incompetente, ed è meglio disinstallarlo immediatamente.

Bene, i due commenti qui dimostrano il mio punto. Hai uno sviluppatore che dice "questo non disabilita cron, semplicemente lo sposta al cron del sistema operativo" - il che è una rottura in WordPress, che è neutrale rispetto al sistema operativo. Poi un altro sviluppatore dice "ehi, è responsabilità dello sviluppatore del plugin pianificare l'annientamento di wp cron." Uh, ok. Quindi se vuoi la funzionalità cron, dovresti PIANIFICARE l'eliminazione del sistema cron? Per cosa? Il sistema cron di backup? Quel commento non ha senso [ovviamente].

Comunque, lo stato attuale è "CONFUSIONE TOTALE". Questo è lo stato attuale. L'unica soluzione, dal punto di vista del framework, è dire alla gente: C'È UN MOTIVO SE IL SISTEMA WP-CRON ESISTE. NON DISABILITARLO. L'altra opzione sono 10.000 opinioni diverse e variegate. Che è ciò che abbiamo ora.
