Wordpress Versione 5 - Un altro aggiornamento è attualmente in corso
Sono consapevole che una domanda simile sia già stata posta, ma questa NON è un duplicato perché è specifica per WordPress 5+ e le risposte alla domanda simile si sono rivelate inefficaci.
Problema:
Il mio WordPress è alla versione 5.01 e ci sono alcuni problemi tecnici. I log degli errori PHP indicano che il core di WordPress deve essere reinstallato (errori di sintassi nelle query SQL core con $vars
vuoti).
Tuttavia; quando provo a reinstallare WordPress dall'area di amministrazione; viene visualizzato il messaggio:
Un altro aggiornamento è attualmente in corso
Ho provato tutte le soluzioni presenti in questa domanda ma sono invalide o non applicabili (sono state tutte testate per confermare questo):
- Il file
.maintenance
è stato disabilitato manualmente. - La tabella
<...>_options
nel database NON contiene il tag.lock
per l'aggiornamento di WordPress. Nonostante ciò sia confermato nel codice PHP. - Tutti i plugin sono stati disabilitati.
- Il lock non scade e non si risolve dopo 15 minuti.
Non riesco ancora a trovare né la causa della notifica né la notifica stessa nel codice PHP, per poterla sovrascrivere manualmente (riferimento qui di nuovo).
Richiesta:
Come posso sovrascrivere il messaggio "Un altro aggiornamento è attualmente in corso" in WordPress 5. Questa richiesta è specifica per WP5 poiché sembra che il sistema possa essere cambiato rispetto alla versione precedente a 5.0.
Aggiornamento
Non sto cercando [solo] una soluzione alternativa al problema; vorrei piuttosto una spiegazione su come viene generato il testo "Un altro aggiornamento è attualmente in corso" in WordPress 5.
Grazie per qualsiasi indicazione su questo argomento.

puoi provare a fare un aggiornamento manuale, purché non abbia apportato modifiche ai file core di WordPress (se l'hai fatto ti suggerisco di prenderne nota e riapplicarle dopo l'aggiornamento). Basta andare su WordPress.org, scaricare l'ultimo pacchetto di WordPress e copiarlo nella cartella principale del tuo server. Assicurati di sovrascrivere solo i file core di WordPress, lasciando fuori la cartella wp-content. Inserisci i tuoi dettagli nel file wp-config.php e questo dovrebbe probabilmente risolvere il problema per te. PS. ricordati di fare un backup del tuo database e delle cartelle originali di WordPress prima di procedere.

Riceverai questo errore anche se WordPress non riesce a inserire un lock
nella tabella wp_options
. Potrebbe essere che la tabella non sia configurata correttamente, ad esempio quando viene copiata da un'altra sorgente. Il campo option_id
dovrebbe essere autoincrement altrimenti l'aggiornamento fallirà. Verifica se riesci a inserire manualmente una voce di lock nel database:
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('core_updater.lock', '1', 'no');
Se il campo option_id
non è autoincrement e questa query fallisce, dovrai rendere il campo option_id
autoincrement. Potresti dover rimuovere l'indice da questo campo prima di impostarlo come autoincrement.

Non sono sicuro se questo aiuterà ad espandere la conversazione per risolvere il problema, ma ho individuato che il messaggio di errore viene generato dalle righe 118-122 del file class-core-upgrade.php (wp-admin/includes)
// Blocco per prevenire aggiornamenti multipli del Core.
$lock = WP_Upgrader::create_lock( 'core_updater', 15 * MINUTE_IN_SECONDS );
if ( ! $lock ) {
return new WP_Error( 'locked', $this->strings['locked'] );
}
La funzione create_lock si trova nel file class-wp-upgrader.php alle righe 885-918
Inserendo echo prima dei return, sono riuscito a individuare che il problema è in queste righe della funzione (899-901)
// Se non è possibile creare un blocco e non esiste già un blocco, interrompi.
if ( ! $lock_result ) {
return false;
}
Per qualche motivo, riesco a interrogare il codice sopra tramite RouteXL e viene generato un blocco, ma WP non riesce a inserire la query alla riga 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() ) );
Inserendo questa riga subito dopo la 893
echo $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */", $lock_option, time() );
ottengo questo codice echo quando eseguo un aggiornamento
INSERT IGNORE INTO `wp_options` ( `option_name`, `option_value`, `autoload` ) VALUES ('core_updater.lock', '1606851384', 'no') /* LOCK */
Ho eseguito questa query manualmente e inserisce correttamente la riga nel database MySQL utilizzando le stesse credenziali utente/password della mia installazione WP.
Non sono del tutto sicuro del motivo per cui WordPress non riesce a farlo, mentre io riesco a farlo manualmente con le stesse credenziali.

Ho modificato la funzione create_lock per produrre alcuni codici di errore e informazioni. Ho anche cambiato la query rimuovendo l'IGNORE dopo INSERT e finalmente mi dà un errore quando provo ad aggiornare con MySQL:
update-core.php ora genera:
Aggiorna 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' ]
È qui che sto fallendo
Un altro aggiornamento è attualmente in corso.
Duplicate entry 'core_updater.lock' for key 'option_name' Questo è il motivo per cui fallisce!
Il colpo di scena? Non vedo quella riga o quel valore nella mia tabella wp_options! Molto molto strano! Ora devo capire perché dice che è un duplicato, anche se questa opzione non esiste nel mio database!
class-wp-upgrader.php (modificato per produrre dati di diagnostica)
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';
// Prova a creare il lock
$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 );
// Se non è stato possibile creare un lock e non esiste un lock, esci
if ( ! $lock_result ) {
echo "È qui che sto fallendo<br>";
return false;
}
// Controlla se il lock è ancora valido. Se lo è, esci
if ( $lock_result > ( time() - $release_timeout ) ) {
return false;
}
// Deve esistere un lock scaduto, cancellalo e riprova
WP_Upgrader::release_lock( $lock_name );
return WP_Upgrader::create_lock( $lock_name, $release_timeout );
}
// Aggiorna il lock, a questo punto abbiamo sicuramente un lock, dobbiamo solo attivare le azioni
update_option( $lock_option, time() );
return true;
}
