WordPressコアバージョンアップ中に「別の更新が現在進行中です。」と表示された場合の対処法

WordPress 5.2.4 から 5.3.2 へバージョンアップするために管理画面の更新ボタンからポチっとしたのですが、ダウンロード中から画面が更新されないためブラウザを更新したところ「別の更新が現在進行中です。」のメッセージが表示されバージョンアップの処理を進めることが出来なくなってしまいました。

対処法を調べてみると15分待つか wp_optionsテーブルに書き込まれている option_name が core_updater.lock のレコードを削除すればいいとのこと。

WordPressアップデート時のロック処理

ロック処理実行

\wp-admin\includes\class-core-upgrader.php の 118行目の create_lock() で 15分間ロックするよう wp_options テーブルに書き込むようになっています。

// Lock to prevent multiple Core Updates occurring
$lock = WP_Upgrader::create_lock( 'core_updater', 15 * MINUTE_IN_SECONDS );
if ( ! $lock ) {
	return new WP_Error( 'locked', $this->strings['locked'] );
}

create_lock() の中身

\wp-admin\includes\class-wp-upgrader.php の 828行目から create_lock() があります

/**
 * Creates a lock using WordPress options.
 *
 * @since 4.5.0
 * @static
 *
 * @param string $lock_name       The name of this unique lock.
 * @param int    $release_timeout Optional. The duration in seconds to respect an existing lock.
 *                                Default: 1 hour.
 * @return bool False if a lock couldn't be created or if the lock is still valid. True otherwise.
 */
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';

	// Try to lock.
	$lock_result = $wpdb->query( $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */", $lock_option, time() ) );

	if ( ! $lock_result ) {
		$lock_result = get_option( $lock_option );

		// If a lock couldn't be created, and there isn't a lock, bail.
		if ( ! $lock_result ) {
			return false;
		}

		// Check to see if the lock is still valid. If it is, bail.
		if ( $lock_result > ( time() - $release_timeout ) ) {
			return false;
		}

		// There must exist an expired lock, clear it and re-gain it.
		WP_Upgrader::release_lock( $lock_name );

		return WP_Upgrader::create_lock( $lock_name, $release_timeout );
	}

	// Update the lock, as by this point we've definitely got a lock, just need to fire the actions.
	update_option( $lock_option, time() );

	return true;
}

release_lock() の中身

ロックする処理があれば解除する処理がセットであります。create_lock() を解除する release_lock() が同じ \wp-admin\includes\class-wp-upgrader.php の 873行目にあります。

/**
 * Releases an upgrader lock.
 *
 * @since 4.5.0
 * @static
 *
 * @see WP_Upgrader::create_lock()
 *
 * @param string $lock_name The name of this unique lock.
 * @return bool True if the lock was successfully released. False on failure.
 */
public static function release_lock( $lock_name ) {
	return delete_option( $lock_name . '.lock' );
}

強制的にロック解除

ロックレコード確認

SELECT * FROM `wp_options` WHERE `option_name` = 'core_updater.lock';

ロックレコード削除

DELETE FROM `wp_options` WHERE option_name = 'core_updater.lock';

コメント

タイトルとURLをコピーしました