Wordpress Versión 5 - Otra actualización está en progreso
Sé que una pregunta similar se ha hecho antes, pero esto NO es un duplicado porque es específico para WordPress 5+ y las respuestas a la pregunta similar no han funcionado.
Problema:
Mi WordPress es la Versión 5.01 y hay algunos problemas técnicos. Los logs de errores PHP indican que el core de WordPress necesita ser reinstalado (errores de sintaxis en consultas SQL del core con variables $vars
vacías).
Sin embargo; cuando intento reinstalar WordPress desde el área de administración; aparece el mensaje:
Otra actualización está actualmente en progreso
He probado todas las soluciones en esta pregunta y no son válidas o no aplican (todas han sido intentadas para confirmar esto):
- El archivo
.maintenance
ha sido desactivado manualmente. - La tabla
<...>_options
NO contiene la etiqueta.lock
de actualización de WordPress. A pesar de que esto aparece confirmado en el código PHP. - Todos los plugins han sido desactivados.
- El bloqueo no expira después de 15 minutos.
Aún así no puedo encontrar ni la causa de la notificación ni la notificación en sí en el código PHP, para anularla manualmente (referencia aquí nuevamente).
Solicitud:
¿Cómo puedo anular el mensaje "Otra actualización está en progreso" en WordPress 5? Esta solicitud es específica para WP5 ya que parece que el sistema puede haber cambiado desde antes de la versión 5.0.
Actualización
No busco [solo] cómo solucionar el problema; sino más bien una explicación de cómo se genera el texto "Otra actualización está en progreso" en WordPress 5.
Gracias por cualquier orientación sobre esto.

Puedes intentar realizar una actualización manual, siempre y cuando no hayas realizado cambios en los archivos principales de WordPress (si lo hiciste, te sugiero que los anotes y los vuelvas a aplicar después de la actualización). Solo dirígete a WordPress.org, descarga el paquete más reciente de WordPress y cópialo en la carpeta raíz de tu servidor. Asegúrate de sobrescribir solo los archivos principales de WordPress, excluyendo la carpeta wp-content. Ingresa tus detalles en el archivo wp-config.php y eso probablemente solucionará este problema para ti.
PD: Recuerda hacer una copia de seguridad de tu base de datos y de las carpetas originales de WordPress antes de continuar.

También obtendrás este error si WordPress no puede insertar un lock
en la tabla wp_options
. Puede ser que la tabla no esté configurada correctamente, por ejemplo, cuando se copia de otra fuente. El campo option_id
debería ser autoincremental o la actualización fallará. Verifica si puedes insertar manualmente una entrada de bloqueo en la base de datos:
INSERT INTO `wp_options` (`option_name`, `option_value`, `autoload`) VALUES ('core_updater.lock', '1', 'no');
Si el campo option_id
no es autoincremental y esta consulta falla, necesitarás hacer que el campo option_id
sea autoincremental. Es posible que necesites eliminar el índice en este campo antes de hacerlo autoincremental.

No estoy seguro si esto ayudará a expandir la conversación para resolver esto, pero he reducido el mensaje de error a las líneas 118-122 del archivo class-core-upgrade.php (wp-admin/includes)
// Bloqueo para evitar múltiples actualizaciones del núcleo.
$lock = WP_Upgrader::create_lock( 'core_updater', 15 * MINUTE_IN_SECONDS );
if ( ! $lock ) {
return new WP_Error( 'locked', $this->strings['locked'] );
}
La función create_lock está en el archivo class-wp-upgrader.php en las líneas 885-918
Insertando códigos echo antes de los returns, pude reducirlo a estas líneas en la función (899-901)
// Si no se pudo crear un bloqueo, y no hay un bloqueo, salir.
if ( ! $lock_result ) {
return false;
}
Por alguna razón, puedo consultar el código anterior mediante RouteXL y se genera un bloqueo, pero WP falla al insertar la consulta en la línea 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() ) );
Insertando esta línea justo después de la 893
echo $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */", $lock_option, time() );
me muestra el código echo cuando hago una actualización
INSERT IGNORE INTO `wp_options` ( `option_name`, `option_value`, `autoload` ) VALUES ('core_updater.lock', '1606851384', 'no') /* LOCK */
Ejecuté esta consulta manualmente y inserta la fila correctamente en la base de datos MySQL usando el mismo usuario/contraseña que mi instalación de WP.
No estoy completamente seguro de por qué WordPress falla al hacer esto, pero puedo hacerlo manualmente usando las mismas credenciales.

Modifiqué la función create_lock para producir algunos códigos de error e información. También cambié la consulta eliminando el IGNORE después de INSERT y finalmente me da un error al intentar actualizar con MySQL:
update-core.php ahora genera:
Actualizar WordPress
QUERY[ INSERT INTO `wp_options` ( `option_name`, `option_value`, `autoload` ) VALUES ('core_updater.lock', '1606853111', 'no') /* LOCK */ ]
QUERY ERROR[ Entrada duplicada 'core_updater.lock' para la clave 'option_name' ]
Aquí es donde estoy fallando
Ya hay otra actualización en progreso.
Entrada duplicada 'core_updater.lock' para la clave 'option_name' ¡Por eso está fallando!
¿Lo más extraño? ¡No veo esa línea o valor en mi tabla wp_options! ¡Muy muy extraño! ¡Ahora necesito ver por qué dice que es un duplicado, aunque esta opción no existe en mi base de datos!
class-wp-upgrader.php (modificado para producir datos de diagnóstico)
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';
// Intentar bloquear
$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 );
// Si no se pudo crear un bloqueo y no hay un bloqueo, salir
if ( ! $lock_result ) {
echo "Aquí es donde estoy fallando<br>";
return false;
}
// Verificar si el bloqueo sigue siendo válido. Si lo es, salir
if ( $lock_result > ( time() - $release_timeout ) ) {
return false;
}
// Debe existir un bloqueo expirado, limpiarlo y volver a adquirirlo
WP_Upgrader::release_lock( $lock_name );
return WP_Upgrader::create_lock( $lock_name, $release_timeout );
}
// Actualizar el bloqueo, ya que en este punto definitivamente tenemos un bloqueo, solo necesitamos ejecutar las acciones
update_option( $lock_option, time() );
return true;
}
