Where WordPress stands right now (as of 17 August 2026)
WordPress 7.0 was released on 20 May 2026. The 7.0 line stands at 7.0.4 of 12 August 2026 today, and the path to that version belongs in the assessment of the situation. 7.0.1 of 9 July 2026 was a pure maintenance release with 31 bug fixes in core and the block editor. 7.0.2 of 17 July 2026 was a security release with two vulnerabilities — an SQL injection and a mix-up of routes in the batch processing of the REST API — which, chained together, led to remote code execution; because of the severity, WordPress.org activated forced auto-updates for affected installations. 7.0.3 of 6 August 2026 was also a security release, with twelve reported vulnerabilities, among them several stored XSS cases, an SSRF in URL validation and a pre-auth XSS on the login page. 7.0.4 of 12 August 2026 closes an authenticated remote code execution from the author role upwards through a file upload, which only affects installations with Imagick and Ghostscript. WordPress 7.1 is released on 19 August 2026, in parallel with WordCamp US in Phoenix, which runs from 16 to 19 August. That is the frame within which every update plan of this summer has to work: a 7.0 line with three security releases in four weeks, and a major release that is available in two days and whose breaking points are known.
A forced update means the following in concrete terms: the version was distributed through the same mechanism that WordPress has used since version 3.7 to install minor releases automatically — not only offered in the dashboard for someone to click. Two things follow from that. First, the vulnerability is already closed on most installations, without anyone having done anything. Second, something has changed on these installations that nobody had seen on a test system beforehand. Both facts are notable, and the second point is the reason why we never work with the assumed version level during an assessment, but with the measured one. You can check this under Dashboard → Updates, or on the command line with wp core version and wp core check-update. The reverse case is important: where AUTOMATIC_UPDATER_DISABLED is set, where a filter switches the mechanism off, or where the file system is not writable for the web server, even a forced update does not arrive. Such installations may still be on 7.0.0 or 7.0.1 today — exactly the versions of the 7.0 line that were affected by the 7.0.2 vulnerabilities — and they have missed two further security releases since then. The faults are publicly described, the patches are ready.
One point belongs at the beginning, because it prevents expensive planning errors: React 19 is not coming with WordPress 7.1. This assumption is widespread, it stood in roadmaps and talks for a long time, and it is wrong. The upgrade was reverted after incompatibilities appeared between the old and the new React version, together with problems in the way plugins include React. WordPress 7.1 stays on React 18.3. Gutenberg offers an experimental flag that allows React 19 to be tested — as a test option, not as the shipped state. Anyone who converted a plugin or an editor interface to React 19 on the basis of the announcement has spent effort on a state that will not occur. The lesson from this is more general: a roadmap is an intention. Budgets are set against release notes and against a test run, not against a plan.
What actually breaks in WordPress 7.1
The first and most far-reaching breaking point in WordPress 7.1 is the post editor: it is now always iframed — independent of the theme type, of the block API versions of the registered blocks and of those of the blocks in the content. Until now this was a decision per post: in 7.0 the editor was iframed if every inserted block had block API version 3 or higher, and it fell back to the earlier presentation as soon as one single older block was present. That condition has been removed, and with it the assumption that a classic theme or an old block keeps the editor out of the iframe. Code that accesses the global document or window breaks as a result — it searches in a document that no longer holds the editor content. The way forward is through ownerDocument and defaultView on an element in the canvas: you take an element inside the editor, ask for its ownerDocument and work with that document, or with its defaultView, instead of with the global objects. For event listeners on the canvas the core team recommends useRefEffect, so that registration and clean-up stay together. In practice this affects scripts on meta boxes, custom editor extensions, custom field solutions, TinyMCE adjustments and everything that reaches into the editor with document.querySelector — even where it has worked reliably for five years.
The second breaking point sits in the list tables of the backend. The leading th with scope="row" moved from the checkbox column to the title column. That is the first change at this place since 2010, and it is correct in substance, because the row is identified by its title and not by a selection box. For extensions it is a break all the same: everything that selects on the CSS class check-column now finds nothing. This concerns custom columns in post, page, media or user lists, bulk actions, sorting logic and backend CSS that corrects the column widths. The third change is smaller and is noticed immediately in return: the property __next40pxDefaultSize has become ineffective, form elements render at 40 px unconditionally. Even __next40pxDefaultSize={false} no longer leads back to the earlier 36 px — the property should be removed from the code without replacement. Anyone who used it to build a compact layout in sidebar panels, block settings or custom meta boxes will see a different layout afterwards — not broken, but shifted, and in narrow panels that is enough to cause overlaps.
These three points have one thing in common, and it is decisive for acceptance testing: they are in the backend, not in the frontend. Loading the home page after the update shows none of them. They appear when an editor opens a post and saves it, when someone drags an image into the media library, when a custom column is needed in a list table. That is why our acceptance list does not say “page loads”, but sets out a series of backend paths with real content. And that is why 7.1 is not a mandatory date on 19 August: we install security releases within the 7.0 line promptly, and the step to 7.1 follows after a test run. Part of this is the limitation that WordPress itself writes into every security release: only the most recent version is actively supported, and the project supplies fixes for older lines expressly as a courtesy. Staying on 7.0 is therefore a deadline, not a permanent state. Treating both the same means confusing urgency with being up to date.
PHP: the underestimated part of the update
In a good number of cases the reason why an update is not possible is not WordPress, but PHP. The relationship is a clamp: current plugin and theme versions require a PHP version that does not run on the server, and a PHP step in turn makes old plugin code crash. Whoever raises PHP first gets fatal errors from extensions that are not ready yet. Whoever raises the plugins first gets requirement errors or a Composer setup that does not resolve. The figures on this are hard and public: PHP 7.4 has received no security updates since 28 November 2022, PHP 8.1 none since 31 December 2025. PHP 8.2 is supplied with security fixes until 31 December 2026, PHP 8.3 until 31 December 2027, PHP 8.4 until 31 December 2028. Anyone who plans 8.2 as the target version in the summer of 2026 is planning the next migration for the same year. Our target version is therefore 8.3 or 8.4, not the smallest step that happens to work.
This is checked by measurement, not by reading. The “Requires PHP” entry in the plugin or theme header is an indication, not a commitment — it is not maintained everywhere, and it says nothing about whether the code produces warnings on the target version. What is reliable is a run on a staging copy with the target version and a log that records deprecations: once through the backend, once through the relevant frontend paths, once through the cron jobs. What typically shows up there is not exotic. Dynamic properties have been deprecated since PHP 8.2, which reliably affects older plugin classes as long as they do not carry #[\AllowDynamicProperties]. Wrong argument types that PHP 7 let through as a warning throw a TypeError in PHP 8 and end the request. And libraries that a plugin brings with it, instead of obtaining them through Composer, age unnoticed — they appear in no update list. The 7.0.4 example shows why the runtime environment belongs on the list as well: the vulnerability closed there only affects installations on which Imagick works together with Ghostscript. Whether that is the case for you is not stated in the WordPress dashboard, but in the PHP configuration.
When the date comes from the hosting provider, the order is set by someone else, and then a different priority applies: first raise the staging copy to the target version, bring the plugin and theme side up to date there, then switch live — not the other way round. An announced PHP change at the hosting provider is the most frequent reason why an update that was left undone suddenly becomes a fixed date. We also run WordPress installations on our own servers in Germany, on Proxmox PVE clusters; there the PHP change is an agreed date and not a notification. A move is not a condition, however: if SSH access, a clean deployment path and a selectable PHP version are available, we work on your hosting.
Automatic updates: when they help and when they do not
WordPress has updated minor releases automatically since version 3.7, and plugins and themes on request since version 5.5. That is not a stopgap, but the right default setting for one specific case: core minor releases within a line. The scope of change is small, no API breaks inside the line, and after a security fix is published the pressure from attacks is measurably higher than the risk of an untested small step. Whoever switches this mechanism off takes on the duty of noticing security releases such as 7.0.2, 7.0.3 and 7.0.4 themselves and promptly — three of them between mid-July and mid-August. That is a legitimate decision if there is a process behind it. Without a process it is simply an open vulnerability on purpose.
For plugins the answer is not a blanket one, but a list. Automatic updates make sense for extensions without frontend output and without any intervention in templates: backend helpers, administration tools, small additions without their own data structures. Automation does not make sense wherever an update is a deployment in substance — in forms that send mail, in payment and checkout processes with WooCommerce, in everything that overwrites templates, and in everything attached to the editor. The reason is simple: an automatic update checks whether it completes. It does not check whether the page still looks right afterwards and whether the form still sends a mail. The difference between “runs without errors” and “does the right thing” is exactly the part that a machine does not take over.
What is still left undone when automation is enabled is the more expensive part: the step to a new major release such as 7.1, themes with custom code, the PHP version, orphaned plugins without a successor. There is also a conflict that is regularly overlooked in projects that have grown over time: updates from the dashboard and a Git-based deployment exclude each other. What is updated in the dashboard does not end up in the repository and is overwritten by the next deployment — in the best case that is noticed straight away, in the worse case a patched version quietly returns to the old state. That is exactly how an installation loses a forced security update again. We therefore define beforehand which path applies: core minor releases automatically, plugin automation according to a reasoned list, everything with custom code through Git and staging. And we do not set up automation without a working backup chain. That would be a risk that runs on a timer.
The orderly path: inventory, staging, order of work, rollback
At the beginning there is a plugin and theme inventory, and it is more than a list of names. It contains, per extension: installed version, source (wordpress.org, commercial, in-house development, unknown), who the licence is issued to, when it was last updated, whether it is visible in the frontend and whether it is attached to a business process. Four classes follow from this: current, outdated but maintained, orphaned, and replaceable by a few lines in the theme. The hardest question here is not whether an update exists, but whether the extension is still needed. Experience shows that a noticeable part of the list falls away at this step — not because we want to tidy up, but because nobody can name a function that depends on it any more. Every plugin that does not come along is a plugin that will never break again. One tool for this is wp plugin list --update=available; it does not do the assessment.
Then the order of work, and that is not negotiable. First: backup of database and files, with a way back that someone has already taken once. Second: a staging copy that really is a copy — URLs replaced, mail sending disconnected, indexing blocked, payment integrations on sandbox, cron jobs under control. A staging environment that sends real order confirmations to real customers is a second production system. Third: PHP to the target version, with a deprecation log. Fourth: plugins individually or in small groups, with a check in between. Fifth: the core. Sixth: theme and custom code, and this is where the 7.1 points land — iframed editor, check-column, 40 px. Seventh: acceptance testing. Eighth: the live window. The reason for the small steps in step four is diagnosis, not caution: whoever updates two dozen plugins in one go and then has a fault has two dozen suspects and no lead.
A way back means the following for us: a database dump and a file state taken immediately before the window, and a rehearsed path back. An uncomfortable limitation belongs openly to this. Database migrations of individual plugins are not always reversible. The way back is then a restore to the state before the window, not a downgrade — and everything that happened between dump and restore, in orders, comments, form submissions or editorial changes, is gone with it. That is exactly why the window lies outside business hours and is short, and exactly why an acceptance list is drawn up beforehand: create and save a post, media upload, form submission with a real mail, search, feeds, object cache, backend lists with custom columns, permissions of the editorial roles. And if the inventory shows that a central extension has no successor, we say so before the quotation: the update is then no longer an update, but a small development project. That makes the figure larger, and it is still the more honest figure. If you do not want to take over the maintenance yourself afterwards, you will find the ongoing support including the service level tiers on the page about WordPress maintenance; this page ends with the go-live.