Eliminare migliaia di cron job
Ho scoperto di avere 29.000 cron job nel mio database WordPress provenienti da plugin disattivati ed eliminati. Ho provato diversi plugin di ottimizzazione ma l'enorme numero di cron job impedisce di eliminarli utilizzando i plugin.
Ho anche provato questo nel mio functions.php senza successo:
add_action("init", "clear_crons_left");
function clear_crons_left() {
wp_clear_scheduled_hook("cron_name");
}
Esiste un comando SQL che posso utilizzare in phpMyAdmin per cercare per hook cron e rimuoverli?

Grazie Privateer per la rapida risposta e i consigli.
Ho trovato una soluzione alternativa prima di vedere la tua risposta. Ecco un metodo passo-passo per eliminare migliaia di vecchi cron job che potrebbe essere utile a qualcun altro.
Mi sono collegato a phpMyAdmin. Ho cliccato sul mio database e poi sulla scheda 'cerca'. Ho digitato 'cron', selezionato 'tutte le tabelle' e cliccato su 'Vai'. Ho scorso la lista dei risultati fino alla tabella wp_options. Ho cliccato su 'Sfoglia'. In cima alla lista c'era option_name 'cron'. Ho cliccato 'Modifica' e atteso il caricamento della pagina. Ho cliccato sulla casella che mostrava l'elenco dei cron job. La lista era così lunga che ci sono voluti circa 80 secondi prima che il cursore rispondesse. Ho quindi usato Ctrl-A sulla tastiera per selezionare tutto prima di premere il pulsante elimina. Ci sono voluti circa 2 minuti prima che il browser completasse l'eliminazione (Chrome ha dato timeout, quindi ho provato con Firefox che ha funzionato).
Dopo un altro paio di minuti, i cron job dei miei plugin attualmente attivi hanno ripopolato la lista. C'erano 9 cron job (in calo da oltre 29.000!). Sei anni di cron job duplicati da plugin programmati male, alcuni dei quali avevo installato solo per un giorno per provarli. Inoltre centinaia da plugin comuni come Wordfence, BackupBuddy, Nextgen Gallery e AutoOptimizer - tutti disinstallati in passato. Il mio sito ora si carica come se fosse turbo-alimentato. L'area di amministrazione è molto più veloce. Gli errori di timeout nell'admin sono scomparsi. Avevo passato così tanto tempo a ottimizzare il mio sito web cercando di ridurre il tempo di caricamento. Ho persino cambiato host e aggiornato i piani di hosting. Niente ha aumentato la velocità del mio sito come l'eliminazione di tutti i vecchi cron job. Il tempo di download su mobile è sceso da 20 secondi a 6 secondi. Su desktop è passato da circa 12 a 4 secondi.
Nella mia ricerca di una soluzione ho trovato pochissime informazioni sull'effetto dei cron job sulle prestazioni del sito. Molti dicevano che faceva poca differenza e per un piccolo numero di cron job è vero. Ma dopo anni di vita di un sito WordPress, mi chiedo quanti siano appesantiti da centinaia se non migliaia di vecchi cron job da plugin eliminati. Invece di chiedere agli utenti di controllare il limite di memoria PHP, suggerirei agli sviluppatori di far controllare prima il numero di cron job in wp_options quando si risolvono errori fatali di memoria. Potreste rimanere sorpresi/scioccati da ciò che trovate! :-)

Ho riscontrato lo stesso problema. Non so quanti cron job avessi, ma occupavano circa 15 Mb nel database. Dopo l'eliminazione, il tempo di caricamento dell'area admin è diminuito da 5-7 a 0,3 secondi. Il tempo di caricamento del frontend è sceso da 2 a 0,4 secondi.

Accidenti! Questa soluzione ci ha salvato! Avevamo 35000 cron job in questa tabella. Ora sembra turbo come descritto.

Molto utile da sapere, visto che stavo pensando di installare uno dei plugin menzionati per un cliente. Ora so a cosa prestare attenzione quando le prestazioni si deteriorano lentamente.

Gli eventi cron di WordPress possono anche essere cancellati dalla riga di comando, utilizzando WP-CLI:
wp cron event list
wp cron event delete your_example_event
Maggiori dettagli nella documentazione di wp-cli.

Prova
SELECT * FROM `wp_options` WHERE option_name = 'cron'
Se lo trovi potresti provare:
- In SQL:
UPDATE wp_options SET option_value = '' WHERE option_name = 'cron'
- In WordPress:
update_option('cron', '');
Potresti aver bisogno di eliminare l'opzione cron o impostare il valore su un array serializzato vuoto.
Usare update_option sarebbe più sicuro poiché non sono certo se il valore dovrebbe essere un array serializzato vuoto o una stringa vuota. Potresti controllare in wp-includes/options.php... ma usando update_option verrà gestito correttamente senza preoccuparti del database.

Una soluzione ancora più semplice è chiamare delete_option( 'cron' );
una volta in qualche plugin. Tutti i cron job aggiunti automaticamente verranno reinseriti alla prossima visita/richiesta del tuo sito.
Come plugin one-case (mu) che viene eseguito solo quando lo attivi:
<?php
/** Plugin Name: Clean Cron */
register_activation_hook( __FILE__, function()
{
delete_option( 'cron' );
} );

Grazie kaiser! Per chi non si sente a proprio agio nel creare/modificare plugin (è semplice!), puoi usare quello che kaiser ha segnalato nel tuo file functions.php. Basta aggiungerlo, salvarlo, caricare il sito, poi rimuoverlo e salvarlo di nuovo.

E i cron job che sono stati creati all'attivazione del plugin? Questi cron job non verrebbero ricreati finché non disattivi e riattivi il plugin.

Beh, questo non è possibile di default, né con questo né con le altre domande. Quello che dovresti fare è disattivare e riattivare quei plugin (~3 minuti di lavoro), oppure – nel caso stessi cercando una risposta automatizzata – cercare le funzioni in quei plugin e attivarle dal tuo plugin.

Nel caso qualcuno volesse cancellare un nome specifico di cron (ad esempio 'CRON_NAME'), questa soluzione ha funzionato per me:
$crons = _get_cron_array();
//echo "Trovati totali ".count($crons)."<br />";
//Mantieni solo quelli che non corrispondono al nome del cron
$updated = array_filter($crons, function($v){return !array_key_exists("CRON_NAME",$v);});
//echo "Ridotti a ".count($updated)."<br />";
_set_cron_array($updated);

Ho avuto un anno pieno di lavori cron in sospeso, circa 5 Mb di dati per questa singola voce del database. Ho eliminato i lavori cron dal database. Ho disabilitato i lavori cron in wp-config.php
Ho configurato un lavoro cron manuale in cPanel. Ora il mio sito vola letteralmente. Avevo continuato a potenziare i server, acquistando più CPU/RAM, ma è stato tutto uno spreco di tempo e denaro.
Per eliminare tutti i lavori cron in sospeso, esegui questa query in phpmyadmin > Esegui query:
UPDATE wp_options SET option_value = '' WHERE option_name = 'cron'
Grazie mille Pádraig Ó Beirn.

Mi sono imbattuto in un problema simile, dove a causa di un mio errore di codifica, migliaia di copie di un particolare cron job erano state aggiunte a un sito. La funzione wp_clear_scheduled_hook sembrava andare in timeout e fallire. Sono riuscito a risolverlo con uno script che rimuove tutte le istanze della funzione cron dall'array e poi aggiunge l'array filtrato come nuova opzione cron nella tabella delle opzioni. Vedi sotto.
In questo modo, ho evitato di eliminare i cron job desiderabili precedentemente aggiunti al sito.
Questo potrebbe essere modificato come una funzione che accetta un array di handle da eliminare o un array di handle da preservare.
$crons = _get_cron_array();
$hook = 'tj_flush_w3tc_cache';
foreach ( $crons as $timestamp => $cron ) {
if ( isset( $cron[ $hook ] ) ) {
unset($cron[$hook]);
}
if(!empty($cron))
$newcron[$timestamp] = $cron;
}
update_option('cron',$newcron);

Ho un metodo molto semplice per eliminare tutti gli eventi cron. Prima di tutto, devi DISABILITARE il WP Cron nel file wp-config Poi, installa il plugin WP Control Successivamente, vai nel menu Strumenti > Eventi Cron > Seleziona tutti > Elimina tutto. Potresti provarlo? Grazie.

Se cancelli i tuoi task cron in questo modo e utilizzi UpdraftPlus, dovrai ri-salvare le impostazioni per rigenerare i task cron. Fino a quando non lo farai, i tuoi backup automatici non verranno eseguiti (ma i backup manuali funzioneranno).
Le impostazioni rimarranno comunque presenti e non dovrai modificare nulla. Basta andare nel menu principale di [UpdraftPlus]->Impostazioni, scorrere fino in fondo e cliccare su "Salva modifiche".

Sono arrivato qui a causa dell'enorme quantità di cronjob sm_ping
nella tabella wp_options
. Se anche tu hai questo problema, potresti provare quanto segue:
Inserisci questo nel file functions.php (del tema child) se non hai accesso a phpmyadmin, specialmente se il tuo sito è appesantito da cronjob di ping (sm_ping):
if (isset($_GET['doing_wp_cron'])) {
remove_action('do_pings', 'do_all_pings');
wp_clear_scheduled_hook('do_pings');
}
