Șterge mii de sarcini cron
Am descoperit că am 29.000 de sarcini cron în baza mea de date WordPress de la plugin-uri dezactivate și șterse. Am încercat mai multe plugin-uri de optimizare, dar numărul uriaș de sarcini cron face imposibilă ștergerea lor folosind plugin-uri.
Am încercat și acest cod în functions.php fără succes:
add_action("init", "clear_crons_left");
function clear_crons_left() {
wp_clear_scheduled_hook("nume_cron");
}
Există vreo comandă SQL pe care o pot folosi în phpMyAdmin pentru a căuta după hook-ul cron și a le elimina?

Mulțumesc Privateer pentru răspunsul prompt și pentru sfaturi.
Am găsit o soluție înainte să văd răspunsul tău. Iată o metodă pas cu pas pentru ștergerea a mii de job-uri cron vechi și poate fi utilă pentru altcineva.
M-am conectat la phpMyAdmin. Am dat click pe baza mea de date și apoi pe fila 'search'. Am introdus 'cron', am selectat 'all tables' și am apăsat 'Go'. Am derulat în jos lista de rezultate către tabelul wp_options. Am dat click pe 'Browse'. În partea de sus a listei era option_name 'cron'. Am apăsat 'Edit' și am așteptat ca pagina să se încarce. Am dat click pe caseta care afișa lista de job-uri cron. Lista de cron era atât de lungă încât a durat cam 80 de secunde până când cursorul meu a răspuns. Apoi am folosit Ctrl-A de pe tastatură pentru a selecta tot înainte de a apăsa butonul de ștergere. A durat aproximativ 2 minute până când browserul meu a finalizat ștergerea (Chrome a expirat, așa că am încercat Firefox care a funcționat).
După încă câteva minute, job-urile cron pentru plugin-urile mele active actuale au repopulat lista. Au rămas 9 job-uri cron (față de peste 29.000!). Șase ani de job-uri cron duplicate de la plugin-uri prost codate, unele dintre care le-am instalat doar pentru o zi ca să le testez. De asemenea, sute de la plugin-uri comune precum Wordfence, BackupBuddy, Nextgen Gallery și AutoOptimizer - toate dezinstalate în trecut. Site-ul meu acum se încarcă de parcă ar fi fost supraalimentat. Zona de administrare este mult mai rapidă. Erorile de timeout în administrare au dispărut. Am petrecut atât de mult timp optimizând site-ul meu încercând să reduc timpul de încărcare. Am schimbat chiar și gazdele și am upgradat planurile de hosting. Nimic nu a crescut viteza site-ului meu la fel de mult ca ștergerea tuturor job-urilor cron învechite. Timpul de descărcare pe dispozitive mobile a scăzut de la 20 de secunde la 6 secunde. Timpul de descărcare pe desktop a scăzut de la aproximativ 12 la 4 secunde.
În căutarea mea pentru o soluție, am găsit foarte puține informații despre efectul job-urilor cron asupra performanței site-ului. Mulți au spus că are un impact minor și pentru un număr mic de job-uri cron, asta e adevărat. Dar, după ani de funcționare a unui site WordPress, mă întreb câte sunt umflate cu sute sau chiar mii de job-uri cron vechi de la plugin-uri șterse. În loc să le cerem utilizatorilor să verifice limita de memorie PHP, aș sugera ca dezvoltatorii să le ceară mai întâi să verifice numărul de job-uri cron din wp_options atunci când depanează erori de memorie fatală. S-ar putea să fiți surprinși/șocați de ce găsiți! :-)

Am întâlnit aceeași problemă. Nu știu exact câte job-uri cron aveam, dar erau aproximativ 15 Mb în baza de date. După ștergere, timpul de încărcare a zonei de administrare a scăzut de la 5-7 secunde la 0.3 secunde. Timpul de încărcare pe frontend a scăzut de la 2 la 0.4 secunde.

La naiba! Această soluție ne-a salvat! Aveam 35000 de job-uri cron în această tabelă. Acum totul funcționează la viteză maximă, exact cum ai descris.

Foarte util de știut, având în vedere că tocmai mă gândeam să instalez unul dintre plugin-uri menționate pentru un client. Acum știu la ce să fiu atent când performanța începe să se deterioreze treptat.

Evenimentele cron din WordPress pot fi șterse și din linia de comandă, folosind WP-CLI:
wp cron event list
wp cron event delete your_example_event
Mai multe detalii în documentația wp-cli.

Încearcă
SELECT * FROM `wp_options` WHERE option_name = 'cron'
Dacă îl găsești, poți încerca:
- În SQL:
UPDATE wp_options SET option_value = '' WHERE option_name = 'cron'
- În WordPress:
update_option('cron', '');
Poate fi necesar să ștergi opțiunea cron sau să setezi valoarea la un array serializat gol.
Folosirea funcției update_option ar fi mai sigură, deoarece nu sunt sigur dacă valoarea ar trebui să fie un array serializat gol sau un șir gol. Poți verifica în wp-includes/options.php... dar folosirea update_option va gestiona corect fără a fi nevoie să te îngrijorezi de baza de date.

O soluție și mai simplă este să apelezi delete_option( 'cron' );
o singură dată într-un anumit plugin. Toate sarcinile cron adăugate automat vor fi readăugate la următoarea vizită/solicitare a site-ului tău.
Ca un plugin unic (mu) care rulează doar atunci când îl activezi:
<?php
/** Plugin Name: Clean Cron */
register_activation_hook( __FILE__, function()
{
delete_option( 'cron' );
} );

Mulțumesc, kaiser! Pentru cei care nu se simt confortabil cu crearea/editarea plugin-urilor (este simplu!), puteți folosi ceea ce kaiser a menționat în fișierul functions.php. Doar adăugați-l, salvați, încărcați site-ul, apoi eliminați-l și salvați din nou.

Dar despre job-urile cron care au fost create la activarea plugin-ului? Aceste job-uri cron nu vor fi recreate decât dacă dezactivați și reactivați plugin-ul.

Ei bine, acest lucru nu este posibil în mod implicit, nici cu aceasta, nici cu celelalte întrebări. Ceea ce ar trebui să faceți este fie să dezactivați și să reactivați acele plugin-uri (~3 minute de muncă), fie – în cazul în care căutați un răspuns automatizat – să căutați funcțiile din acele plugin-uri și să le declanșați din interiorul propriului plugin.

În cazul în care cineva dorea să șteargă un anumit nume de cron (de exemplu 'CRON_NAME'), această soluție a funcționat pentru mine:
$crons = _get_cron_array();
//echo "S-au găsit în total ".count($crons)."<br />";
//Păstrează doar cele care nu se potrivesc cu numele cron-ului
$updated = array_filter($crons, function($v){return !array_key_exists("CRON_NAME",$v);});
//echo "Redus la ".count($updated)."<br />";
_set_cron_array($updated);

Am avut un an plin de joburi cron în așteptare, aproximativ 5 Mb de date pentru această singură intrare în baza de date. Am șters joburile cron din baza de date. Am dezactivat joburile cron în wp-config.php.
Am configurat un job cron manual în cpanel. Acum site-ul meu funcționează extrem de rapid. Am tot upgradat serverele, am cumpărat mai mult CPU/RAM, dar totul a fost o pierdere de bani și timp.
Pentru a șterge toate joburile cron în așteptare, executați această interogare în phpmyadmin>Execută interogare:
UPDATE wp_options SET option_value = '' WHERE option_name = 'cron'
Mulțumesc mult Pádraig Ó Beirn.

Am întâmpinat o problemă similară, unde din cauza unei greșeli de codare, mii de copii ale unui anumit job cron au fost adăugate pe un site. Funcția wp_clear_scheduled_hook
părea să expire și să eșueze. Am rezolvat problema cu un script care elimină toate instanțele funcției cron din array și apoi adaugă array-ul filtrat ca nouă opțiune cron în tabelul de opțiuni. Veți mai jos.
În acest fel, am evitat să șterg job-urile cron dorite care fuseseră adăugate anterior pe site.
Aceasta ar putea fi modificată într-o funcție care acceptă un array de handle-uri de eliminat sau un array de handle-uri de păstrat.
$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);

Am o metodă foarte simplă de a șterge toate evenimentele cron. Înainte, trebuie să DEZACTIVAȚI WP Cron în wp-config. Apoi, instalați Plugin-ul WP Control. Apoi, accesați meniul Instrumente > Evenimente Cron > Faceți clic pe Selectează toate > Ștergeți-le pe toate. Puteți încerca asta. Mulțumesc.

Dacă ștergi sarcinile cron în acest fel și folosești UpdraftPlus, va trebui să salvezi din nou setările pentru a regenera sarcinile cron. Până nu faci acest lucru, backup-urile automate nu se vor executa (dar cele manuale vor continua să funcționeze).
Setările vor rămâne intacte și nu trebuie să modifici nimic. Doar mergi la [meniul principal UpdraftPlus]->Setări, derulează în jos până la capăt și apasă pe "Salvează modificările".

Am ajuns aici din cauza numărului mare de cronjob-uri sm_ping
în tabelul wp_options
. Dacă aceasta este problema ta, poți încerca următoarele:
Introdu acest cod în fișierul functions.php (al temei child) dacă nu ai acces la phpmyadmin, în special dacă site-ul tău este încărcat cu cronjob-uri de ping (sm_ping):
if (isset($_GET['doing_wp_cron'])) {
remove_action('do_pings', 'do_all_pings');
wp_clear_scheduled_hook('do_pings');
}
