"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.
Key Takeaways
- The fastest recovery is a rollback via WP Downgrade or by replacing
wp-admin+wp-includesover 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_LOGfirst — the actual error file/line is inwp-content/debug.log, hidden behind the generic "critical error" page. - Disable major-core auto-updates with
define( 'WP_AUTO_UPDATE_CORE', 'minor' );inwp-config.phpso 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)
- Install the WP Downgrade plugin (free).
- Go to Settings → WP Downgrade and set WordPress Target Version to
6.8.2. - Click Save Changes.
- 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)
- Download WordPress 6.8.2 from wordpress.org/download/releases/.
- Connect via FTP / SFTP. Delete the
wp-adminandwp-includesfolders from your site root. Do not touchwp-contentorwp-config.php. - Upload the
wp-adminandwp-includesfolders from the 6.8.2 zip. - Visit
yoursite.com/wp-admin/. WordPress will prompt you to run a database update — click it.
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:
- 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).
- If you can't update (license expired), find the
create_function()call inoperations.class.phpand 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:
- A removed Elementor controls API class — check the
elementor/changelog.txtdeprecation list. - A jQuery 3.7 incompatibility (WP 6.9 bumped jQuery). Replace
$(...).live(...)with$(...).on(...).
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
- 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.
- 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' ); - 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.
- 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
| Symptom | Likely cause | Fast fix |
|---|---|---|
| Slider Revolution blank / fatal error | create_function removed; old build | Update Slider Revolution to 6.7+ or patch operations.class.php |
| Elementor canvas blank | Controls API breakage | Update Elementor to latest 3.x |
| jQuery .live() / .size() not a function | jQuery 3.7 dropped legacy | Replace with .on() / .length in custom JS |
| WooCommerce checkout fatal | Renamed filter hook | Update WooCommerce + extensions |
| Widgets section empty | widget_init arity changed | Install Classic Widgets plugin |
| Random "Class not found" everywhere | Stale cache plugin serialized data | Delete wp-content/cache/* via FTP |
| Site loads but admin bar missing | Theme calls deprecated wp_get_current_user pattern | Replace 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:
- Install the Chrome extension and open the broken site (or wp-admin if it loads).
- Click the SimpleReview icon, then click the fatal-error notice or the broken slider.
- 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
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.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_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.define( 'WP_AUTO_UPDATE_CORE', 'minor' );), and subscribe to the WP Core Field Guide on make.wordpress.org/core/ for breaking-change pre-announcements.