Cum să rezolvi eroarea "Another update is currently in progress" în WordPress 5
Știu că o întrebare similară a fost pusă înainte, dar aceasta NU este o duplicat deoarece se referă specific la WordPress 5+ și răspunsurile la întrebarea similară au fost încercate fără succes.
Problema:
Am WordPress versiunea 5.01 și apar unele probleme tehnice. Jurnalele de erori PHP indică faptul că nucleul WordPress trebuie reinstalat (erori de sintaxă în interogările SQL de bază cu variabile $vars
goale).
Totuși, când încerc să reinstalez WordPress din zona de administrare, primesc mesajul:
O altă actualizare este în curs de desfășurare
Am încercat toate soluțiile din această întrebare și sunt invalide sau neaplicabile (toate au fost testate pentru confirmare):
- Fișierul
.maintenance
a fost dezactivat manual. - Tabelul
<...>_options
din director NU conține tag-ul.lock
pentru actualizarea WordPress. Deși acest lucru apare confirmat în codul PHP. - Toate plugin-urile au fost dezactivate.
- Blocajul nu expiră după 15 minute.
Totuși, nu reușesc să găsesc nici cauza notificării, nici notificarea în sine în codul PHP, pentru a o suprascrie manual (vezi referința aici din nou).
Cerință:
Cum pot suprascrie mesajul "O altă actualizare este în curs de desfășurare" în WordPress 5. Această cerință este specifică WP5 deoarece sistemul pare să se fi schimbat față de versiunile anterioare 5.0.
Actualizare
Nu caut [doar] o soluție de rezolvare a problemei; ci mai degrabă o explicație despre cum este generat textul "O altă actualizare este în curs de desfășurare" în WordPress 5.
Vă mulțumesc pentru orice îndrumare în acest sens.

puteți încerca să faceți o actualizare manuală, atâta timp cât nu ați făcut modificări la fișierele de bază ale WordPress (dacă ați făcut, vă sugerez să le notați și să le reaplicați după actualizare). Mergeți pe WordPress.org, descărcați cel mai recent pachet WordPress și copiați-l în folderul rădăcină de pe server. Asigurați-vă că suprascrieți doar fișierele de bază ale WordPress, lăsând folderul wp-content în afara acestei operațiuni. Introduceți detaliile dvs. în fișierul wp-config.php și aceasta ar trebui să rezolve problema pentru dumneavoastră. PS. Nu uitați să faceți o copie de rezervă a bazei de date și a folderelor originale WordPress înainte de a continua.

Veți primi această eroare și dacă WordPress nu poate insera un lock
în tabela wp_options
. Este posibil ca tabela să nu fie configurată corect, de exemplu atunci când este copiată dintr-o altă sursă. Câmpul option_id
ar trebui să fie autoincrement, altfel actualizarea va eșua. Verificați dacă puteți insera manual o intrare de blocare în baza de date:
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('core_updater.lock', '1', 'no');
Dacă option_id
nu este autoincrement și această interogare eșuează, va trebui să setați câmpul option_id
ca autoincrement. Poate fi necesar să eliminați indexul din acest câmp înainte de a-l seta ca autoincrement.

Nu sunt sigur dacă acest lucru va ajuta la extinderea discuției pentru a rezolva problema, dar am restrâns mesajul de eroare la liniile 118-122 din fișierul class-core-upgrade.php (wp-admin/includes)
// Blocare pentru a preveni efectuarea mai multor actualizări simultane ale nucleului.
$lock = WP_Upgrader::create_lock( 'core_updater', 15 * MINUTE_IN_SECONDS );
if ( ! $lock ) {
return new WP_Error( 'locked', $this->strings['locked'] );
}
Funcția create_lock se află în fișierul class-wp-upgrader.php pe liniile 885-918
Adăugând coduri echo înaintea instrucțiunilor return, am reușit să identific aceste linii în funcție (899-901)
// Dacă nu s-a putut crea o blocare și nu există o blocare, ieșim.
if ( ! $lock_result ) {
return false;
}
Din anumite motive, pot interoga codul de mai sus prin RouteXL și se generează o blocare, dar WP nu reușește să insereze interogarea pe linia 893
$lock_result = $wpdb->query( $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */", $lock_option, time() ) );
Inserând această linie imediat după 893
echo $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */", $lock_option, time() );
obțin codul afișat când efectuez o actualizare
INSERT IGNORE INTO `wp_options` ( `option_name`, `option_value`, `autoload` ) VALUES ('core_updater.lock', '1606851384', 'no') /* LOCK */
Am rulat această interogare manual și inserează corect rândul în baza de date MySQL folosind același utilizator/parolă ca în instalarea WP.
Nu sunt complet sigur de ce WordPress nu reușește să facă acest lucru, dar eu pot să o fac manual folosind aceleași credențiale.

Am modificat funcția create_lock pentru a produce niște coduri de eroare și informații. De asemenea, am schimbat interogarea eliminând IGNORE după INSERT și în cele din urmă îmi dă o eroare când încerc să actualizez cu MySQL:
update-core.php acum generează:
Actualizează WordPress
QUERY[ INSERT INTO `wp_options` ( `option_name`, `option_value`, `autoload` ) VALUES ('core_updater.lock', '1606853111', 'no') /* LOCK */ ]
QUERY ERROR[ Duplicate entry 'core_updater.lock' for key 'option_name' ]
Aici e punctul în care eșuez
Altă actualizare este în curs de desfășurare.
Duplicate entry 'core_updater.lock' for key 'option_name' Acesta este motivul pentru care eșuează!
Partea ciudată? Nu văd acea linie sau valoare în tabelul meu wp_options! Foarte, foarte ciudat! Acum trebuie să văd de ce spune că este o duplicare, chiar dacă această opțiune nu există în baza mea de date!
class-wp-upgrader.php (modificat pentru a produce date de diagnosticare)
public static function create_lock( $lock_name, $release_timeout = null ) {
global $wpdb;
if ( ! $release_timeout ) {
$release_timeout = HOUR_IN_SECONDS;
}
$lock_option = $lock_name . '.lock';
// Încearcă să blocheze.
$q = $wpdb->prepare( "INSERT INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */", $lock_option, time() );
$lock_result = $wpdb->query( $q );
echo "QUERY[ $q ]<br>";
echo "QUERY ERROR[ ".$wpdb->last_error." ]<br>";
//$test_result = $wpdb->query( "INSERT INTO wp_options (option_name, option_value, autoload) VALUES('ZZZ', '1', 'no')");
//if( ! $test_result ) echo "test failed";
if ( ! $lock_result )
{
$lock_result = get_option( $lock_option );
// Dacă o blocare nu a putut fi creată și nu există o blocare, renunță.
if ( ! $lock_result ) {
echo "Aici e punctul în care eșuez<br>";
return false;
}
// Verifică dacă blocarea este încă validă. Dacă da, renunță.
if ( $lock_result > ( time() - $release_timeout ) ) {
return false;
}
// Trebuie să existe o blocare expirată, șterge-o și obține-o din nou.
WP_Upgrader::release_lock( $lock_name );
return WP_Upgrader::create_lock( $lock_name, $release_timeout );
}
// Actualizează blocarea, deoarece până acum cu siguranță avem o blocare, doar trebuie să declanșăm acțiunile.
update_option( $lock_option, time() );
return true;
}
