Custom CSS for Individual Block Instances in WordPress 7.0

WordPress 7.0 introduces the ability to add custom CSSCSS Cascading Style Sheets. directly to individual blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. instances from within the post and site editors. This closes a long-standing gap in the block styling system: while Global Styles has supported block-type-level custom CSS since WordPress 6.2, there was no built-in way to target a single specific block on a specific page without a multi-step workaround.

GitHubGitHub GitHub is a website that offers online implementation of git repositories that can easily be shared, copied and modified by other developers. Public repositories are free to host, private repositories require a paid subscription. GitHub introduced the concept of the โ€˜pull requestโ€™ where code changes done in branches by contributors can be reviewed and discussed before being merged by the repository owner. https://github.com/ issue: #56127 | PR: #73959

The Problem

Previously, applying one-off CSS to a specific block instance required a workaround: add a custom class name to the block, then write a matching rule in the Site Editorโ€™s global Custom CSS field. This two-step process was not obvious to most users, and was entirely unavailable to content editors who lack access to the Site Editor.

Plugins emerged to fill this gap, confirming genuine demand for the feature.

What Changed

A new customCSS block support is registered. It provides a Custom CSS input inside the Advanced panel of the block inspector โ€” the same panel that already contains the โ€œAdditional CSS Class(es)โ€ field.

The panel behaves the same way as the block-type custom CSS field in Global Styles:

  • Only CSS declarations are needed โ€” no selector is required.
  • Nested selectors can be written using & (e.g., & a { color: red; } targets anchor tags inside the block).
  • HTMLHTML HyperText Markup Language. The semantic scripting language primarily used for outputting content in web browsers. markup in the CSS field is rejected.
  • The field is only visible to users with the edit_css capabilitycapability Aย capabilityย is permission to perform one or more types of task. Checking if a user has a capability is performed by the current_user_can function. Each user of a WordPress site might have some permissions but not others, depending on theirย role. For example, users who have the Author role usually have permission to edit their own posts (the โ€œedit_postsโ€ capability), but not permission to edit other usersโ€™ posts (the โ€œedit_others_postsโ€ capability)..

How It Works

Storage

Custom CSS is stored in the blockโ€™s existing style attribute, under the css key โ€” the same attribute that stores other block-level style overrides:

<!-- wp:heading {"level":6,"style":{"css":"color: blue;\n"}} -->
<h6 class="wp-block-heading has-custom-css">Heading</h6>
<!-- /wp:heading -->

Frontend Output

At render time, a unique class is generated for the block instance using a hash of the blockโ€™s content and attributes. The class is applied to the blockโ€™s outermost HTML element alongside a has-custom-css marker class:

<h6 class="wp-block-heading has-custom-css wp-custom-css-8841bf3c3cc97689d62771455cc88782">
    Heading
</h6>

<style id="wp-block-custom-css">
    :root :where(.wp-custom-css-8841bf3c3cc97689d62771455cc88782) {
        color: blue;
    }
</style>

The generated stylesheet is registered with a dependency on global-styles, ensuring block instance CSS loads after โ€” and can therefore override โ€” both WordPress defaults and Global Styles block-type CSS.

Editor Preview

The custom CSS is also applied live in the editor using a scoped style override, so changes are reflected immediately without saving.

Opt-Out

The customCSS support is enabled by default for all blocks. Block authors who need to opt out โ€” for example, blocks that render raw content or have no meaningful outer element โ€” can disable it in block.json:

{
    "supports": {
        "customCSS": false
    }
}

The following coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. blocks opt out by default: core/freeform, core/html, core/missing, core/more, core/nextpage, core/shortcode, and core/block (the Reusable Block wrapper).

Capability Check

The Custom CSS panel is gated by the edit_css capability. Users without it will not see the field in the block inspector. This is the same capability used to control access to the Custom CSS field in the CustomizerCustomizer Tool built into WordPress core that hooks into most modern themes. You can use it to preview and modify many of your siteโ€™s appearance settings. and in Global Styles.

For PluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party. and Theme Developers

No action is required for most blocks and themes. The support is enabled automatically.

If you maintain a block that should not expose a custom CSS input โ€” because it wraps raw or opaque content, or because adding a class to its root element would break its rendering โ€” add "customCSS": false to your blockโ€™s supports in block.json.

If you render blocks server-side using render_callback or render in block.json, the class will be injected into the first HTML element in the rendered output via WP_HTML_Tag_Processor. Ensure your block renders a standard HTML element as its outermost tagtag A directory in Subversion. WordPress uses tags to store a single snapshot of a version (3.6, 3.6.1, etc.), the common convention of tags in version control systems. (Not to be confused with post tags.).

Further Reading

Props to @mtias and @glendaviesnz for the implementation, @aaronrobertshaw and @scruffian for technical review and proofreading.

#7-0, #dev-notes, #dev-notes-7-0

PHP-only block registration

Developers can now create simple blocks using only PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 7.4 or higher. This is meant for blocks that only need server-side rendering and arenโ€™t meant to be highly interactive. It isnโ€™t meant to replace the existing client-side paradigm, nor is it meant to ever be as featureful! However, this APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways. could help developers avoid extra complexity and could thus foster blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. adoption, especially in classic themes or server-driven workflows.

To use it, call register_block_type with the new autoRegister flag. Note that a render_callback function must also be provided:

function gutenberg_register_php_only_blocks() {
    register_block_type(
        'my-plugin/example',
        array(
            'title'           => __( 'My Example Block', 'myplugin' ),
            'attributes'      => array(
                'title'   => array(
                    'label'   => __( 'Title', 'myplugin' ),
                    'type'    => 'string',
                    'default' => 'Hello World',
                ),
                'count'   => array(
                    'label'   => __( 'Count', 'myplugin' ),
                    'type'    => 'integer',
                    'default' => 5,
                ),
                'enabled' => array(
                    'label'   => __( 'Enabled?', 'myplugin' ),
                    'type'    => 'boolean',
                    'default' => true,
                ),
                'size'    => array(
                    'label'   => __( 'Size', 'myplugin' ),
                    'type'    => 'string',
                    'enum'    => array( 'small', 'medium', 'large' ),
                    'default' => 'medium',
                ),
            ),
            'render_callback' => function ( $attributes ) {
                return sprintf(
                    __( '<p>%s: %d items (%s)</p>', 'myplugin' ),
                    esc_html( $attributes['title'] ),
                    $attributes['count'],
                    $attributes['size']
                );
            },
            'supports'        => array(
                'autoRegister' => true,
            ),
        )
    );
}

add_action( 'init', 'gutenberg_register_php_only_blocks' );

These blocks will automatically appear in the editor without requiring any JavaScriptJavaScript JavaScript or JS is an object-oriented computer programming language commonly used to create interactive effects within web browsers. WordPress makes extensive use of JS for a better user experience. While PHP is executed on the server, JS executes within a userโ€™s browser. https://www.javascript.com registration, and, wherever possible, the editor will automatically generate controls in the Inspector Controls sidebarSidebar A sidebar in WordPress is referred to a widget-ready area used by WordPress themes to display information that is not a part of the main content. It is not always a vertical column on the side. It can be a horizontal rectangle below or above the content area, footer, header, or any where in the theme. to allow users to edit block attributes:

Note that controls will not be generated for attributes with the local role or for attributes whose types are not supported.

See #64639 for more details.

Props to @priethor for the implementation.
Props to @wildworks for reviewing this dev notedev note Each important change in WordPress Core is documented in a developers note, (usually called dev note). Good dev notes generally include a description of the change, the decision that led to this change, and a description of how developers are supposed to work with that change. Dev notes are published on Make/Core blog during the beta phase of WordPress release cycle. Publishing dev notes is particularly important when plugin/theme authors and WordPress developers need to be aware of those changes.In general, all dev notes are compiled into a Field Guide at the beginning of the release candidate phase..

#dev-notes, #7-0

#dev-notes-7-0

Iframed Editor Changes in WordPress 7.0

Previous posts on this topic:

Current Situation

  • All editors except the post editor (site editor, template editor, all blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience., template and device previews) are currently already iframed unconditionally.
  • The post editor is currently only iframed in coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. if all registered blocks (across all plugins) use block APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways. version 3 (or higher).
  • When GutenbergGutenberg The Gutenberg project is the new Editor Interface for WordPress. The editor improves the process and experience of creating new content, making writing rich content much simpler. It uses โ€˜blocksโ€™ to add richness rather than shortcodes, custom HTML etc. https://wordpress.org/gutenberg/ is active with a block-based theme, the post editor is forced to be iframed regardless of block API versions used.

Whatโ€™s Changing in WordPress 7.0 (#75187)

Instead of checking the registered blocks across all plugins, only the block API versions of blocks that are actually inserted in the post will now be checked. If all blocks inserted are version 3 or higher, the post editor will be iframed. If not, the iframeiframe iFrame is an acronym for an inline frame. An iFrame is used inside a webpage to load another HTML document and render it. This HTML document may also contain JavaScript and/or CSS which is loaded at the time when iframe tag is parsed by the userโ€™s browser. will be removed to ensure the lower-versioned blocks are guaranteed to work. Block authors are encouraged to upgrade their blocks to version 3.

Enforcement in the Gutenberg PluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party. (#75475)

While the iframe is already enforced for block-based themes, it will now also enforced for classic themes from Gutenberg plugin version 22.6. (Note that the post editor may already have been iframed with classic themes if all registered blocks met the required block API version.) Most blocks that are version 2 and lower are expected to work fine, and the enforcement in the plugin is to gather feedback on specific cases where blocks might break before attempting to roll out iframe enforcement in future versions of WordPress. Please comment below if you are affected and the team will help with a solution.

Please note that the iframe is NOT enforced in WordPress 7.0! The timeline to enforce it has been revised in favor of a more gradual rollout to allow more time and feedback.

Thank you to @mamaduka, @wildworks and @mcsf for reviewing.

#7-0, #dev-notes, #dev-notes-7-0

WordPress 7.0 Field Guide

This guide outlines major developer features and breaking changes in 7.0 and is published in the Release Candidaterelease candidate One of the final stages in the version release cycle, this version signals the potential to be a final release to the public. Also see alpha (beta). phase to help inform WordPress extending developers, CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. developers, and others.

There are more than 419 Core Trac tickets included in WordPress 7.0, over 76 of which are enhancements and feature requests, and more than 300 bug fixes. This release includes 40+ tickets focused on the Editor, and 90+ tickets focused on wp-admin.

Additionally, this release includes 411 enhancements and more than 486 bug fixes for the Editor, Dashboard, and AI integration.

Below is a breakdown of the most important developer-related changes included in WordPress 7.0.

AI building blocks of the future

Step into a new era with WordPress 7.0, shipped with AI integration and abilities. Provider-agnostic architecture gives you full control over units and capabilitiescapability Aย capabilityย is permission to perform one or more types of task. Checking if a user has a capability is performed by the current_user_can function. Each user of a WordPress site might have some permissions but not others, depending on theirย role. For example, users who have the Author role usually have permission to edit their own posts (the โ€œedit_postsโ€ capability), but not permission to edit other usersโ€™ posts (the โ€œedit_others_postsโ€ capability). while tapping into the endless opportunities AI can bring to life. These critical building blocks are just the beginning, paving the way for agentic collaborators and so much more.

WP AI Client

WordPress 7.0 unlocks AI capabilities right in your website. The new WP AI client adds a central interface that lets plugins communicate with generative AI models while remaining provider-agnostic. WordPress Core handles request routing for you. Managed in the Settings > Connectors screen with APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways. keys funneled through the Connectors API, you can start with some preset models and add your favorites.

As a bonus, the Abilities API is integrated directly into the WP AI Client, delivering new and expansive AI abilities that can be built into workflows that run abilities fluidly, one after another.

PluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party. developers can use the new using_model_preference() function to indicate which models to use in order of preference, then add feature detection to match capabilities against available models โ€“ lowering cost and speeding up processing time. The AI Client includes a series of advanced configuration controls, and a WP_AI_Client_Prompt_Builder class for calling methods. For easy upgrades, the wordpress/wp-ai-client package handles transitioning to 7.0 automatically.

Client-Side Abilities API

WordPress 7.0 expands on the Abilities API by introducing a JavaScriptJavaScript JavaScript or JS is an object-oriented computer programming language commonly used to create interactive effects within web browsers. WordPress makes extensive use of JS for a better user experience. While PHP is executed on the server, JS executes within a userโ€™s browser. https://www.javascript.com counterpart: the Client-Side Abilities package with new and hybrid abilities, an intuitive UIUI User interface, a command palette, and filterFilter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output. and query functionality.

Plugin developers can enqueue @wordpress/core-abilities to automatically fetch and register server-side abilities via the REST APIREST API The REST API is an acronym for the RESTful Application Program Interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. It is how the front end of an application (think โ€œphone appโ€ or โ€œwebsiteโ€) can communicate with the data store (think โ€œdatabaseโ€ or โ€œfile systemโ€) https://developer.wordpress.org/rest-api/, or enqueue only @wordpress/abilities to work with the pluginโ€™s client-side abilities. Registered abilities are organized in customizable categories, and abilities and categories can be unregistered via the PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 7.4 or higher API. ย MetaMeta Meta is a term that refers to the inside workings of a group. For us, this is the team that works on internal WordPress sites like WordCamp Central and Make WordPress. data annotation is supported, and core/abilities makes useSelect available for reactive queries in ReactReact React is a JavaScript library that makes it easy to reason about, construct, and maintain stateless and stateful user interfaces. https://reactjs.org components.

AI Connectors Screen

Manage all of your AI provider connections in one place on the new Connectors screen. Found under Settings > Connectors in the dashboard, the screen gives you everything you need to manage your connections. Registered connectors are displayed automatically on the page, and so is detailed registry meta data in a card format. The Connectors screen includes three default providers: Anthropic, Google, and OpenAI, while also allowing users to configure their own connections.

WP 7.0 Connectors Screen

Connectors API

The Connectors API is the backbone of the Connectors screen; an extensibility API that facilitates and supports the inclusion of agents.

The API supports two authentication methods (api_key and none) based on provider metadata, and is designed to facilitate additional connector types in future releases. The Connectors API uses the WP AI Clientโ€™s default registry to automatically discover providers, and corresponding metadata to generate connectors, while connectors authenticated via other methods are stored in the PHP registry. You can use the wp_connectors_init action to override connectors metadata, which will be the key for registering new connector types in future releases. The API includes three public functions for querying the registry, and the frontend UI can be customized using client-side JavaScript registration.

Modernized Dashboard

WordPress 7.0 delivers an upgraded adminadmin (and super admin) experience, with a sleek, new color scheme named โ€œModernโ€, numerous enhancements throughout the dashboard, and seamless visual transitions as you navigate from screen to screen. A new Command Palette shortcut in the upper admin bar lets you access tools from anywhere in the dashboard, while a new dedicated dashboard page for font management centralizes and simplifies managing fonts. The enhanced iframed post editor stabilizes the screen, while editors leave comments on blocks, receive notifications for notes and even visually compare two revision versions.

New admin color scheme and styles

WordPress administration has been reinvigorated with a new, chic color scheme throughout the dashboard. The new Modern admin theme is live across admin headers, the CustomizerCustomizer Tool built into WordPress core that hooks into most modern themes. You can use it to preview and modify many of your siteโ€™s appearance settings., the color scheme picker, script loader, various user functions, and even the multisitemultisite Used to describe a WordPress installation with a network of multiple blogs, grouped by sites. This installation type has shared users tables, and creates separate database tables for each blog (wp_posts becomes wp_0_posts). See also network, blog, site user signup has been reskinned. The Modern theme is clean and easy on the eyes, boasting a refreshed color palette, higher contrast, and upgraded typography, uplifting and elevating the admin experience.

View Transitions in WP Admin

Navigating the dashboard is a smooth ride in 7.0. User views slide from one screen to the next as you move across wp-admin. Cross-document view transitions use distinct transition names for admin menu items in order to facilitate this simple visual slide effect, firing when the active submenu changes between screens. With consideration for all users, View Transitions are only activated if a preference is not set for reduced motion on the OS level.

Command Palette shortcut

Access your editing toolset from anywhere in the dashboard with a single click of the new Command Palette shortcut. WordPress 7.0 includes a โŒ˜K or Ctrl+K icon for logged-in users in the upper admin bar, which unfurls the command palette on click. The new shortcut speedruns editing and gives full control from anywhere in the dash: while building, designing or simply browsing notes.

Font Library

The Font Library has expanded in 7.0 with the introduction of a dedicated font management page. Now you and your team can manage, upload and install fonts from one place in blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience., hybrid and classic themes.

Visual RevisionsRevisions The WordPress revisions system stores a record of each saved draft or published update. The revision system allows you to see what changes were made in each revision by dragging a slider (or using the Next/Previous buttons). The display indicates what has changed in each revision.

In WordPress 7.0, Visual Revisions make editing easier and more intuitive, while adding insight into post or page edit history. Users can now visually compare two revision versions directly in the Editor using a slider bar to visually switch between revisions. The document inspector shows a summary of changes, while color indicators and sizes of changes can be seen for each location, jumping to that location on the page when clicked.

Iframed Editor

An improved, iframed editor in 7.0 offers more stability to the post editor experience. An iframed post editor is now enforced when all Block API blocks inserted into the post are using version 3 of the API or higher. If not, the iframeiframe iFrame is an acronym for an inline frame. An iFrame is used inside a webpage to load another HTML document and render it. This HTML document may also contain JavaScript and/or CSS which is loaded at the time when iframe tag is parsed by the userโ€™s browser. is removed, upholding backwards compatibility for lower-versioned blocks.

Creative Customization

7.0 inspires creativity with enhanced design tools and new editing capabilities. Users can now customize navigation overlays on mobile, granular control of the responsiveness for individual blocks, and edit at the pattern level in different modes.

Custom Navigation Overlays on mobile

Hamburger menu overlays can now be customized and built from blocks and patterns in the Site Editor, with a dedicated Navigation Overlay Close block for placing and styling a close button anywhere within the overlay, giving users and theme authors flexibility to define mobile navigation experiences. In-place overlay selection and previews create a seamless editing experience, while users can review and assign overlays, and themes can offer default templates for quick setup.

Responsive Editing Mode

WordPress 7.0 introduces customizable block visibility based on device type, allowing editors to hide or reveal blocks by device, without affecting other viewports. Controls to launch a block visibility options modal are available in the block toolbar, block inspector sidebarSidebar A sidebar in WordPress is referred to a widget-ready area used by WordPress themes to display information that is not a part of the main content. It is not always a vertical column on the side. It can be a horizontal rectangle below or above the content area, footer, header, or any where in the theme., and command palette. Icons are displayed in List View next to blocks that have active visibility rules, indicating what viewports they are being hidden on.

Offering even more responsiveness enhancements, 7.0 introduces the ability to change styles for different breakpoints, customize breakpoint sizes and more.

Pattern Editing and contentOnly Interactivity

7.0 introduces Pattern Overrides for custom blocks, Pattern-level editing modes for contextual and symbol patterns, a parent-child tree view for buttons and list blocks, and the ability to opt out of contentOnly mode.

contentOnly mode will now be default for patterns that previously relied on unrestricted editing of their inner blocks, while a new disableContentOnlyForUnsyncedPatterns setting or block_editor_settings_all PHP filter allows contentOnly mode to be opted out of for unsynced patterns.

In 7.0 contentOnly mode is applied more broadly, so if a block is nested in a contentOnly pattern, plugin developers will want to ensure attributes representing the blockโ€™s content have "role": "content" set in block.json to retain their ability to be edited and prevent them from being hidden in list view.

Block developers can now add a "listView": true block supports declaration to add a List View tab to the block inspector with a dedicated view for the block that allows editors to update and customize the block more easily.

Block attributes that support Block Bindings now also support Pattern Overrides for custom blocks. Pattern Overrides now apply to any block, including custom blocks, and can be opted-in through block_bindings_supported_attributes filter(s). Attribute values appear in the rendered blocksโ€™ markup for dynamic and static blocks, and if static blocks have more complex attributes than the HTMLHTML HyperText Markup Language. The semantic scripting language primarily used for outputting content in web browsers. API can process, a render_callback() function can be used to ensure bound attribute values render.

Design Agility

Designing in WordPress 7.0 has become more flexible with the introduction of new blocks, new block supports and new design tools. A new Heading block, Icons block, and Breadcrumbs block are shipped with 7.0, with added lightbox support for the Gallery block, and dynamic URLURL A specific web address of a website or web page on the Internet, such as a websiteโ€™s URL www.wordpress.org support in the Navigation Link block. 7.0 includes text line indent support, text column support, dimensions width and height support, dimension presets, tools and controls, and aspect ratios for wide and full images.

Custom CSSCSS Cascading Style Sheets. on the block level

7.0 introduces the ability for custom CSS to be applied on-page to individual blocks. This allows granular control over every detail of your content, with quick and intuitive access to style controls.

Headings Block

A new Heading Block includes variations of all heading levels, easy toggling in the sidebar inspector and quick transforms, and display in the search and slash inserter.

The new Breadcrumbs Block in 7.0 automatically reflects the siteโ€™s navigational hierarchy with the ability for global application in site parts like the theme headerHeader The header of your site is typically the first thing people will experience. The masthead or header art located across the top of your page is part of the look and feel of your website. It can influence a visitorโ€™s opinion about your content and you/ your organizationโ€™s brand. It may also look different on different screen sizes.. New filters allow developers to add, remove, and modify breadcrumb trails, and specify which taxonomyTaxonomy A taxonomy is a way to group things together. In WordPress, some common taxonomies are category, link, tag, or post format. https://codex.wordpress.org/Taxonomies#Default_Taxonomies. and terms appear in the Breadcrumbs trails.

Editing the navigation block is now more simple with improved insertion, Interactivity for pattern editing and ContentOnly, and improved โ€œboundโ€ page items presentation.

Video embed cover blockย 

Videos can now be embedded as section backgrounds in the Cover block.ย 

The Gallery block now has lightbox support with an added slideshow option. Just create and insert a Gallery, click the link icon and then hit โ€˜enlarge on clickโ€™.

.0 Gallery lightbox slideshow image

Added <p> Block Supports

Text in the Paragraph block can now be arranged in a columns layout, and opt-in textIndent block support for typography has been introduced.

More details on new and improved blocks are available here:

Dimensions Support Enhancements

7.0 introduces height and width block support, typography text indent support in paragraphs, presets support, and pseudo elements support on the core/button block for ( ':hoverโ€˜, ':focusโ€˜, ':focus-visible', ':active' ) at the theme.json level. Support for preset dimensions values in theme.json have been added for block supports such as width, height and min-height, allowing the blockโ€™s variations to control the same pseudo elements, while a defined set of preset values for dimensions block supports can be leveraged to reduce the need to know and manually set the same value across multiple blocks.

Developerโ€™s toolbox

7.0 delivers an expansive developer toolbox including new tools for building, enhanced supportive structures, and expanded API abilities. Developers can now create a PHP-only representation of blocks on the server level, customize plugin list filters, and explore the foundational layout for a more extensibleExtensible This is the ability to add additional functionality to the code. Plugins extend the WordPress core software. Site Editor.

PHP Only Block Registration

WordPress 7.0 allows blocks and patterns to be created directly on the server with PHP, and registered with the Block API. The PHP-only representation of blocks and patterns includes pattern creation and syntax that streamlines block creation and bindings, registering blocks automatically When a block declares 'supports' => array( 'autoRegister' => true ) along with a render callback, exposing it to the client-side via a JavaScript global variable. PHP-registered block attributes can be edited in the editor and inspector controls can be generated from attributes, with automatic DataForm inspector controls added for PHP auto-registered blocks.

Interactivity API

Introducing a new watch() function to the @wordpress/interactivity package that subscribes to changes in any signal accessed inside a callback, re-running the callback whenever those signals change. The APIโ€™s data-wp-watch can be added to a DOM elementโ€™s lifecycle and react to state changes. The state.url value is now populated server-side during directive processing, remaining unchanged until the first client-side navigation occurs.

DataViews and DataFormsย 

Experience a new Activity layout, new Details layout, Improved modal appearance, and the ability to register 3rd party types in the Field API.

Block bindings API iterationsย 

Introducing the Block bindings and patterns overrides feature, with the ability to filter available attribute sources by format, aligning with the Field API.

New plugin list filterย 

A new plugins_list_status_text filter in get_views() has been added to allow custom filtering. Custom statuses added with plugins_list now appear as tabs to filter the related plugins. The tab label can be customized using the new plugins_list_status_text hook.

Site Editor wordpress/build and routing

In 7.0 the foundation has been laid for an extensible site editor and routing, route validation, a new @wordpress/boot package that allows plugins to build custom site-editor pages, and a refactored @wordpress/scripts that builds from directories and reduces Webpack dependence.

Bonus dev goodies

WordPress 7.0 introduces updates that span every area of Core. These changes support ongoing initiatives to create a flexible foundation for developers while boosting usability and opportunity.

Block HooksHooks In WordPress theme and development, hooks are functions that can be applied to an action or a Filter in WordPress. Actions are functions performed when a certain event occurs in WordPress. Filters allow you to modify certain functions. Arguments used to hook both filters and actions look the same. for content-like Custom Post Types.

The Block Hooks logic has been moved from individual post type filters to the REST controller.

More secure user registration

Administrator and Editor roles have been removed from the new user default selector under General in the admin screen. Site Health now alerts if one of those roles was selected before updating, while a new default_role_dropdown_excluded_roles filter allows developers to change default excluded roles.

CodeMirror Update to v5

CodeMirror has been updated to the latest v5 version, along with CSSLint, HTMLHint, and JSONLint, while Esprima has been replaced with Espree for ES6 support and JavaScript linting.

External Libraries Updates

PHP Updates

  • WordPress Coreโ€™s minimum PHP version is now 7.4ย 
  • PHPMailer has been updated to version 7.0.2, which includes a Sender address bugbug A bug is an error or unexpected result. Performance improvements, code optimization, and are considered enhancements, not defects. After feature freeze, only bugs are dealt with, with regressions (adverse changes from the previous version) being the highest priority. fix.

AccessibilityAccessibility Accessibility (commonly shortened to a11y) refers to the design of products, devices, services, or environments for people with disabilities. The concept of accessible design ensures both โ€œdirect accessโ€ (i.e. unassisted) and โ€œindirect accessโ€ meaning compatibility with a personโ€™s assistive technology (for example, computer screen readers). (https://en.wikipedia.org/wiki/Accessibility)

WordPress 7.0 includes numerous improvements and additions that make content more accessible for everyone. The login password reset now pre-populates with a username to comply with WCAGWCAG WCAG is an acronym for Web Content Accessibility Guidelines. These guidelines are helping make sure the internet is accessible to all people no matter how they would need to access the internet (screen-reader, keyboard only, etc) https://www.w3.org/TR/WCAG21/. 2.2, and a new wp_get_image_alttext() function imports Image Alt text metadata from image IPTC metadata. The word-break property has been added to .screen-reader-text to ensure screen readers wonโ€™t read text as individual letters in hidden text, and view transitions are only activated when reduced motion is not set.

Title attributes can now be removed from two functions using a new $use_title_attr parameter, and are removed from three author link functions by default.

But wait, thereโ€™s more!

7.0 offers so much more! More than 300 Core bugs, 486 GutenbergGutenberg The Gutenberg project is the new Editor Interface for WordPress. The editor improves the process and experience of creating new content, making writing rich content much simpler. It uses โ€˜blocksโ€™ to add richness rather than shortcodes, custom HTML etc. https://wordpress.org/gutenberg/ bugs, 77 enhancements and feature requests, and 35 blessed tasks have been marked as fixed in WordPress 7.0.

Below are a few to highlight:

  • Site Health: OPCache added to Site Health > Info > Server (Trac #63697)
  • Editor: Name/description metadata added to patterns when saved (Trac #64123 )
  • Script Loader: Allow scripts to depend on modules: (Trac #61500)
  • Script Loader: HTML5 script theme support deprecated and removed (Trac #64442)ย 
  • General: Allow hooking into wp_trigger_error() when WP_DEBUG is not truthy. (Trac #60886)ย 
  • Multisite: Networks and Sites no longer automatically mark website as spam when an account is marked as spam (Trac #61146)
  • Themes: PHP 8.1 deprecation notice handling (Trac #64864)
  • Editor: Bottom margins removed from all components, and margin-free styles are now default. (GB #39358)

Thank you to everyone who contributed to this version of WordPress, whether through code, testing, or something else โ€“ your contributions matter and help Make WordPress.

Props to @westonruter, @sabernhardt, @marybaum, @jeffpaul, @jorbin, @desrosj, @coffee2code, @audrasjb, @wildworks and @ankit-k-gupta for collaboration and review.

Edit 5/17/26: Add DataViews dev notedev note Each important change in WordPress Core is documented in a developers note, (usually called dev note). Good dev notes generally include a description of the change, the decision that led to this change, and a description of how developers are supposed to work with that change. Dev notes are published on Make/Core blog during the beta phase of WordPress release cycle. Publishing dev notes is particularly important when plugin/theme authors and WordPress developers need to be aware of those changes.In general, all dev notes are compiled into a Field Guide at the beginning of the release candidate phase., update Connectors screen image, add textIndent block support dev note, remove mention of playlist block, add mention of margin-free styles default.

Edit 5/18/26 Remove Notes section, insert new Gallery block slideshow image

#7-0, #field-guide

Proposal: Auto-generate Block Editor Handbook docs from block.json

Updated: May 18, 2026 with video recording and transcript of the Hallway Hangout (bph)

The Block Editor Handbook is one of the primary resources for developers building with GutenbergGutenberg The Gutenberg project is the new Editor Interface for WordPress. The editor improves the process and experience of creating new content, making writing rich content much simpler. It uses โ€˜blocksโ€™ to add richness rather than shortcodes, custom HTML etc. https://wordpress.org/gutenberg/ and WordPress coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress.. Keeping it accurate and up-to-date as the editor evolves is an ongoing challenge.

Recently, a detailed Core Blocks reference section was proposed for the Handbook โ€” providing structured APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways. documentation for every blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. shipped in Gutenberg. The approach was to auto-generate these pages directly from each blockโ€™s block.json file, the single source of truth for a blockโ€™s attributes, supports, and metadata.

The initial pull request (#77350) was merged but subsequently reverted (#77590) due to insufficient community discussion before landing. That feedback was valid, and this post is the next step: bringing the proposal to the wider community before moving forward.

The updated proposal is in PR #77612: Docs โ€” Auto-generate per-block API reference pages from block.json.

The problem

Understanding how a core block works today means reading its source code directly. A block is defined by attributes, supports, context, selectors, and parent/child relationships โ€” but none of these are documented in context for any individual block. To learn about a specific block, a developer has to read its block.jsonJSON JSON, or JavaScript Object Notation, is a minimal, readable format for structuring data. It is used primarily to transmit data between a server and web application, as an alternative to XML. file โ€” which shows the values but does not explain what they mean โ€” and then separately hunt through the general documentation to understand each property. Per-block documentation with contextual links to each concept would close that gap entirely.

The same problem affects LLMs: without documented context for each property, they have to parse source files to infer semantics, spending more tokens and filling context unnecessarily. This is important for AI-assisted creation of templates, template parts, patterns, and other block editor content.

Most of this detail already exists in the codebase. If it can be surfaced automatically, thereโ€™s no good reason to leave it buried.

The proposed solution

The proposal introduces an automated pipeline that generates per-block API reference pages by reading each blockโ€™s block.json at build time. This means:

  • Every block shipped in Gutenberg automatically gets a documentation page reflecting its current attributes, supports, selectors, and other metadata.
  • Keeping docs in sync becomes a byproduct of keeping block.json accurate โ€” which developers already do.
  • The Block Editor Handbook gains a canonical, always-current API reference for all core blocks.

The generated docs would live at paths like: developer.wordpress.org/block-editor/reference-guides/core-blocks/[block-category]/[block-name] and would look like this:

README.md per block in the repository

A key part of the proposal is that documentation is generated into a README.md file inside each blockโ€™s source directory โ€” for example, packages/block-library/src/paragraph/README.md.

This follows the same convention already established for component documentation, where gen-components-docs generates a README.md inside each componentโ€™s directory at packages/components/src/{component}/README.md.

Having documentation live next to the code has a specific benefit: it allows hand-written narrative and auto-generated API reference to coexist in the same file. Generated content is wrapped in token delimiters (<!-- START TOKEN / END TOKEN -->), so any hand-written prose above the token is preserved across regenerations. The Navigation block README is a working example of this.

This mirrors the approach already used by the package API docs generator (update-api-docs.js) to document each package API inside each package README.md.

What this means for contributors

For block developers

  • No separate docs PR is needed when you add or change a block.json attribute โ€” the reference page updates automatically.
  • The README.md lives next to the blockโ€™s source, making the API surface discoverable when browsing the codebase.
  • The expectation for what constitutes โ€œwell-documentedโ€ becomes clearer and more tractable.

For documentation contributors

  • A reliable, auto-generated foundation means energy can be focused on narrative guides and tutorials rather than maintaining API reference tables.
  • Custom hand-written explanations in a blockโ€™s README.md are preserved across regenerations, so narrative docs and API reference can grow independently.
  • Having a public view of block documentation may encourage contributors to get involved by creating issues or PRs if they find errors.

For users of the Handbook

  • Reference pages stay current with each Gutenberg release rather than drifting behind.

Open questions โ€” we want your input

  1. README.md in the repo vs. the docs site: Should per-block README.md files live in the Gutenberg repository, or be generated solely at the docs site level (as PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 7.4 or higher references currently are)?
  2. Process fit: Does auto-generating docs from block.json fit naturally into the existing contribution workflow? Where might it break down?
  3. block.json as source of truth: Are there things about a block that canโ€™t or shouldnโ€™t be derived from block.json? How should those gaps be handled?
  4. Anything weโ€™re missing: What challenges or risks hasnโ€™t this proposal addressed?

Get involved

Review the PR: #77612 โ€” Docs: Auto-generate per-block API reference pages from block.json

Share feedback:

  • Comment on this post
  • Comment directly in the pull request discussion

Join the conversation live: Weโ€™ll be hosting a Hallway Hangout with Docs and Core team members approximately two weeks after this post. Details will be shared in the comments โ€” watch this post if youโ€™d like to join. The Meeting link will be shared in the #core-editor channel the day of the Hallway Hangout.

Video transcript (click to expand)

Birgit Pauli-Haack:
All right, so welcome everybody and those who come in today. And for those are watching the recording, this is a hallway hangout for the proposal Juan Ma posted on the make blogblog (versus network, site) on Auto Generate Block Editor handbook documentation from the block JSON. And the proposal is very detailed on things. What weโ€™re going to do today is that Juan Ma is going to talk us through a little bit about the goals and about the reasons how itโ€™s implemented. And then he also has his local development set up so he can demo things, how itโ€™s going to be, how itโ€™s going to be displayed, published on the developer.WordPress.orgWordPress.org The community site where WordPress code is created and shared by the users. This is where you can download the source code for WordPress core, plugins and themes as well as the central location for community conversations and organization. https://wordpress.org/ block editor handbook and also how itโ€™s going to show up on the GitHubGitHub GitHub is a website that offers online implementation of git repositories that can easily be shared, copied and modified by other developers. Public repositories are free to host, private repositories require a paid subscription. GitHub introduced the concept of the โ€˜pull requestโ€™ where code changes done in branches by contributors can be reviewed and discussed before being merged by the repository owner. https://github.com/ repo. And then. Well, Iโ€™m sure Juan Ma will be open for questions and we can also discuss next steps or how the documentation team can, can come in and make updates, or how contributors globally, contributors to code or contributors to the documentation team can augment some of the documentation thatโ€™s going to be automatically created. But there are some manual places where you can fit in some additional explanations. All right, I think youโ€™re up now. Thank you for coming. Yeah. And taking the time.

JuanMa Garrido:
Yeah, thank you so much, Birgit, for facilitating this meeting and helping unblocking this, this whole change and thank you Andrea, for, for attending. Yeah. So this proposal is to. The goal of, of this proposal is to make the life easier for developers to understand blocks, to understand how they are built, how they are supposed to be used, and to surface a lot of information that was kind of hidden in the code, but displaying that in a more friendly way for developers and for the final users. Because what we have now is this. What we have now is a very brief list of the properties that define each block and a quick. And a link to the source code. So this is what we have right now. So thereโ€™s no context about what supports mean, thereโ€™s no context about what attributes mean, thereโ€™s no context about what, what does it mean allowed blogs and that makes it hard for people. They need to really do their own research. So Iโ€™m thinking from the perspective of a first time user that arrives to this place, they donโ€™t know anything about blocks and they find this and thatโ€™s really hard to grasp, to understand. And I think we can do better in that sense. Also as a reference for developers. This is also not super useful. I mean you can get the list of supports here, but for example, you donโ€™t have an explanation of whatโ€™s the meaning of each report and thatโ€™s something that could be improved. Thereโ€™s no example of how the markup is supposed to work for each blog. So I think there could be a better way to show this information. And I would like to highlight that this is not only important for developers, but also for artificial intelligence. Because in this era I think AI models are the first users of the and I think having better a more detailed information for each block available in the repository, but also the documentation is going to be very helpful for models to then recommend a specific developments using blockchain block markup, for example, Iโ€™m thinking about patterns or templates or any other thing that would mean, I donโ€™t know, less tokens and less hallucinations from the model. So for all those reasons there was a conversation that we had like with Birgi, then with Jonathan and Justin and Ryan within the team and with we discussed about this and Jonathan started a first attempt of doing this and then I continued the work and what I got was this. So this is what we have right now in production and Iโ€™m going to show how this would look like in production if this pull request is merged. So we would get something like this. This is the same page done before, but now we have now a section for each block categoryCategory The 'category' taxonomy lets you group posts / content together that share a common bond. Categories are pre-defined and broad ranging.. So my approach with this was okay, letโ€™s keep the current page because I like having in one page all the blocks, but letโ€™s expand this with more pages and with more detailed information about each block. So we have here all the blocks, but then the thing is that we have now links to both the category that the block belongs to and the detailed information. So letโ€™s take the first one, Core accordion. If we go to this page we can see that this is below design blocks. But we have also a page for each block category, Media blocks, reusable blocks, text blocks. So we have like these two ways of. See the list of blocks available in Core. But if we go for example to the details block, we can see the detailed page for the details block. And which information do we have here? All this information is in the code. But now we have surfaced this. So we have the internal name for the block, the category and this is a link to the category this block belongs to. So we can see itโ€™s siblings, so to speak. We have the version and here we have information about the versions. So we are starting adding more context about each piece of information. Then we have the block type and we get linked to a page where this thing is explained. Because blocks can be like Purely static, purely dynamic, or they can mix both approaches. So here based on the existence of specific files, it kind of categorized them between static, dynamic or hybrid. I think this is good information to have then internal keywords for the block and then the attributes. So we get this from the blood JSON, but we get more context because we can actually link to the parts of the documentation where each one of these things are explained. For example, the type of an attribute is we have here the value, but we can get a link to what does it mean and what are the possible values an attribute can have for this, the default value. And we get here a link to the part of the documentation, the attributes page where this is explained the rest for source role Regarding supports, I think this is really cool because it not only detail, it not only details the list of supported properties, but also we get a link to the the explanation of each one of these supports, which I think is really cool. And as you can see, all this information provides a better experience for someone approaching to the blog or even for an experienced developer because it really saves a lot of time. If I want to understand quickly what is something, then we have an example of the markup of each block. And I think this is really cool because this information is is taken for the fixtures that are used to test the block. So this information is used internally to verify that the block behaves or that the, the. The block does what itโ€™s supposed to do. And, and there are a lot of, they are called fixtures in testing terms. But this information is a good reference for anyone that wants to use this this block. So we can also surface this surface that automatically. And then finally we get a link to the, to the, to the source of this information. We get a link to the blog JSON for each block. And also here we have a reference of the explanation of the block JSON. So we are again adding more context to that. And then finally we get a link to the, to the whole directory with all the files that define each block. And all this process is generated automatically using a script.

Andrea Roenning:
So

JuanMa Garrido:
I donโ€™t know if there are any questions about this before I enter into the explanation of the technical aspects of the this change.

Birgit Pauli-Haack:
Andrea, everything is clear.

Andrea Roenning:
Yes, I have some specific questions, but they can wait.

JuanMa Garrido:
Okay.

Birgit Pauli-Haack:
Okay,

JuanMa Garrido:
so what I can do is I can explain how this works internally, how these pages are generated, when will they be generated and yeah, some aspects of the implementation. So the pull request is this one?

Birgit Pauli-Haack:
Yeah, I shared it in the chat window just in case.

JuanMa Garrido:
So first of all, this Pull request will add a lot of markdowns because itโ€™s the first time that is generated, it will add a REDMI MD for each one of the blocks. This is a one time thing because after that all those redmis will be updated only when there are changes to that affect these Redmi MDs. Second thing that I think is important is that this pull request provides a way to that two type of information coexist, like manual information and automatically generated information. So for each block. And we can see an example here in the navigation block which is here. And we can go to View file and I can show the row.

Birgit Pauli-Haack:
So thatโ€™s a little small.

JuanMa Garrido:
Yes. Yes. Let me.

Birgit Pauli-Haack:
You need to squint a bit. Yeah. So very good.

JuanMa Garrido:
Yeah. Is it fine now?

Birgit Pauli-Haack:
Yeah.

JuanMa Garrido:
Okay. So the navigation block, it had some previous information. In fact, I think it was the only REDMI MD that was created for a block. Only a few of them, this one and some other one that it has some information that was manually added. So this change will only generate automatic content between these tokens. Everything that is between these tokens will be automatically generated. So as long as we donโ€™t touch these tokens, we can add any manual information outside. And thereโ€™s a message here clarifying that this follows the same approach that is being used for the REDMI mds for the packages. Because the packages I can go, maybe I can quickly go and check the REDMI MD for. If we go to packages, each package it has this part, the API. If we go edit redmi. Yeah, as you can see, thereโ€™s also information that is manually added. But then we have a start token. All this part is automatically generated. So itโ€™s using the same, the same idea, the same approach. We can have manual and automatic content coexisting in the same REDMI md. Another technical detail that I think is relevant is to explain how we can trigger the generation of this content. And this is managed by a new script that has been add it here is called Docs Block Detail. This is part of package JSON and it has been added to the family of DOCS scripts. There are a lot of Docs script. For example, there is Docs API Ref is the script that generates the API content for each package, like as we saw a minute ago. So now thereโ€™s a new script called Docs Block Detail that generates the readme if it doesnโ€™t exist or it updates the readme for the affected changes. Another. Let me see if I can show this. Another interesting thing is that it has been added this Script this. To the lint state. So if I not run. In the same way that we have API ref and the block details will be launched for each. For each. So every time there is a change in a block JSON, it will. It will trigger these scripts in the same way that we are calling the other ones. Okay, what else? And basically I have tried to. Make this implementation as close as other things that are already happening. So the same things we do for other parts of the documentation now we are also doing that for blocks. For example, there is a automatic process for components. There is an automatic process for the REDMI MD of each package. And now we have another one for blocks. For blocks detail this docs blocks is the automatic process that generates the current page we have. This is the current page we have. And this is triggered by this process. Now we have another process that updates this page and also updates or generates the other Redmi MDs for each block and the categories pages. And what else can I say about this? I think I have covered like what was on my mind that I think could be relevant. So yeah, Iโ€™m going to stop talking now and answer to listen to any questions.

Andrea Roenning:
One question I have is, is it going to be clear if changes in the Gutenberg repository versus the core update?

JuanMa Garrido:
Thatโ€™s a very good question. I havenโ€™t included the change in this pull request. So we could do this in two ways. I could expand this pull request and make it bigger and try to other information. The thing is that that information is not available for any API in the Gutenberg repo. So maybe my. My feeling is that I agree that this should be added to this information, but maybe this pull request is not the place to add that. So in fact I was mentioning this to bitgit earlier. I have opened this issue to actually surface that information to this issue I opened was most referred to the API of each package because each function there is no clear information about which Gutenberg version it belongs to or if itโ€™s available in Core or not. And I agree that this is essential information to have. But this is using some internal processes because I have opened the issue, but I have already some work in progress for this. So I think the same internal processes could be applied to the blocks as well. So yeah, maybe and that would be my. My approach is that adding the Gutenberg version where each block was included or if itโ€™s available in WordPress Core or not, maybe that should be added as a. In a pull request after this is merged.

Birgit Pauli-Haack:
That makes sense to me. Yeah, yeah. I Agree too because I think itโ€™s important to have the processes to get all the documentation in the document on the handbook first and then wiggle it down to what are the other details that we need and do we need to have it for a process on the repo and then make it for, for every function, for every block, for every. Yeah. Detail that is in the block editor. And thatโ€™s a, itโ€™s a much bigger conversation because the developers need to be kind of, it needs to be clear which, which version that is. And, and thatโ€™s. I, I think one of the biggest Gutenberg plug repo problems is we have three different, well, even four. No, we have WordPress core, we have Gutenberg and we have the Gutenberg experiments. And then. So itโ€™s a three version process. And yeah, itโ€™s going to be really interesting to see how to implement that, but I donโ€™t want to. I definitely, personally, I donโ€™t think we should delay this process because itโ€™s such fundamental change and so much more helpful than this other detail here. What other questions do you have, Andrea?

Andrea Roenning:
One other question I have is, is it possible to have blocks grouped in more than one category?

JuanMa Garrido:
Is it possible to do that from a block JSON?

Andrea Roenning:
Yeah, I think. Well, I think it is, but I think the reason why it would be nice is it would be good to have a deprecated category because I think we have like a handful of deprecated blocks and it would be nice to kind of see them at a GL. But that could be a future Mr. As well. I donโ€™t know if that makes sense in this scope of work.

JuanMa Garrido:
Well, that information is, I think is included. Let me see.

Birgit Pauli-Haack:
Iโ€™ve seen it.

JuanMa Garrido:
So what was added was a call out at the beginning of each block? No, I donโ€™t think so. What was added was a call out with the experimental blocks. But I donโ€™t think because deprecated blocks. Yeah, they also exist in the repository. But yeah, I havenโ€™t thought of that. That could be something interesting to add in this pull request. Yeah, youโ€™re right.

Andrea Roenning:
Iโ€™ll add a note to the PR just so that itโ€™s documented there or

JuanMa Garrido:
maybe later not sure if a category is the best place because there is an idea of category and I think it could be, could be confusing for people to add a category that is not really a category.

Andrea Roenning:
Yeah, but it could be something else, some other attributes.

JuanMa Garrido:
But for example here, that could be a specific section. Yeah, I donโ€™t know.

Birgit Pauli-Haack:
Yeah, I did a similar kind of dive into After I saw what you did, who am I? I did a similar thing to just have a, a call out on the Gutenberg Knightley on what are the experiments blocks in the experiments. And I saw the deprecated part and I had the code discarded and that was relatively easy to do, to not display. So there is already a, A, a place where that is communicated. So yeah, that can certainly be part of the page. Yeah. Even if so they donโ€™t, I, I, I understand that you say, okay, I want it in a category because I have a list of all of it. Yeah. But it could be probably even a deprecated page separately, but have it in a separate pr. Yeah, I can see that.

JuanMa Garrido:
Yeah. The advantage of having all blocks here is that we could look for specific terms. So if we add deprecated here, you can access to all the deprecated blocks. So that could be a first and maybe thatโ€™s enough. But a second thing that could be done here is to maybe group them in a specific section and maybe adding a notice here highlighting that there are some deprecated blocks. Click here to see all of them and that could link to maybe a section that is at the end of the, of this doc listing all the deprecated blocks. Yeah, something. That is useful, but maybe that doesnโ€™t add more noise to the whole block directory.

Birgit Pauli-Haack:
Yeah, I like it. Yeah.

Andrea Roenning:
And at a minimum, even just adding a bullet there that some blocks are deprecated, maybe that would be a good first step.

JuanMa Garrido:
I think that information could be automatically generated. So maybe we could add directly here like a call out saying please take into account that the following blocks are deprecated, blah, blah, blah and blah, and we can link to the blocks or something. That could be done.

Birgit Pauli-Haack:
Good. Andrea, do you have any more questions?

Andrea Roenning:
No, Iโ€™ll just share. So Iโ€™m a contributor for the Help Hub user. Facing Docs team and keeping up with changes between WordPress core versions is a challenge. A lot of times there are attributes coming in and itโ€™s hard to know which blocks are getting them. So this will be helpful even just to be able to have a place to easily look at it without digging through block JSON. But yeah, down the road, if there was a change log or some way where we can see fit text is stored differently than it was before that, that kind of thing, I, Iโ€™m it, that would be lovely, but I donโ€™t think that needs to be part of this. Mr. A changelog would be great.

Birgit Pauli-Haack:
Yeah. Yeah. Itโ€™s really hard for the user documentation to make Anything automatic. Yeah, because it has all the different screens that you need for that. What is in the block settings? Whatโ€™s itโ€™s in. How does a block look like? I donโ€™t envy you. I did this probably for a year and a half back in 2020 to kind of try to figure out how to do end user documentation. So, yeah, I think with Play, I donโ€™t know, are you experimenting with Playground on that?

Andrea Roenning:
I use Playground to take, you know, videos of the blocks in action. For example, weโ€™ve got Nikon and Breadcrumb blocks coming in. And then I read through the prs and I look through the block. Yeah, so itโ€™s. But yeah, itโ€™s. And the source of truth is hugely helpful. I appreciate that.

Birgit Pauli-Haack:
So thank you. Yeah, yeah, yeah.

Andrea Roenning:
Keeping track of all of the incoming changes for Core is challenging, but I think this would be very helpful and it would also be helpful to get other developers involved. If they see a change on the readme, they can open a pull request and make an update, I think.

Birgit Pauli-Haack:
Yeah, yeah, yeah. That brings me to my question that I have for one. So if I see something thatโ€™s not correct, what would be my step after?

JuanMa Garrido:
Something that is something that is not correct in the content or in the implementation?

Birgit Pauli-Haack:
No, in the. Think about it. Okay, you have it all merged and now itโ€™s on auto processing. But Iโ€™m now a developer and try to figure out what do I do with this block or I want to style it. Now I find it difficult to get to that information and think I need to add something to that styling for that block, like accordion block or a tabs block or something like that. Yeah. So what would I do?

JuanMa Garrido:
Yeah, well, all the tools that are used internally in Gutenberg to generate content automatically for docs, they are all in two places. One of them is Tools API docs, and this is where the specific tool for the blocks will live if we go to the pull request. So talking about fine tuning the output, for example, of the. The blocks that would belong to. Yeah, this is too big for this. That would belong to this script. This is where all the. All the magic happens, so to speak. This is where this is all was created with the help of cloud code. So, yeah, maybe if thereโ€™s. I think this is enough, but maybe we could simplify the way to, I donโ€™t know, create a template that can be modified without affecting the process. But from a developer perspective, if I want to fine tune the output for each page, this is. The file should be updated.

Birgit Pauli-Haack:
Okay. So if I donโ€™t want to update all the pages. I only want to have a certain block documentation. I go to the package block library and then to the readme of that block.

JuanMa Garrido:
Yes. If I want to add manual information to a specific block, what can we do is go to. Because all the. So what this pull request is going to do is going to add a REDMI MD to each one of the blocks that are available in the block library package. The block library package contains all the core blocks. So in terms of code, if we go to Gutenberg packages block library now necessary, we have all the blocks. But right now no block has a REDMI md. So this pull request will add a REDMI MD inside the folder of each block, which makes a lot of sense because itโ€™s kind of a description of whatโ€™s going on here. So what we can do is to add the manual information for that block with a pull request using the process we use for other changes in the repository. And any information that is outside of these tokens will be respected, will not be modified by any process. So, for example, if we want to add custom information for the accordion heading, we can just add here whatever information we want or even after the token and that will be respected in the automatic process. It wonโ€™t be removed.

Birgit Pauli-Haack:
Super. And it would follow normal markdown formation format. And then somebody needs to review it and then it will be merged. And then after the merge, within a day or within an hour, I think the block editor handbook will be updated. Right. Good.

JuanMa Garrido:
I think every 15 minutes or something like that. Right.

Birgit Pauli-Haack:
Thatโ€™s pretty fast for someone whoโ€™s a new contributor and just wants to update the documentation and kind of see, oh, this is not clear. Letโ€™s do some manual, some additional explanation, then that can be done. Thatโ€™s wonderful. Excellent. Yeah. Because right now itโ€™s a really, really more difficult to do that. Yeah, you raised your hand, Andrea.

Andrea Roenning:
Yeah, I was going to propose that, you know, maybe towards the bottom, if we were going to list out accessibilityAccessibility Accessibility (commonly shortened to a11y) refers to the design of products, devices, services, or environments for people with disabilities. The concept of accessible design ensures both โ€œdirect accessโ€ (i.e. unassisted) and โ€œindirect accessโ€ meaning compatibility with a personโ€™s assistive technology (for example, computer screen readers). (https://en.wikipedia.org/wiki/Accessibility) issues or, you know, maybe link to open accessibility tickets, that would be a lovely place to do it. So theyโ€™re not like the very first thing you see, but if. Right. Itโ€™s nice that weโ€™ve got kind of the ice cream sandwich where weโ€™ve got manual data and then generated data and then we can still add manual data at the bottom, if that makes sense.

Birgit Pauli-Haack:
Totally. Yeah. Yeah. Especially because accessibility issues was one of the comments on the proposal by Joe Dawson. And I think it definitely needs somebody from the accessibility team to kind of add some information to each blocks readme and then it can be automatically added to the developer handbook.

JuanMa Garrido:
Yeah, Jodo suggested that. And yeah, the way to add this information, there is no way to get that information automatically as of today. But now we will have a place to add that information in the redmi and manually. So itโ€™s available.

Birgit Pauli-Haack:
Itโ€™s very good. Yeah. No, I like that. Hybrid. Yeah. Automate whatโ€™s possible. Yeah. And then manage manually what is different or what needs additional. Additional explanation because itโ€™s outside of the ordinary. Yeah. So I think, Andrea, are you any closer to understanding this process or are you. Do you have any more questions?

Andrea Roenning:
No more questions on my end. This is really exciting. I think it would be very helpful.

Birgit Pauli-Haack:
Yeah, I think so too. Yeah. All right. Joan, Mo, anything you want to add?

JuanMa Garrido:
Well, I would like to kind of share my impression about where we are now and what would be the next steps. So from the moment this new pull request, because the history of this pull request is that it was open, it was reviewed by different developers, like three or four developers. It was merged, but then it was reverted because there were concerns that this was. This wasnโ€™t discussed enough and there wasnโ€™t a good consensus about that. So after that this pull request was opened and there was a more formal process to gather feedback and we published the post and make a WordPress core. Now weโ€™re having this Halloway hangout. The feedback timeline ends next Monday, so thereโ€™s still time to provide feedback. But I would like to summarize the state of the pull request right now. I think that the consensus for the Docs team, I would consider it given. I mean, I would consider that the Docs team has supported this feature as per the comments in the proposal and the comments in the SlackSlack Slack is a Collaborative Group Chat Platform https://slack.com/. The WordPress community has its own Slack Channel at https://make.wordpress.org/chat/ channel. So thatโ€™s like a new thing that we didnโ€™t have before. And also the specific technical aspects because there were a lot of suggestions to improve the code that all those things were addressed in the previous pull request. But in this pull request there are new things. Most of them have been addressed. There are only a few ones that I didnโ€™t address until I knew for sure that we were going to move forward with this task. But one big one was this about that George asked if, because yeah, this pull request is going to add a lot of new ReadMe files in the repository. That means a lot of new lines. So thatโ€™s a really valid concern. But even with that, I think this is still the best way to tackle this theme because that information will live in the repository. Which I think is where it should live. And then the documentation is just like a nicer way to to provide that information. And also I think itโ€™s important that that information is available from both repository and from the documentation so there are no gaps. So if you access to the info from the repo or from the documentation site, the info is already there. And Dion from the metaMeta Meta is a term that refers to the inside workings of a group. For us, this is the team that works on internal WordPress sites like WordCamp Central and Make WordPress. team also thinks that this is the way to go. So in that sense I think the major concerns are now addressed and there are clear responses to all those things. But as I said, thereโ€™s still time to ask questions to raise more concerns and to provide more feedback. But I think we are in a better place now to move forward with this.

Birgit Pauli-Haack:
Yeah, so you heard it. If youโ€™re listening to this before May 25, you still get a chance to have put in your feedback. Your Yes, I love this. Or well if you do this, there are some concerns. Yeah. Either way, leave it on the make blog post or on the pull request. Thatโ€™s definitely the two places to to leave that. Feed your feedback there and we close this horror hangout now. Thank you both Andrea and Juan Ma for being here and have a discussion on this. And Fuanli, Iโ€™m really excited about it because I couldnโ€™t really make a visual thing so I asked Juan Ma if he would demo some of the things. So Iโ€™m really happy that we did this. I will post the link to the video on the proposal and also in the channel docโ€™s channel as well as the co editor channel once itโ€™s ready. And Iโ€™m also find a tool that does the transcript so we can publish both of that. And I wish you all a wonderful week and hope to see you the next time when we have something like this exciting to propose. Bye everybody.

Andrea Roenning:
Thank you.

JuanMa Garrido:
Thank you.

Birgit Pauli-Haack:
Bye.

JuanMa Garrido:
Thank you. Very good. Thank you Andrea.

Timeline

MilestoneDate
Feedback period opens5th May
Hallway Hangout (Zoom) 18th May โ€“ 14:00 UTC
Feedback period closes25th May
Next steps announcedShortly after close

Feedback collected from the community will help refine the proposal and inform next steps for implementation.

Props to @bph, @huzaifaalmesbah and @awetz583 for reviewing this post

#block-editor-handbook, #block-editor, #blocks, #docs, #handbooks

Real-time collaboration will not ship in WordPress 7.0

Today, @matt made the decision to remove real-time collaboration from WordPress 7.0 and shared that he is not confident the current approach is robust enough to include in CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. at this time, citing concerns around surface area, race conditions, server load, memory efficiency, and recurring bugs found through fuzz testing.

This is a difficult decision, especially given the amount of work that has gone into the feature, but it is being made in service of shipping a stable and reliable WordPress 7.0 release for our users. Work to remove the feature from the release is being organized in #65205 and in the #feature-realtime-collaboration. At this time, the release schedule remains as is and further updates will be provided if the schedule needs to change to unwind this feature.

Real-time collaboration remains an important and exciting feature for WordPress. Once the immediate release work is complete, a plan will be shared for broader testing and continued iteration to help prepare the feature for a future release. Thank you to everyone who has contributed to this work so far from so many angles.

#7-0, #feature-real-time-collaboration

Results: Real Time Collaboration performance testing analysis

Following the decision to remove real-time collaboration from WordPress 7.0, this post summarizes what the latest hosting test data showed and outlines the recommended storage strategy for future iteration. A huge thank you to every web host that submitted results in response to last weekโ€™s call for testing. Submissions came in from eight hosting environments between April 29 and May 4, and analysis of the aggregated, anonymized data is now complete. Based on the results, the recommendation is to use custom-table-with-transients as the default RTC storage strategy for continued testing and future iteration.

As a reminder, four candidate storage strategies for the Real Time Collaboration (โ€œRTCโ€) feature were tested under load:

  • post-meta โ€” the RC2 baseline.
  • custom-table โ€” a dedicated table for all RTC data.
  • post-meta-transients โ€” post metaMeta Meta is a term that refers to the inside workings of a group. For us, this is the team that works on internal WordPress sites like WordCamp Central and Make WordPress. for storage with transients for client awareness.
  • custom-table-with-transients โ€” a dedicated table with an object cache-backed awareness (Note: while contributors have been referring to this as a transient approach, it is a convenient short hand rather than a technical description)

The test runner captured per-request REST dispatch time and database query counts during sustained 30-second polling windows. Eight complete captures from a mix of shared, shared-with-Redis, managed-cloud, and no-object-cache environments form the basis of the analysis below.

What the data showed

Across the cohort, custom-table-with-transients was first or tied-first on six of seven complete environments, and was never slower than the RC2 baseline (post-meta approach). On average, the custom-table-with-transients approach was ~52% faster and the purely custom-table approach was ~37% faster than the current implementation. On hosts without a persistent object cache, it landed within 0.05โ€“0.17 ms of plain custom-tableโ€”close enough that the two are effectively tied where caching is absent.

Two clean signals showed up in the database query counts during dispatch:

  1. With a persistent object cache present, both transient-based strategies dropped to a single database query per dispatch.
  2. Independent of caching, the custom-table schema cut the query count roughly in half compared to the post-meta strategies.

custom-table-with-transients wins because it gets the schema reduction when caching is absent, and the cache reduction when itโ€™s present. post-meta-transients, by contrast, is not recommended even as a fallback. It nearly doubles in latency without a persistent cache, and on one no-cache shared environment it exhibited a pathological transient code path that pushed dispatch latency past 26 ms โ€” several times worse than any other strategy on that host.

Recommendation for the future

The recommended storage strategyย custom-table-with-transients is considered the best case among the candidates. It wins decisively on environments with a persistent object cache, remains comfortably ahead of the baseline on environments without one, and degrades gracefully across the full spread of hosting tiers represented in the data.

Read the full analysis

The full anonymized analysisโ€”including per-environment dispatch tables, query counts, cross-cuts comparing cache effects, and bootstrap floorsโ€”is available here. All submissions remain anonymized in line with the commitment made in the original call for testing.

Summary

The data from this testing window was sufficient to make the call confidently: custom-table-with-transients is the best option forward as the default for real time collaboration. When work resumes after clean up from 7.0, this is the approach best positioned to explore more deeply next.

Thank you again to every host that participated. Your contributions provided the data needed to make this storage recommendation and will help set real-time collaboration up for success across the wide range of environments where WordPress runs. Props to Ionos, BlueHost, Kinsta, XServer, and WordPress.comWordPress.com An online implementation of WordPress code that lets you immediately access a new WordPress environment to publish your content. WordPress.com is a private company owned by Automattic that hosts the largest multisite in the world. This is arguably the best place to start blogging if you have never touched WordPress before. https://wordpress.com/ for their contributions here.

Props to @griffbrad for drafting this post. Props to @dd32 @desrosj @jmdodd @peterwilsoncc @jorbin @4thhubbard for testing, analysis, and review. If I missed your name, please tell me as itโ€™s a mistake and there have been a lot of moving pieces.

#feature-real-time-collaboration

Pattern Overrides in WP 7.0: Support for Custom Blocks

As of WordPress 7.0, any blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. attribute that supports Block Bindings also supports Pattern Overrides. So now, you can use Pattern Overrides for any block you want โ€” even custom blocks โ€” the previous limit to a hardcoded set of CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. blocks no longer holds you back. To get started, opt in through the server-side block_bindings_supported_attributes filter(s).

The underlying Block Bindings mechanism will make sure that:

  • In dynamic blocks, the correct, bound attribute values will be passed to render_callback().
  • In static blocks, the HTMLHTML HyperText Markup Language. The semantic scripting language primarily used for outputting content in web browsers. APIAPI An API or Application Programming Interface is a software intermediary that allows programs to interact with each other and share data in limited, clearly defined ways. is used to locate attributes sourced from html, rich-text, or attribute sources via their selectors in the persisted markup, replacing their values with the respective bound attribute values.

Bound attribute values should appear correctly in the rendered blocksโ€™ markup in these cases. You shouldnโ€™t need any other modifications.

For static blocks with unsourced attributes, or with sourced attributes whose selectors are more complex than the HTML API currently understands, you might need to add a render_callback() or a render_block filterFilter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output. to make sure bound attribute values are correctly handled. Itโ€™s best if you first try without (i.e. by only adding the attribute via block_bindings_supported_attributes filter). Then, if the bound attribute value doesnโ€™t render, add the callback or the filter that guarantees the render.


Props to @fabiankaegy and @marybaum for reviewing this dev notedev note Each important change in WordPress Core is documented in a developers note, (usually called dev note). Good dev notes generally include a description of the change, the decision that led to this change, and a description of how developers are supposed to work with that change. Dev notes are published on Make/Core blog during the beta phase of WordPress release cycle. Publishing dev notes is particularly important when plugin/theme authors and WordPress developers need to be aware of those changes.In general, all dev notes are compiled into a Field Guide at the beginning of the release candidate phase.!

#7-0, #dev-notes, #dev-notes-7-0

Announcing the Featured Plugins Experiment

I pitched this to Matt directly and have been given the go ahead to pave the way here. This post begins that process and documents the Featured Plugins experiment currently underway on WordPress.orgWordPress.org The community site where WordPress code is created and shared by the users. This is where you can download the source code for WordPress core, plugins and themes as well as the central location for community conversations and organization. https://wordpress.org/. The goal is to surface newer plugins in the directory that meet a defined quality bar but have limited visibility. Eight plugins are selected every two weeks.

Eligibility
To be considered, a pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party. must meet all of the following baseline requirements:

Active installs: fewer than 10,000
Age: listed in the directory for 12 months or less
No open security vulnerabilities
Compatible with the current major releasemajor release A release, identified by the first two numbers (3.6), which is the focus of a full release cycle and feature development. WordPress uses decimaling count for major release versions, so 2.8, 2.9, 3.0, and 3.1 are sequential and comparable in scope. of WordPress
Updated within the last 6 months

Selection Criteria
Plugins that pass the eligibility requirements are evaluated against three categories of criteria.

Technical standards
Code is human-readable and follows WordPress coding standardsWordPress Coding Standards The Accessibility, PHP, JavaScript, CSS, HTML, etc. coding standards as published in the WordPress Coding Standards Handbook. May also refer to The collection of PHP_CodeSniffer rules (sniffs) used to format and validate PHP code developed for WordPress according to the PHP coding standards.
Proper use of escaping, sanitization, and nonces
No unnecessary bundling of libraries or WordPress coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. functionality
Plugin readme accurately describes what the plugin does

Ecosystem fit
Addresses a problem not already well-served by existing plugins
Provides functionality with genuine utility to WordPress users

Developer engagement
Developer is responsive in the support forums
UXUX User experience reflects care and intentionality in the implementation

How Decisions Are Made
Plugin selection is currently handled by Nick Hamze. The process and governance around selections will be reassessed as the experiment develops.

How Plugins Are Considered
All plugins that meet the eligibility requirements are automatically included in the pool for consideration. No submission is required.

Plugin authors who want to provide additional context about their plugin โ€” or make a case for its inclusion โ€” can do so in the #featuredplugins channel on the Make WordPress SlackSlack Slack is a Collaborative Group Chat Platform https://slack.com/. The WordPress community has its own Slack Channel at https://make.wordpress.org/chat/.

Tracking Progress
This experiment is tracked openly. Feedback on the criteria, the process, or specific selections can be shared in the #featuredplugins Slack channel. The process and governance around selections will be reassessed as the experiment develops. Right now, the aim is to experiment first with a small scope to ensure itโ€™s meaningful for end users, plugin authors, and contributors. As the work evolves, more documentation and any necessary process can be added so future contributors can join.

Presence API Feature Plugin

The Presence API is an experimental feature pluginFeature Plugin A plugin that was created with the intention of eventually being proposed for inclusion in WordPress Core. See Features as Plugins that provides a system-wide awareness layer โ€” who is logged in, what adminadmin (and super admin) screens they are on, and which posts they are editing.

This idea of presence I think is really cool and seeing where people areโ€ฆ you log into your WordPress, I see oh Matias is moderating some comments, Lynn is on the dashboard maybe reading some newsโ€ฆ that idea of like you log in and you can kind of see the neighborhood of like who else is also there.

Matt Mullenweg, WordPress 7.0 planning session

Problems this aims to solve

  • There is currently no way to see who else is logged into the WordPress admin at the same time.
  • Posts being actively edited by another user are only surfaced when a lock collision occurs, by which point work may already overlap.
  • The post list provides no indication of which posts have active editors until a user tries to open one.

Hereโ€™s what that looks like in practice:

Try it yourself in WordPress Playground: 5-user blueprint. The blueprint creates 5 editor accounts with live presence spread across admin screens and posts, so the widgets, admin bar, and post list are populated the moment Playground boots โ€” no second browser or incognito window needed.

See it at scale: 40-user blueprint. Same setup, 40 seeded editors โ€” useful for seeing how the widgets, admin bar, and post list handle density.

What the pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party. provides

  • Dashboard widgets: โ€œWhoโ€™s Onlineโ€ and โ€œActive Postsโ€
  • Admin bar online indicator with avatarAvatar An avatar is an image or illustration that specifically refers to a character that represents an online user. Itโ€™s usually a square box that appears next to the userโ€™s name. stack for on-screen presence
  • Post list โ€œEditorsโ€ column
  • Users list โ€œOnlineโ€ filterFilter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output.
  • REST endpoints and WP-CLIWP-CLI WP-CLI is the Command Line Interface for WordPress, used to do administrative and development tasks in a programmatic way. The project page is http://wp-cli.org/ https://make.wordpress.org/cli/ commands
  • Post-lock bridge (coexists with existing _edit_lock behavior)

All features are gated on the edit_posts capabilitycapability Aย capabilityย is permission to perform one or more types of task. Checking if a user has a capability is performed by the current_user_can function. Each user of a WordPress site might have some permissions but not others, depending on theirย role. For example, users who have the Author role usually have permission to edit their own posts (the โ€œedit_postsโ€ capability), but not permission to edit other usersโ€™ posts (the โ€œedit_others_postsโ€ capability).. Full technical details are in the GitHub repository.

Background

During WordPress 7.0 development, discussion in #64696 identified that storing high-frequency ephemeral data in shared tables causes persistent cache invalidation site-wide. This feature plugin was built to test that workload independently using a dedicated ephemeral data table with a 60-second TTL. Data flows through the existing Heartbeat API. The plugin was presented at a coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. dev chat and subsequently transferred to the WordPress GitHubGitHub GitHub is a website that offers online implementation of git repositories that can easily be shared, copied and modified by other developers. Public repositories are free to host, private repositories require a paid subscription. GitHub introduced the concept of the โ€˜pull requestโ€™ where code changes done in branches by contributors can be reviewed and discussed before being merged by the repository owner. https://github.com/ organization. It was submitted to the WordPress.orgWordPress.org The community site where WordPress code is created and shared by the users. This is where you can download the source code for WordPress core, plugins and themes as well as the central location for community conversations and organization. https://wordpress.org/ plugin directory on April 6, 2026.

Feedback welcome

This plugin is experimental. Feedback on the following is especially helpful:

  • Are the UIUI User interface surfaces (widgets, admin bar, post list) useful as presented?
  • Are there admin screens or workflows where presence would be valuable?

Discussion and development: #feature-presence-api on WordPress SlackSlack Slack is a Collaborative Group Chat Platform https://slack.com/. The WordPress community has its own Slack Channel at https://make.wordpress.org/chat/

Bug reports and discussion: GitHub Issues

Thank you to @jorbin and @desrosj for helping to stand up this feature plugin.

Props @peterwilsoncc, @mindctrl, @czarate, @davidbaumwald, @dd32, @maxschmeling, and @westonruter for the architectural discussion in #64696 that informed this work.

#performance, #presence-api