WordPress Developer Update: Gutenberg 23.8, 23.9, and the Path to WordPress 7.2

A computer screen with a bunch of data on it – WordPress Developer Update: Gutenberg 23.8, 23.9, and the Path to WordPress 7.2

WordPress 7.1 Post-Launch and the Gutenberg Development Cycle

Following the release of WordPress 7.1 (“Mary Lou”), which introduced responsive style states and native icon registration, recent Gutenberg releases—versions 23.8 and 23.9—focus heavily on refining core APIs, improving schema accuracy, and laying architectural groundwork for real-time collaboration. These updates set the stage for the upcoming WordPress 7.2 release cycle, with Beta 1 scheduled for October 20–22, 2026, and the final release targeted for December 8–10, 2026.

Developers can test these features immediately using WordPress trunk combined with the latest Gutenberg plugin, or by launching an instant browser instance via WordPress Playground.

Runnable Code Examples in the Official Code Reference

A major documentation upgrade has landed in the official WordPress Code Reference: interactive, browser-executable code examples powered by WebAssembly and WordPress Playground. Rather than relying on static code snippets, developers can now execute PHP examples directly within their web browser.

Interactive code examples are declared directly inside source file DocBlocks using a specialized php interactive code fence tag. This design ensures that documentation and functional examples remain tightly coupled within the primary codebase.

/**
 * Generator for a foreach loop to step through each class name for the matched tag.
 *
 * ```php interactive
 * $p = new WP_HTML_Tag_Processor( "<div class='free &lt;egg&gt;tlang-en'>" );
 * $p->next_tag();
 * foreach ( $p->class_list() as $class_name ) {
 *     echo "{$class_name} ";
 * }
 * // Outputs: "free <egg> lang-en "
 * ```
 */
public function class_list() {}

When viewed in the Code Reference (e.g., for WP_HTML_Processor::class_list()), clicking “Run” executes the code against a client-side WordPress runtime, outputting the exact results instantly without requiring local server execution.

Declarable Keyboard Shortcuts API for Block Variations and Transforms

Historically, block keyboard shortcuts—such as pressing Alt+Shift+2 to convert a paragraph block into a Heading 2—were hardcoded into private components inside editor packages. Gutenberg 23.9 introduces a public, declarable API allowing custom block variations and block transforms to register custom key combinations natively.

Registering Shortcuts on Block Variations

Block variations accept a singular shortcut object during registration. The shortcut definition specifies the unique command name, localized description, and key combination modifier mapping.

wp.blocks.registerBlockVariation( 'core/heading', {
    name: 'h2',
    title: 'Heading 2',
    attributes: { level: 2 },
    isActive: ( blockAttributes ) => blockAttributes.level === 2,
    shortcut: {
        name: 'core/block-editor/transform-to-heading-2',
        description: __( 'Transform the selected block into a heading 2.' ),
        keyCombination: {
            modifier: 'access',
            character: '2',
        },
    },
} );

Registering Shortcuts on Block Transforms

Block transforms handle shortcuts via a plural shortcuts array attached to a type: 'block' transform rule. To prevent duplicating transform definitions in the block switcher interface when binding multiple key combinations, transforms can accept an optional variationName parameter, allowing a single transform definition to manage multiple keyboard shortcuts cleanly.

Architectural Shift: Inner Block Templates Move to Block Settings

In Gutenberg 23.8, inner block template definitions have been moved from React component props (such as passing template to <InnerBlocks />) directly into the client-side block type registration settings.

Why the Architecture Shifted

Under the former React prop-based system, inner block templates were evaluated and instantiated client-side after the parent block mounted in the editor DOM. In multi-user real-time collaboration scenarios, if three users connected simultaneously to a document where a List block was inserted, each connected client would evaluate the template prop independently, resulting in three duplicated sets of list items in the unified document state.

By declaring inner block templates within registerBlockType, the entire parent block and its initial nested template are created as a single, atomic operation inside the Redux/Data store before rendering.

registerBlockType( 'core/list', {
    template: [ [ 'core/list-item' ] ],
    templateInsertUpdatesSelection: true,
    // Additional block settings...
} );

Over twenty core blocks (including List) have already migrated to this structure. While the <InnerBlocks /> props remain temporarily available for backward compatibility, they are officially deprecated. Extenders should migrate template declarations to block settings ahead of WordPress 7.2.

DataViews Refactoring and Public UI Component Exports

Plugin developers bundling @wordpress/dataviews into custom admin extensions previously encountered runtime errors stating: Cannot unlock an object that was not locked before. This occurred because DataViews reached across package boundaries into @wordpress/private-apis. When multiple instances of the private API package existed in the same browser runtime, they failed to unlock each other’s encrypted objects.

To solve this, @wordpress/dataviews has completely removed its dependency on @wordpress/private-apis. As part of this refactoring, several formerly locked UI controls have been promoted to public exports:

  • Calendar and RangeCalendar components have been relocated into the public @wordpress/ui package.
  • withIgnoreIMEEvents has been exposed in @wordpress/keycodes.
  • ValidatedInputControl is now publicly exported, alongside eight internal Validated* form controls.

Additional Package and Utility Updates

  • Time Field in DataViews: A dedicated time field type and UI control landed in Gutenberg 23.8. It formats and stores isolated daily time values in HH:mm or HH:mm:ss format. Unlike datetime, local time strings remain fixed and are unaffected by client timezone offsets.
  • @wordpress/kebab-case: String casing conversion logic previously locked in private JavaScript utilities is now available via the @wordpress/kebab-case package. It ensures identical string transformation rules between JavaScript and PHP’s _wp_to_kebab_case() function, particularly around alphanumeric boundaries (e.g., kebabCase('white2white') outputs 'white-2-white').
  • Admin Theme Consistency: Post, widget, and customizer editors are now wrapped in a ThemeProvider seeded from the user’s active admin color scheme. Extensions can leverage the public getAdminThemeColors() function from @wordpress/admin-ui to match custom admin screens to the active admin-color-* CSS classes.

Theme.json Enhancements and Styles UI Curation

WordPress 7.1 introduced responsive style states and pseudo-class styling inside theme.json. Gutenberg 23.8 fixes several core schema bugs that previously generated false-positive validation errors in code editors, correcting element-level pseudo-classes and responsive block states.

Curating Styles Editing Controls

Enterprise site builders and agency developers often need to lock down the Block Editor interface to prevent content authors from altering established design systems. Developers can now programmatically disable block style state and responsive style controls using the block_editor_settings_all PHP filter.

add_filter( 'block_editor_settings_all', function ( $settings ) {
    $settings['blockStatesEditingEnabled'] = false;
    $settings['responsiveEditingEnabled']  = false;
    return $settings;
} );

Setting these values to false hides the style editing controls in the editor sidebar UI. Importantly, existing styles defined inside theme.json, Global Styles, or inline block attributes remain fully rendered in the editor and front-end.

Global Styles and Block Support Expansions

  • Label Element Styling: Developers can now target form labels site-wide via styles.elements.label in theme.json, automatically applying rules to Core Search, Form Input, Post Comments, Archives, and Categories blocks.
  • Extended Design UI: The Global Styles interface now directly supports typography and color customization for cite, textInput, and select elements.
  • Block Gap Support: The Group block now supports both horizontal and vertical axial blockGap declarations. The editor UI exposes independent top/left spacing controls for flex and grid block layouts. Note: The core style sanitizer strips gap values containing parentheses, automatically rejecting raw calc() or var() expressions.
  • Updated Block Capabilities: The List block gains wide and full-width alignment supports; Query No Results supports native borders and custom spacing; and Query Loop gains native blockGap support.

WordPress Playground: WebMCP Integration and Historical Testing

WordPress Playground has introduced support for WebMCP, a draft browser-level API enabling AI agents to interact with web applications via structured tools. Because Playground executes WordPress inside an isolated iframe, a specialized WebMCP proxy exposes inner WordPress capabilities to the outer browser context. Plugin developers must explicitly wrap WordPress functions inside WebMCP tool definitions to expose them to external agent interactions.

For regression testing and debugging historical issues, Playground can now execute legacy WordPress environments dating back to WordPress 0.7. Toggling “Include older versions” inside the Playground settings panel allows developers to test core releases up through 6.2 with automatic PHP version pairing.

Frequently asked questions

Why are inner block templates moving from React props to block type settings?

Moving template declarations from React props (like ) into block type settings (registerBlockType) allows the block and its initial nested template structure to be created in a single atomic store operation. This prevents duplicate block instantiation bugs during real-time multi-user collaboration.

How do I disable responsive and state style controls in the Block Editor UI?

You can disable these editing controls by filtering block_editor_settings_all in PHP and setting 'blockStatesEditingEnabled' and 'responsiveEditingEnabled' to false. Existing theme.json and block-level styles will continue to render normally.

What is the difference between the DataViews time field and datetime field?

The DataViews time field stores isolated daily time values in HH:mm or HH:mm:ss format without attached date or timezone metadata. This ensures fixed time representation (e.g., 9:00 AM) regardless of the visitor's local timezone offset.

Primary reference: Review the original announcement for exact release details. This article is an independent explanation and does not reproduce the source text.