During an update WordPress creates a `.maintenance` marker. If the process dies, the marker can remain. Deleting it restores requests, but it does not prove that the plugin, theme, translation, or core update finished copying files.

Start with evidence and the smallest reversible change; work on staging when possible, preserve the logs and rollback material if production is already down, and keep the objective specific: remove the maintenance marker only after determining whether the interrupted update left a complete and runnable release.

What the symptom narrows down

  • The browser, PHP process, or network connection ended during the update.
  • A permission, quota, or disk-space failure interrupted file replacement.
  • Concurrent updates or deployment tools modified the same files.

The branches are ordered to protect the strongest evidence around this possibility: the browser, PHP process, or network connection ended during the update. The observed scope and logs—not a familiar-looking error screen—decide which one applies.

An update changes code while production data and caches remain in place; a clean plugin ZIP does not reproduce the site unless PHP, WordPress, database schema, theme, must-use plugins, and generated assets are also comparable; in this guide, the practical goal is to remove the maintenance marker only after determining whether the interrupted update left a complete and runnable release.

Evidence to collect before the fix

  1. Capture the update time and inspect PHP/server logs before removing evidence.
  2. Check disk space and the destination directory for partial or zero-length files.
  3. Read WordPress’s update state and compare the affected package version with its files.
  4. Take a file/database backup if the current state is not already recoverable.

The sequence moves from observation toward intervention. Preserve the result of the final check—take a file/database backup if the current state is not already recoverable—because it provides a useful comparison after the repair.

One practical branch through the failure

Begin with the first plausible cause: the browser, PHP process, or network connection ended during the update. Before changing state, write down what would confirm it and run the first read-only check: capture the update time and inspect PHP/server logs before removing evidence.

If the result supports that cause, try one bounded repair on staging: remove only the root .maintenance marker after confirming no updater is active. If evidence from “Capture the update time and inspect PHP/server logs before removing evidence” points elsewhere, keep this layer unchanged and move to the next check. That small decision log is far easier to audit than several simultaneous edits.

Confirm updater state before clearing maintenance mode

WP-CLI can report and deactivate maintenance mode. First verify that no package update process is still running and that the site has a restorable backup.

wp maintenance-mode status
wp core check-update
wp plugin list --update=available
wp maintenance-mode deactivate

Interpretation and safety: If WP-CLI cannot bootstrap, the fallback is removing only the root .maintenance file after confirming no updater is active. Never delete the entire WordPress directory.

Apply fixes in the safest order

  1. Remove only the root .maintenance marker after confirming no updater is active.
  2. Reinstall or roll back the interrupted component from a trusted package.
  3. Correct the write, disk, or deployment problem before retrying.

Before applying “Remove only the root .maintenance marker after confirming no updater is active,” name its rollback point and the evidence that will count as success. Afterward, repeat the original request and specifically check whether you can open the public site and wp-admin, then run the affected component’s main function; a changed symptom at that point is new evidence, not permission to make several more changes at once.

Prove recovery

  • Open the public site and wp-admin, then run the affected component’s main function.
  • Check Site Health and logs for update or fatal errors.
  • Perform the next update on staging or through a controlled deployment path.

One successful refresh is not closure. Keep the incident open until you can also check Site Health and logs for update or fatal errors, adjacent paths have not regressed, temporary diagnostics are gone, and another operator can explain what changed.

Prepare a useful escalation if the boundary is outside your control

For maintainer support, provide exact old/new versions, PHP and WordPress versions, the smallest reproduction, first relevant log or console error, and the result under a default theme or reduced plugin set; keep private data out of exported diagnostics; include the result of this first observation: capture the update time and inspect PHP/server logs before removing evidence.

State what was tested, including the result of “Capture the update time and inspect PHP/server logs before removing evidence,” and what changed between attempts; evidence tied to that observation is safer and more actionable than granting broad access or sending an unnecessary full database export.

Shortcuts that create a second incident

  • Do not delete arbitrary files containing the word maintenance.
  • Do not assume the recovered front page means the update is complete.

Operator record

ScopeRecover WordPress From a Stuck “Briefly Unavailable for Scheduled Maintenance” Page · URL · role · first/last occurrence
EvidenceStatus · request ID · first relevant log entry
ChangeOne action · backup/rollback point · operator
ProofOriginal reproduction · adjacent paths · monitoring window

Primary references

Editorial note: The scenario above illustrates how to approach “Remove only the root .maintenance marker after confirming no updater is active”; it is a documented example, not a claim about a reader’s server, so verify the cited documentation, take the appropriate backup, and follow the real environment’s access and change-control rules.