"WordPress 6.9 Broke My Site" — How to Recover (2026 Field Guide)

You hit Update Now, the page reloaded — and either the front-end shows a critical error, or wp-admin is unreachable, or Slider Revolution stopped rendering, or Elementor Edit-with shows a blank canvas. Here's the field-tested recovery path: roll back the core in 5 minutes, identify the one deprecated function that did it, patch the offender, and stop it from happening on 7.0.

mysite.com/wp-admin
SimpleReview extension
⚠ Fatal error after WordPress 6.9 update
Uncaught Error: Call to undefined function create_function()
in /wp-content/plugins/revslider/includes/operations.class.php:1842
Plugin: Slider Revolution 6.5.27 · WordPress 6.9 · PHP 8.2
PluginsUpdatesTools
✓ Site recovered · Slider Revolution patched
Dashboard
Comment×
Patch deprecated PHP function|
Fix it ✓ Done
waiting for selection…
Detected
Deprecatedcreate_function
Pluginrevslider 6.5.27
Fix plan
Replace create_function() with anonymous function (PHP 7.2+ pattern)
Result
Site loads. Slider Revolution renders. WP 6.9 stays.
✓ PR opened
fix: replace create_function with closure
operations.class.php · 1 line
Click SimpleReview → select the fatal error → Fix it → site recovered without rolling back 6.9
Site is down right now after the 6.9 update? → SimpleReview reads your debug.log over SFTP, identifies which plugin or theme called the deprecated function, and opens a one-line PR — usually faster than rolling back the whole core.

Key Takeaways

  • The fastest recovery is a rollback via WP Downgrade or by replacing wp-admin + wp-includes over FTP. Buys you time, but keeps you on the old core.
  • The real fix is to identify the one deprecated PHP function call (usually one-line patch) and stay on 6.9.
  • Most-broken plugins after a major WP update: Slider Revolution (older builds), Elementor (custom widgets), WooCommerce (deprecated hooks), classic-widgets / WPBakery / cache plugins.
  • Always enable WP_DEBUG_LOG first — the actual error file/line is in wp-content/debug.log, hidden behind the generic "critical error" page.
  • Disable major-core auto-updates with define( 'WP_AUTO_UPDATE_CORE', 'minor' ); in wp-config.php so the next 7.0 doesn't surprise you.

Step 1: Roll Back to 6.8 (10-Minute Triage)

If your site is down and a paying customer is on the phone, get the old core back first. Two paths:

Path A: WP Downgrade plugin (if wp-admin still works)

  1. Install the WP Downgrade plugin (free).
  2. Go to Settings → WP Downgrade and set WordPress Target Version to 6.8.2.
  3. Click Save Changes.
  4. Go to Dashboard → Updates and click Re-install Now for the WordPress version. The plugin tricks Updates into pulling 6.8.2 instead of 6.9.

Path B: Manual rollback over FTP (if wp-admin is unreachable)

  1. Download WordPress 6.8.2 from wordpress.org/download/releases/.
  2. Connect via FTP / SFTP. Delete the wp-admin and wp-includes folders from your site root. Do not touch wp-content or wp-config.php.
  3. Upload the wp-admin and wp-includes folders from the 6.8.2 zip.
  4. Visit yoursite.com/wp-admin/. WordPress will prompt you to run a database update — click it.
Rollback is triage, not a fix. Sooner or later you have to upgrade to 6.9 (security patches stop landing on old branches). Use the time you bought to do Steps 2-4 properly.

Step 2: Find the Actual Error in debug.log

The "There has been a critical error" page is intentionally vague. The real error is in wp-content/debug.log once you enable logging in wp-config.php:

define( 'WP_DEBUG',         true );
define( 'WP_DEBUG_LOG',     true );    // writes to wp-content/debug.log
define( 'WP_DEBUG_DISPLAY', false );   // hide errors from visitors
@ini_set( 'display_errors', 0 );

Reload the broken page, then read the log:

PHP Fatal error:  Uncaught Error: Call to undefined function create_function()
in /wp-content/plugins/revslider/includes/operations.class.php on line 1842

PHP Fatal error:  Uncaught Error: Class "WP_Widget_Factory" not found
in /wp-content/themes/old-theme/functions.php on line 88

Now you know the file, the line, and the deprecated function. That's 80% of the recovery.

Step 3: Patch the Most Common Breakages

Slider Revolution (older versions)

Symptom: create_function() not found in revslider/includes/operations.class.php. WP 6.9 dropped the polyfill that was bridging the PHP 7.2 removal. Two fixes:

  1. Update Slider Revolution to the latest 6.7+ via the plugin's License → Check for Updates page (it ships its own updater, not the WP plugin store).
  2. If you can't update (license expired), find the create_function() call in operations.class.php and replace with an anonymous function:
    // Before:
    $cb = create_function('$a', 'return strtolower($a);');
    
    // After:
    $cb = function($a) { return strtolower($a); };

Elementor — custom widgets blank

Update Elementor to the latest 3.x (the team usually pushes a 6.9-compat patch within 48 hours of release). If your custom widgets stop rendering, it's almost always one of:

Classic widgets / WPBakery

Some classic page builders relied on hooks removed in 6.9 (widget_init arity changed). Updating to the latest version fixes most of them. If the vendor abandoned the plugin, use the Classic Widgets plugin from Automattic as a fallback.

WooCommerce — deprecated hooks

Custom WooCommerce extensions often hook into filters that get renamed across major versions. Search the WooCommerce GitHub repo for the specific hook in your debug.log error and check its since / deprecated annotations.

Cache plugins (W3 Total Cache, WP Rocket, LiteSpeed)

Cache plugins serialize PHP objects to disk. After a WP version bump, those serialized objects can fail to unserialize and trigger fatal errors on every page load. Fix: clear the cache via FTP — delete everything in wp-content/cache/.

Step 4: Prevent the Next Major Update From Doing This

  1. Use a staging environment. Most managed WordPress hosts (SiteGround, Kinsta, WP Engine, Cloudways) give you one-click staging. Apply the major update to staging first, click around for 48 hours, then push to production.
  2. Disable auto major updates. Add to wp-config.php:
    // Allow automatic minor security patches (6.9.1, 6.9.2)
    // but require manual click for majors (6.9 → 7.0)
    define( 'WP_AUTO_UPDATE_CORE', 'minor' );
  3. Subscribe to the WP Core Field Guide at make.wordpress.org/core/. They publish a list of deprecated functions and breaking changes 2-3 weeks before each major.
  4. Run PHPCompatibility scans. Install the PHP Compatibility Checker plugin — it scans every plugin and theme for deprecated function calls and tells you what will break before you click Update.

Quick-Reference: What Broke in WP 6.9

SymptomLikely causeFast fix
Slider Revolution blank / fatal errorcreate_function removed; old buildUpdate Slider Revolution to 6.7+ or patch operations.class.php
Elementor canvas blankControls API breakageUpdate Elementor to latest 3.x
jQuery .live() / .size() not a functionjQuery 3.7 dropped legacyReplace with .on() / .length in custom JS
WooCommerce checkout fatalRenamed filter hookUpdate WooCommerce + extensions
Widgets section emptywidget_init arity changedInstall Classic Widgets plugin
Random "Class not found" everywhereStale cache plugin serialized dataDelete wp-content/cache/* via FTP
Site loads but admin bar missingTheme calls deprecated wp_get_current_user patternReplace with current PHP signature

How SimpleReview Handles This

If you don't want to spelunk through debug.log and patch deprecated functions by hand, SimpleReview can do it from a single browser click:

  1. Install the Chrome extension and open the broken site (or wp-admin if it loads).
  2. Click the SimpleReview icon, then click the fatal-error notice or the broken slider.
  3. Type "Patch deprecated PHP function" and click Fix it. SimpleReview pulls your debug.log over SFTP, identifies the file and line, and opens a PR with the one-line replacement (e.g., create_function() → anonymous function).

Useful when you have a custom-coded plugin or theme and rolling back the WP core isn't an option (because, for example, 6.9 also shipped a security patch you actually want to keep).

Patch the WP 6.9 Breakage Without Rolling Back the Core

Click on the fatal error — SimpleReview reads your repo, finds the deprecated call, and opens a PR.

Install SimpleReview Chrome Extension →

Prefer a WordPress plugin? Download SimpleReview for WordPress → — installs in 30 seconds, no Chrome required.

Frequently Asked Questions

How do I roll back from WordPress 6.9 to 6.8?
Install the WP Downgrade plugin, set Target Version to 6.8.2, then re-install via Dashboard → Updates. Or, manually replace wp-admin + wp-includes folders over FTP from the 6.8.2 zip — leave wp-content and wp-config.php untouched.
Why did WordPress 6.9 break Slider Revolution?
Older Slider Revolution builds (before 6.6) call PHP's create_function(), which was deprecated in 7.2 and the WP polyfill was finally removed in 6.9. Update Slider Revolution to the latest version (preferred) or replace the call with an anonymous function manually.
WP 6.9 broke Elementor — what's the fastest fix?
Update Elementor to the latest 3.x release; the Elementor team typically ships a compatibility patch within 48 hours of a WordPress major. If wp-admin is unreachable, deactivate Elementor over FTP first (rename its plugin folder), then update.
How can I see exactly which function or plugin broke?
Enable WP_DEBUG and WP_DEBUG_LOG in wp-config.php, reload the page, then read wp-content/debug.log. The exact file, line, and function name appear there — it's the same info hidden behind the generic "critical error" page.
How do I prevent the next major WordPress update from breaking my site?
Use a staging environment first, disable major-core auto-updates (define( 'WP_AUTO_UPDATE_CORE', 'minor' );), and subscribe to the WP Core Field Guide on make.wordpress.org/core/ for breaking-change pre-announcements.

Related WordPress Fixes

Sources