WordPress Maintenance

Browser-based updates getting stuck on the “Confirm your admin email” screen — why Playwright stalls in wp-admin

On hosting environments without SSH access, the fallback is browser automation: Playwright logs into wp-admin and drives the plugin update screen directly. That works fine for months — until one day the script stops dead before it ever reaches the update screen. Note: Playwright is a browser automation tool. It reproduces clicks a human would make, but as code. What the “confirm your admin email” screen is Since WordPress 5.3, wp-admin shows a periodic prompt — roughly every six months — asking the site owner to confirm they still have access to the registered admin email address. It’s a core WordPress feature, not a plugin. Is this still your address? …

Read more
WordPress Maintenance

Why scheduled posts don’t publish on time — inspecting WP-Cron with WP-CLI

A post scheduled to publish at a specific time doesn’t go live when expected. A plugin’s recurring email notification never arrives. This tends to happen on low-traffic sites, and there’s a specific reason for it. Note: WP-Cron is WordPress’s built-in scheduling system. It sounds like the OS-level cron daemon, but the underlying mechanism is quite different. WordPress’s WP-Cron doesn’t work like a real OS cron daemon. On every page load, WordPress checks whether any scheduled task is past its due time and, if so, runs it. This is what’s known as “pseudo-cron” — and its weakness is that nothing runs without a page visit. Schedule a post to publish at …

Read more
WordPress Maintenance

Locked out of wp-admin? Why WP-CLI works when wp-login.php doesn’t

A forgotten password, a security plugin that blocked your own IP by mistake, a plugin bug that turns the admin screen white — the causes vary, but the result is the same: you can’t log in to wp-admin. Note: WP-CLI is a command-line tool for managing WordPress, invoked as wp. It operates directly on the server, without going through a browser. This is exactly the situation where WP-CLI is useful. It works here because it never touches wp-login.php — it reads and writes the WordPress database and filesystem directly, so a broken login screen doesn’t affect it at all. Why WP-CLI keeps working when wp-admin doesn’t A normal login follows …

Read more
WordPress Maintenance

Why phpMyAdmin migrations break plugin settings — and why wp search-replace does not

After a domain migration or HTTPS switch, “all plugin settings are gone” or “Elementor layouts are broken” is a common outcome. The cause, in most cases, is running a string replacement against the WordPress database without accounting for PHP serialized data. WordPress stores plugin configurations, custom field values, and widget settings in PHP’s serialized format. Standard SQL replacements — phpMyAdmin’s find-and-replace, raw UPDATE statements, sed on a .sql dump — rewrite the string value without updating the length metadata that serialization embeds alongside it. The result is a database that appears intact but returns false on every read of the affected values. wp search-replace handles this correctly. Understanding why makes …

Read more
WordPress Maintenance

Verifying a WordPress major upgrade — a 7-step post-upgrade checklist

Verifying a WordPress major upgrade — a 7-step post-upgrade checklist You followed the step-by-step WP-CLI procedure from W4, the terminal printed “Success: Core updated successfully,” and the session is over. Stopping there is the most common place for post-upgrade problems to slip through undetected. WP-CLI’s “success” means the core files were replaced. It doesn’t mean the site is working. Whether the database migration completed cleanly, whether plugins are compatible with the new core, whether forms submit, whether carts process — these require human verification after the command finishes. This checklist pairs with the pre-upgrade checklist from W1. Where W4 covers what to run, this covers what to check when the …

Read more
WordPress Maintenance

Getting ready for WordPress 7.0 — three things to check now: PHP requirements, FSE migration, and editor extensions

Getting ready for WordPress 7.0 — three things to check now: PHP requirements, FSE migration, and editor extensions Five failure patterns from past WordPress major upgrades ended with the observation that “the same structures will recur in some form in the next major (7.0 or 8.0).” This post applies that pattern knowledge to WordPress 7.0 specifically — not as a list of things that will happen, but as a preparatory checklist for what you can verify now. This sits alongside the seven-item pre-flight checklist from W1 rather than replacing it. Think of it as the 7.0-specific supplement. Item 1 — PHP minimum requirement increase (W3 pattern 3 again) W3’s pattern …

Read more
WordPress Maintenance

Running a WordPress major upgrade step by step with WP-CLI — commands and checkpoints for each stage

The W series has covered what to check before a major upgrade, when to apply it, and what can go wrong. This fourth part covers the remaining question: how to actually run it. Once the preparation is in place and the timing is right, this is the command sequence to follow — one stage at a time, with a confirmation step at each boundary. Why not use the admin dashboard Update button The WordPress admin screen has an “Update All” button that runs core, plugin, and theme updates in a single operation. This is the approach to avoid for major upgrades. The reason is loss of isolation. When core plus …

Read more
Engineering Notes

Three site-list UX improvements: instant completion feedback, error highlighting, and auto-deselect

Three site-list UX improvements: instant completion feedback, error highlighting, and auto-deselect The site-list visualization work has run across several posts: the blue pulse and green completion border, the marker-based running-site detection, and the three-state visual hierarchy. v1.6.8 added three more UX improvements to the same area. This post records the design decisions behind them. All three share a common starting point: managing 10–20 sites in a bulk maintenance run that takes several tens of minutes, and making that time easier to follow without introducing new failure modes. Improvement 1 — refresh the thumbnail and badge the moment a site finishes Previously, thumbnails and the pending-plugin badge were only refreshed after …

Read more
Engineering Notes

Why environment variables don’t suppress WP-CLI PHP Deprecated warnings — the phar + shebang path and a three-part structural fix

A previous post covered how to absorb PHP 8.2 Deprecated warnings from WP-CLI using a three-layer defense. The approach — prepending WP_CLI_PHP_ARGS to set error_reporting — works in many environments. But a case came up where Deprecated warnings wouldn’t disappear despite the same configuration. Tracing the cause revealed a structural reason why the environment variable never arrived. This post records that root cause and the three-part fix added in v1.6.8. Why environment variables don’t arrive — the phar + shebang execution path An agency reported that on Xserver, plugin list retrieval was failing across multiple sites (referred to here as “site A / site B”) with a large volume of …

Read more
WordPress Maintenance

When SSH to Xserver suddenly stops working, it’s fail2ban — the official confirmation and a safer reconnection check

If you run WordPress maintenance for clients on Xserver, sooner or later you hit this: SSH was working fine this morning, and now your connection dies the instant it touches the host. No key change on your side, no obvious server-side incident. Just Connection closed by …, and the silence deepens every time you retry. A recent escalation to Xserver support gave us an official answer about what’s actually going on. Worth writing down what an operator needs to know. What the symptom looks like In our observation, the symptom moves through two stages. Lighter: Connection closed by [Xserver IP] — connection killed at the sshd layer before it’s established …

Read more