Skip to content

SiteRepairManual

WordPress repairs run on a throwaway install before they are written down.

Fix “Another update is currently in progress” in WordPress

Checked 11 November 2026 · WordPress 7.1.4 · PHP 8.3.6 · MariaDB 10.11.14 · WP-CLI · Read time: 5 minutes

Case file

Symptom
Every update attempt stops with “Another update is currently in progress”; the site itself stays up
Cause
An interrupted update left a core_updater.lock row in wp_options
Fix
Check the lock is stale, then delete the core_updater.lock row
Result
The update runs to completion and the homepage returns HTTP 200

The break · What you need · The diagnosis · The fix · Verify · If that didn’t work · What happened · Where this came from

The break

Before a core update starts, WordPress writes a lock into its options table — a row named core_updater.lock holding the current time — so two updates cannot run at the same time and corrupt each other. When the update finishes normally, WordPress deletes the row. When the update is interrupted — a timeout, a server restart, a closed browser tab — the cleanup never runs, and the row stays behind. Every later update sees it and refuses to start, with the message this guide is named for. Nothing is broken: no pages are down, no content is lost. Updates are simply blocked until the lock is gone.

This guide reproduces the break first. A disposable install had a core_updater.lock row written into its options table, the way an interrupted update leaves one. The next update attempt stopped with the message, and deleting the row let the update run to completion.

What you need

The diagnosis

1. Confirm the symptom

Try the update again and note the exact message. In the reproduction, the update stopped before downloading anything:

Output — core update with the lock in place

$ wp core update --version=7.1.4 --force
Updating to version 7.1.4 (en_US)...
Error: Another update is currently in progress.

The site itself was unaffected throughout — the homepage returned HTTP 200 the whole time. That is the signature of this lock: updates blocked, site fine.

Key result: the message appears before any download starts, and the site stays up. A download failure looks different — it fails later, after downloading begins — so do not confuse the two.

2. Check the lock row

Look for the row in wp_options. With WP-CLI, one command shows it:

Command — read the lock row

wp option get core_updater.lock

In the reproduction it printed a Unix timestamp — the time the interrupted update started. In phpMyAdmin, the same check is a search for core_updater.lock in the option_name column of wp_options. If the row is there, the lock is stuck. If it is not there, the message is coming from somewhere else, and this guide is not the fix.

The lock is also time-limited: the core updater honours it for 15 minutes, then lets the next update through. The reproduction verified that too — a lock timestamp aged 16 minutes let the update proceed past the lock and start downloading. So waiting works, if you can wait.

Key result: the row exists and holds a timestamp. That is the whole diagnosis — one stale row, nothing else wrong.

3. Check whether the lock is stale

A lock row does not by itself mean the update died — an update that is still running holds the same row. Work out the lock's age from its timestamp: subtract it from the current time (date +%s gives the current Unix time). If the lock is less than 15 minutes old, an update may still be running — wait, and try the update again after 15 minutes. The reproduction verified the expiry the other way: a lock timestamp aged 16 minutes let the update proceed past the lock and start downloading. Only delete the row when the lock is older than 15 minutes, or when you know the update died — a timeout, a server restart, a closed browser tab. Deleting a live lock while an update is writing is how a stuck update becomes a broken one.

The fix

4. Delete the lock row

With WP-CLI, the fix is one command — once the lock is stale:

Command — delete the lock row

wp option delete core_updater.lock

Without WP-CLI, open phpMyAdmin, find the core_updater.lock row in wp_options, and delete it — or run DELETE FROM wp_options WHERE option_name = 'core_updater.lock';. In the reproduction the delete printed Success: Deleted 'core_updater.lock' option., a second read confirmed the row was gone, and the update ran to completion:

Output — core update after deleting the lock

$ wp core update --version=7.1.4 --force
Updating to version 7.1.4 (en_US)...
Downloading update from https://wordpress.org/wordpress-7.1.4.zip...
Success: WordPress updated successfully.

Trap: deleting .maintenance does not touch this lock. The maintenance file and the lock row are two different leftovers, and the official hosting handbook covers them as two separate fixes — delete the file for the maintenance message, delete the row for this one. If you delete the file and the message is still there, you were fixing the wrong leftover.

Verify the site is back

Load the homepage again and check the status code, and confirm the version. In the reproduction the update completed and the homepage returned HTTP 200.

StepUpdate resultHomepage status
Lock row presentError: Another update is currently in progress.HTTP 200
Lock row 16 minutes oldUpdate proceeds, starts downloadingHTTP 200
After deleting the rowSuccess: WordPress updated successfully.HTTP 200

If that didn’t work

Wait 15 minutes

If you cannot delete the row — no database access and no WP-CLI — wait. The lock expires on its own after 15 minutes, and the next update attempt clears it and takes a fresh one. The reproduction proved the expiry by aging the timestamp: an update attempted 16 minutes after the lock was written went straight through.

If the update fails after it starts

Once the lock is gone, a failure later in the update is a different problem — usually a download that cannot reach WordPress.org. The reproduction hit exactly that on its first retry: a proxy timeout while downloading the package, and the retry succeeded. A failed download does not re-create the lock, so do not go deleting rows again — retry the update, and check the server can reach WordPress.org.

What happened

An interrupted update left a core_updater.lock row in wp_options, and every later update refused to start. The lock was checked and found stale, then deleting that one row let the update run to completion, and the homepage stayed at HTTP 200 throughout.

Where this came from