You clicked update, watched the progress bar hang, and now your site shows The plugin update process has been unable to connect to the filesystem via WordPress' local file system access — or worse, a white screen where your homepage used to be. This happens most often because the update swapped in files incompatible with your PHP version, or a timeout killed the download mid-write, leaving half-old, half-new plugin files on disk. Sometimes it’s a permissions mismatch between your web server user and the wp-content directory that only shows up during writes, not reads. None of these are rare edge cases — plugin update failures are one of the top causes of sudden WordPress downtime. Getting back to a working state, or rolling back to the last good version, takes about five minutes once you know which fix matches your error.
Key Takeaways
- Database locks and PHP memory limits cause most plugin update failures; check both before attempting downgrade procedures.
- File permission errors on wp-content/plugins directory prevent successful downgrades; verify 755 permissions and correct ownership.
- Timeout errors during large plugin updates require increasing PHP max_execution_time and wp-cli timeouts to 300+ seconds.
- Downgrade plugins manually via SFTP or WP-CLI when automatic rollback fails; restore from backups as last resort.
- Prevent future update failures by monitoring disk space, enabling debug logging, and staging updates on test environments first.
Quick Fix
Check your PHP memory limit and database locks first—these cause 80% of plugin update failures. If either is insufficient, increase memory_limit to 512MB and kill blocking database processes, then retry the update. If the update still fails, downgrade via SFTP by replacing the plugin folder with the previous version.
php -r "echo 'Memory: ' . ini_get('memory_limit') . PHP_EOL;" && mysql -u root -p -e "SHOW OPEN TABLES WHERE In_use > 0;"
In This Article
- When Plugin Updates Fail and You Need to Roll Back
- Check Database Locks First—The Most Common Culprit
- Insufficient PHP Memory Causing Update Abort
- File Permission Errors Blocking Plugin Downgrade
- Timeout Errors During Large Plugin Updates
- Downgrade Plugin to Previous Version After Failed Update
- Verify Downgrade Worked and Prevent Future Update Failures
When Plugin Updates Fail and You Need to Roll Back
A plugin update failing mid-process leaves you in one of three states: the plugin is disabled and grayed out in the dashboard, it’s active but throwing a fatal error on every page load, or the update screen itself is stuck at “Updating…” forever. Whatever the symptom, the underlying problem is the same — the new version’s files either didn’t finish writing or aren’t compatible with something else on your stack, and you need to get back to the version that worked.
Rolling back, or “downgrading,” means replacing the current plugin files with the previous version’s files, either from a backup, an old build in wp-content/plugins, or a direct download of the older release from the WordPress.org plugin repository. It’s a file swap, not a database change — most plugins don’t alter database structure between minor versions, so a rollback is usually safe.
You likely landed here after seeing one of these:
Update failed: Could not create directory.Plugin could not be updated because it triggered a fatal error.Fatal error: Uncaught Error: Call to undefined functionAllowed memory size of 268435456 bytes exhausted
Each of these points to a different root cause — a broken write, a version conflict, or a plugin that needs more PHP memory than your host allows by default. The fixes below are ordered by how often they’re the actual cause, starting with the one that resolves this about 80% of the time. Most of these take two to five minutes if you have shell or SFTP access to the server.
Check Database Locks First—The Most Common Culprit
Before you touch any files, check whether WordPress thinks an update is still running. When a plugin update gets interrupted — a timeout, a killed PHP process, a host that hard-restarted mid-write — WordPress leaves a lock row in wp_options and refuses to let you retry or roll back until that lock expires or gets cleared. This is the cause about 80% of the time you see the update screen stuck on “Updating…” with no further progress.
Detect Active Update Locks via Database
Connect to your database (via wp db cli, phpMyAdmin, or a direct MySQL client) and run:
SELECT option_name, option_value FROM wp_options WHERE option_name LIKE '%lock%';
Look for rows named core_updater.lock, plugin_updater_lock, or theme_updater_lock. The option_value is a Unix timestamp — if it’s more than 15-20 minutes older than the current server time (check with date +%s), the update process is dead and the lock is stale. No update runs longer than that under normal conditions, even on slow shared hosting.
Clear Locks with WP-CLI or Direct SQL
If you have WP-CLI installed (WordPress 5.0+, any PHP 7.4+ environment), this is the cleanest method:
wp option delete core_updater.lock && wp option delete plugin_updater_lock
Expected output:
Success: Deleted 'core_updater.lock' option.
Success: Deleted 'plugin_updater_lock' option.
If a given lock doesn’t exist, WP-CLI just says Error: Could not find 'core_updater.lock' option. — that’s fine, ignore it and move to the next fix.
No WP-CLI access? Run the SQL directly:
DELETE FROM wp_options WHERE option_name IN ('core_updater.lock', 'plugin_updater_lock');
Read the output carefully: Query OK, 0 rows affected means there was no lock to begin with — move on to the next section. Query OK, 1 row affected (or 2) means you just cleared a real lock, and you should refresh /wp-admin/update-core.php now. This delete is safe to run even when no lock exists — it only removes rows matching those exact option names, nothing else in wp_options is touched. It applies identically across every WordPress version from 5.0 onward, since the updater lock mechanism hasn’t changed since it was introduced.
Insufficient PHP Memory Causing Update Abort
This is the cause about 15-20% of the time, and it’s the one most people misdiagnose as a “broken” plugin. If your update log or admin screen shows Allowed memory size of 268435456 bytes exhausted or a bare Fatal error: Out of memory, PHP hit its ceiling mid-update and the process died before it could finish writing files. This applies to every WordPress version — it’s a PHP configuration limit, not a WordPress bug.
Check your current limit before touching anything:
wp config get WP_MEMORY_LIMIT
If WP-CLI isn’t installed, grep the config file directly:
grep WP_MEMORY_LIMIT wp-config.php
No output means the constant isn’t set at all, and WordPress is falling back to PHP’s default memory_limit — often 128M on shared hosting, which is too low for most plugin updates in 2026. Set 256M as your floor; go to 512M if you’re updating something heavy like WooCommerce, Elementor Pro, or a page builder with a large asset pipeline.
Locate and Edit Memory Limit in wp-config.php
If the grep above returned nothing, add the line manually. Open wp-config.php and insert this before the /* That's all, stop editing! */ comment:
define('WP_MEMORY_LIMIT', '256M');
If a limit already exists but it’s too low, bump it with sed instead of hand-editing:
sed -i "s/define('WP_MEMORY_LIMIT', '[^']*'/define('WP_MEMORY_LIMIT', '512M'/g" wp-config.php
Expected output: nothing — sed is silent on success. Confirm the change landed:
grep WP_MEMORY_LIMIT wp-config.php
You should see define('WP_MEMORY_LIMIT', '512M'); in the output. Then verify PHP is actually honoring it (some hosts cap this at the server level regardless of what wp-config.php says):
wp eval 'echo WP_MEMORY_LIMIT;'
If that prints 512M, retry the update now. If your host blocks wp-config.php edits (common on some managed WordPress plans), add php_value memory_limit 512M to .htaccess instead, or open a support ticket — Apache/php-fpm memory caps at the server level override anything WordPress sets.
File Permission Errors Blocking Plugin Downgrade
The other common failure mode looks like this in your logs or on-screen: Could not create directory, Permission denied, or Unable to create backup. This happens when the web server process can’t write to wp-content/plugins or wp-content/uploads — WordPress needs write access to both to swap plugin files and stage a rollback backup. This applies to Linux/Unix self-hosted setups; it’s rare on managed hosts since they lock down permissions at the platform level.
Check current permissions before touching anything:
ls -la wp-content/plugins/
ls -la wp-content/uploads/
You want to see something like drwxrwxr-x or drwxr-xr-x owned by www-data (Debian/Ubuntu) or apache (RHEL/CentOS). If the owner is your SSH user, or a hosting-panel user like cpanel1234, that’s your problem — the web server can’t write there.
Identify Web Server User and Fix Ownership
Don’t guess the web server user. Confirm it:
ps aux | grep -E 'apache|nginx|php-fpm' | grep -v grep | awk '{print $1}' | sort -u
Expected output is one of: www-data, apache, nginx, or _www (macOS). Whatever you see, use that exact string in the next command — don’t copy www-data blindly if your box says apache.
Warning: chown -R recursively rewrites ownership on every file under the target directory. If you specify the wrong user, plugin files become unreadable by the actual web server process and you’ll trade one error for another. Double-check the output above first.
chown -R www-data:www-data wp-content/plugins
chmod -R 755 wp-content/plugins
This gives the web server ownership and sets directories to 755 (owner read/write/execute, group and others read/execute) — the standard baseline for WordPress. Files inside should be 644, not 755; if you want to be precise, run find wp-content/plugins -type f -exec chmod 644 {} \; after the recursive chmod. Verify with:
ls -ld wp-content/plugins
Expected: drwxr-xr-x www-data www-data wp-content/plugins (or your host’s equivalent user). Repeat both commands against wp-content/uploads if the backup step is what’s failing specifically.
Some shared hosts (GoDaddy, Bluehost legacy plans, some cPanel resellers) block chown entirely for SSH users outside their own account — you’ll get Operation not permitted. If that happens, skip ownership changes and loosen permissions instead:
chmod -R 775 wp-content/plugins
This makes the directory group-writable, which works if the web server runs under the same group as your SSH user (common on shared hosting setups where PHP runs as your account, not www-data). Retry the plugin downgrade immediately after either fix — no need to restart PHP-FPM or Apache for permission changes to take effect.
Timeout Errors During Large Plugin Updates
Big plugins — WooCommerce, Elementor Pro, anything bundling a page builder and a dozen add-ons — sometimes fail mid-download or mid-extraction with one of these:
Connection timed out
cURL error 28: Operation timed out after 30000 milliseconds
HTTP request timed out
This isn’t a permissions or PHP version problem. It’s the web server or PHP giving up before the download and extraction finish. Shared hosts commonly cap max_execution_time at 30 seconds — fine for normal page loads, useless for a 40MB plugin zip over a slow connection.
Increase Timeout via .htaccess or php.ini
If you have shell access, the fastest fix is bumping the limit at the server level rather than fighting with WordPress’s internal timeout settings.
echo 'php_value max_execution_time 300' >> .htaccess
This adds a 5-minute execution limit to your site’s root .htaccess. Verify it landed correctly:
grep max_execution_time .htaccess
Expected output: php_value max_execution_time 300. Note this only works on Apache with mod_php — it’s ignored (or throws a 500) under PHP-FPM or Nginx.
For PHP-FPM setups, edit php.ini directly:
find /etc/php -name php.ini
This locates your active config (e.g. /etc/php/8.2/apache2/php.ini or /etc/php/8.2/fpm/php.ini). Open it and set:
max_execution_time = 300
Then restart the service that owns it:
systemctl restart apache2
systemctl restart php8.2-fpm
Confirm the change actually applied:
php -r 'echo ini_get("max_execution_time");'
Expected output: 300. If it still reads 30, you edited the wrong php.ini — check phpinfo() for “Loaded Configuration File” to find the real one. Applies to Ubuntu 22.04/24.04 and Debian 12 with Apache or PHP-FPM; behavior is identical across both.
For plugins over 50MB even on a 300-second limit, skip the browser entirely and use WP-CLI, which bypasses the web server timeout altogether:
wp plugin install plugin-name --force --allow-root
This installs (or reinstalls) directly through PHP-CLI with no HTTP request timeout involved — the preferred method for large plugin updates on any WordPress version.
Downgrade Plugin to Previous Version After Failed Update
Once you’ve fixed whatever caused the update to fail — timeout, memory limit, a bad PHP version conflict — you still need to get the plugin back to a working version. WordPress doesn’t keep a rollback button for plugins the way it does for core. You have three options: WP-CLI, manual file replacement, or dashboard reinstall. WP-CLI is the fastest and the only one that lets you pin an exact version number.
Use WP-CLI to Install Specific Plugin Version
wp plugin get plugin-name
This shows the currently installed version so you know what you’re downgrading from. Then check wordpress.org/plugins/plugin-name/advanced/ for the full version history — every public release is listed there with its exact version string.
wp plugin install akismet --version=5.0.1 --force
The --force flag tells WP-CLI to overwrite the currently installed files even though a version already exists in that slot — without it, WP-CLI refuses to touch an existing install. Expected output:
Installing Akismet Anti-Spam (5.0.1)...
Success: Installed 1 of 1 plugins.
Verify it landed correctly:
wp plugin list | grep akismet
This should show 5.0.1 in the version column. Applies to all WordPress versions with WP-CLI installed — no dashboard access required, which matters if the update failure locked you out of wp-admin.
Manual Downgrade: Download and Replace Plugin Folder
No WP-CLI on the server? Do it by hand. Visit wordpress.org/plugins/plugin-name/advanced/, pick the version you need, and download the zip. Then SSH or SFTP into the server:
cd wp-content/plugins
Back up the current (broken) version before deleting anything — you may need to compare files later:
cp -r plugin-name plugin-name-backup
Warning: the next command deletes the plugin folder entirely. Confirm your backup copy exists first.
rm -rf plugin-name
unzip plugin-name-5.0.1.zip
Verify the version landed correctly by checking the readme:
ls -la plugin-name
head -20 plugin-name/readme.txt
The “Stable tag” line in readme.txt should read 5.0.1. Reactivate through the dashboard, or from the command line:
wp plugin activate plugin-name
Expected output: Plugin 'plugin-name' activated. Applies to every WordPress version — this method works identically whether you’re on WordPress 6.4 or 6.9, since it’s just file replacement, not a WordPress API call.
Verify Downgrade Worked and Prevent Future Update Failures
Don’t stop at “the site loads again.” Confirm the version, the status, and the logs — then close the door on this happening next month.
Check Plugin Version and Status Post-Downgrade
wp plugin list --format=table
This prints every installed plugin with its version and status in one table — scan for your plugin’s row and confirm the version matches what you downgraded to.
wp plugin get plugin-name
This shows detailed info for a single plugin, including version: 5.0.1. In the dashboard, the same number appears under Plugins > Installed Plugins, right under the plugin name.
wp plugin is-active plugin-name
Outputs 1 if active, 0 if not. If it’s 0 and you expected it active, run wp plugin activate plugin-name and check the dashboard for admin notices before moving on.
Also tail the error log for a minute while you click around the site:
tail -f /var/log/apache2/error.log
(Or /var/log/php-fpm.log on Nginx/PHP-FPM stacks.) No new PHP Fatal or Warning lines while the plugin runs means the downgrade held.
Set Up Preventive Measures for Future Updates
Back up the database before every plugin update — no exceptions, even for “minor” version bumps:
wp db export backup-$(date +%Y%m%d).sql
This creates a timestamped SQL dump you can restore in under a minute if the next update goes sideways. For scheduled, off-site backups (files and database), BackWPup handles the cron job so you’re not relying on memory.
Bump memory permanently in wp-config.php rather than patching it after each failure:
define( 'WP_MEMORY_LIMIT', '512M' );
Add this line above /* That's all, stop editing! */. Then keep an eye on logs after updates:
wp log tail --lines=50 | grep -i error
Finally, clone the site to a staging subdomain and run updates there first — most managed hosts (WP Engine, Kinsta, Cloudways) include one-click staging. Push to production only after you’ve confirmed no fatal errors. And keep PHP current: 8.2 is the practical floor for WordPress 6.9-era plugins in 2026, with 8.3 recommended where your plugins support it.
Frequently Asked Questions
Why did my WordPress plugin update fail and how do I downgrade?
Plugin updates fail due to database locks, insufficient PHP memory, file permissions, or timeouts. Downgrade by deactivating the plugin, replacing its files via SFTP with the previous version, or using WP-CLI’s rollback command if available.
How do I check if a database lock is causing my plugin update to fail?
Connect to your database via phpMyAdmin or command line and run SHOW OPEN TABLES WHERE In_use > 0; to identify locked tables. Kill long-running processes and ensure no backup jobs are running during updates.
What PHP memory limit do I need for large plugin updates?
Increase PHP memory_limit to at least 256MB, preferably 512MB for large plugins. Edit wp-config.php by adding define(‘WP_MEMORY_LIMIT’, ‘512M’); before the line that says ‘That’s all, stop editing!’
Can I downgrade a WordPress plugin without losing data or settings?
Yes, downgrading preserves plugin data and settings stored in the database. However, if the failed update modified the database schema, downgrading may cause compatibility issues; always backup before downgrading to an older version.
Related Reads
- Will Error 500 Fix Itself? No—Here’s What to Do
Error 500 won’t fix itself. Learn the exact commands to diagnose and fix it in 5 minutes. Most common causes first.…
- WordPress REST API Unexpected Result: 5 Fixes
WordPress REST API encountered an unexpected result error? Try these 5 fixes ordered by likelihood. Copy-paste commands …
- Why Is My Website Only Showing a White Screen? Fix It Now
WordPress white screen? Enable debug mode, check PHP memory, disable plugins. Copy/paste fixes ordered by likelihood. Wo…