What Is New in WordPress 7.0
| Category | Highlights |
|---|---|
| New Features | WP AI Client with provider-agnostic model routing; Client-Side Abilities API; AI Connectors screen (Anthropic, Google, OpenAI built-in); Connectors API; PHP-only block registration; Headings block; Breadcrumbs block; Visual Revisions slider; Font Library dedicated page; Responsive Editing Mode (per-block device visibility); Custom Navigation Overlays; Gallery block lightbox + slideshow; Command Palette shortcut in admin bar; new Modern admin color scheme; View Transitions in wp-admin |
| Improvements | Iframed post editor enforced for Block API v3+ blocks; block-level custom CSS; Interactivity API watch() function; DataViews Activity and Details layouts; Pattern Overrides extended to custom blocks; contentOnly mode broadened to all patterns; text indent and column layout for Paragraph block; dimension presets in theme.json; pseudo-element support on core/button; backbone.js 1.6.1; Requests library 2.0.17; PHPMailer 7.0.2; CodeMirror updated to v5 with Espree replacing Esprima; wp_get_image_alttext() for IPTC alt text; Block Hooks logic moved to REST controller; scripts can now depend on modules |
| Bug Fixes | 300+ Core Trac bug fixes; 486+ Gutenberg bug fixes; PHPMailer Sender address fix; Multisite no longer auto-spams sites when user is marked spam; PHP 8.1 deprecation notice handling in themes; bottom margins removed from all editor components (margin-free styles now default) |
| Breaking Changes | Iframed editor removed when any block uses Block API below v3; HTML5 script theme support deprecated and removed; Administrator and Editor roles removed from new-user default role selector; minimum PHP version raised to 7.4; contentOnly mode now default for previously unrestricted pattern inner blocks |
| Deprecations | HTML5 script theme support (Trac #64442); title attributes removed by default from three author link functions; Esprima replaced by Espree |
What does the new WP AI Client mean for plugin developers in WordPress 7.0?
WordPress 7.0 ships a provider-agnostic AI layer that lets plugins route requests to generative AI models without hard-coding a specific vendor. The WP_AI_Client_Prompt_Builder class and using_model_preference() function give you fine-grained control over model selection, cost optimization, and sequential workflow execution through the Abilities API.
In practice, the integration point is the new Settings > Connectors screen, which manages API keys for Anthropic, Google, and OpenAI out of the box. Your plugin declares which models it prefers, and Core handles routing:
// Declare model preferences in order of priority
using_model_preference( array(
'anthropic/claude-3-5-sonnet',
'openai/gpt-4o',
'google/gemini-1.5-pro',
) );
Watch out for plugins that previously bundled their own AI SDK calls directly. Those will still work, but migrating to the WP AI Client means your users only configure credentials once. The wordpress/wp-ai-client package handles the upgrade path automatically when transitioning to 7.0.
The Client-Side Abilities API (@wordpress/core-abilities) complements this by auto-fetching server-registered abilities via the REST API, giving React components reactive access through useSelect from core/abilities. Abilities and categories can be unregistered server-side via the PHP API, so you retain full control over what surfaces in the editor UI.
How does the enforced iframed editor in WordPress 7.0 affect existing blocks?
WordPress 7.0 enforces the iframed post editor only when every block on the page uses Block API version 3 or higher -- if any block falls below that threshold, the iframe is removed and the classic non-iframed editor is used instead for backward compatibility.
This matters if you maintain blocks that were registered against Block API v1 or v2. Those blocks will silently opt the entire editor out of the iframe, which may affect other plugins that expect the sandboxed environment. The migration path is straightforward: bump your apiVersion to 3 in block.json:
{
"name": "myplugin/my-block",
"apiVersion": 3,
"title": "My Block",
...
}
Most teams running modern block setups will get the iframed editor automatically, which improves style isolation and reduces CSS bleed between admin and editor. The tradeoff is that any block still on v1 or v2 becomes a blocker for every other plugin on that post. Audit your registered blocks before deploying to production sites that mix first-party and third-party plugins.
How does PHP-only block registration work in WordPress 7.0?
WordPress 7.0 lets you register fully functional blocks entirely from PHP, with no JavaScript required for the registration step itself. Declare 'supports' => array( 'autoRegister' => true ) alongside a render callback, and Core exposes the block to the client via a JavaScript global variable automatically.
register_block_type( 'myplugin/server-block', array(
'supports' => array( 'autoRegister' => true ),
'attributes' => array(
'message' => array( 'type' => 'string', 'default' => 'Hello' ),
),
'render_callback' => 'myplugin_render_server_block',
) );
PHP-registered attributes become editable in the editor, and inspector controls are generated from the attribute schema automatically via DataForm integration. This is a significant DX improvement for server-rendered dynamic blocks -- you can skip writing a JavaScript edit component for many common patterns. In practice, it reduces bundle size and simplifies block scaffolding for backend-heavy teams.
This feature also plays well with Block Bindings and Pattern Overrides, which now extend to custom blocks. If your block has complex attributes the HTML API cannot process during static rendering, supply a render_callback() to ensure bound attribute values are output correctly.
What changed with contentOnly mode and patterns in WordPress 7.0?
WordPress 7.0 applies contentOnly mode more broadly -- patterns that previously allowed unrestricted editing of their inner blocks now default to contentOnly mode, which hides non-content blocks from List View and restricts editing to declared content areas.
This is the most impactful breaking pattern change for plugin and theme developers. If your blocks are nested inside a contentOnly pattern and editors report they can no longer edit certain attributes, the fix is to add "role": "content" in block.json for those attributes:
{
"attributes": {
"caption": {
"type": "string",
"role": "content"
}
}
}
To opt out entirely for unsynced patterns, use the new disableContentOnlyForUnsyncedPatterns setting or the block_editor_settings_all PHP filter. Pattern Overrides also now extend to custom blocks via the block_bindings_supported_attributes filter, making it possible to build per-instance customizable patterns with any block in your plugin.
What security and infrastructure changes ship with WordPress 7.0?
WordPress 7.0 raises the minimum supported PHP version to 7.4, drops PHP 7.2 and 7.3 support, and tightens the default user registration flow by removing Administrator and Editor from the new-user default role selector in General Settings.
Site Health will alert administrators if either of those elevated roles had been previously selected as the default, reducing the risk of accidental privilege escalation on registration. Developers who need to restore those options can use the new default_role_dropdown_excluded_roles filter. This matters if your plugin or onboarding flow relies on programmatic new-user creation with elevated roles via the admin UI defaults -- review and adjust accordingly.
Other infrastructure highlights include CodeMirror updated to v5 (Esprima replaced by Espree for full ES6 linting), PHPMailer bumped to 7.0.2, backbone.js upgraded to 1.6.1, and the Requests library updated to 2.0.17. The Script Loader now supports scripts depending on ES modules (Trac #61500), and HTML5 script theme support has been fully deprecated and removed.
Developer FAQ -- WordPress 7.0
Does WordPress 7.0 require changes to blocks registered with Block API v1 or v2?
Not immediately, but any post containing a v1 or v2 block will fall back to the non-iframed editor, potentially affecting other plugins that expect the sandboxed iframe environment, so upgrading block apiVersion to 3 in block.json is strongly recommended.
How do I register a custom AI connector for a provider not included by default in WordPress 7.0?
Use the wp_connectors_init action to override connector metadata in the registry, then implement your provider using the two supported authentication methods, api_key or none, as defined in the Connectors API; the frontend UI can be further customized via client-side JavaScript registration.
Will my existing patterns break because of the expanded contentOnly mode in WordPress 7.0?
Patterns that previously allowed unrestricted inner-block editing now default to contentOnly mode, so any block attribute that editors need to modify inside a pattern must declare "role": "content" in block.json, or you can opt out entirely using the disableContentOnlyForUnsyncedPatterns setting or the block_editor_settings_all PHP filter.
What is the watch() function added to the Interactivity API in WordPress 7.0?
The watch() function in the @wordpress/interactivity package subscribes to any signal accessed inside a callback and automatically re-runs that callback whenever those signals change, enabling reactive DOM updates without manual event wiring; it pairs with the data-wp-watch directive for element lifecycle integration.
Does WordPress 7.0 change the minimum PHP version and what does that mean for hosted environments?
Yes, the minimum PHP version is now 7.4, meaning sites running PHP 7.2 or 7.3 will not be compatible with WordPress 7.0 and must be upgraded on the server before updating WordPress.
How can plugin developers add custom tabs to the Plugins list screen in WordPress 7.0?
A new plugins_list_status_text filter on get_views() lets you register custom statuses that automatically appear as filter tabs on the Plugins screen, with tab labels fully customizable via the same hook.