Coding Standard Proposal: Allow the use of the PHP short echo tag

Currently, the WordPress Coding Standard explicitly forbids the use of the PHP short echo tag (<?=) along with the PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 7.4 or higher short 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.) (<?). This post proposes modifying this rule to allow the use of the short echo tag for single statements.

Motivation

Prior to PHP 5.4, it was possible to disable the PHP short echo tag (<?=) using the PHP short_open_tag ini directive. This meant that scripts using this tag could not be used in code that must work across different PHP installations, because the content within those tags may be printed instead of executed, which could lead to code exposure. For this reason, the 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. forbid its use.

Since PHP 5.4, the short echo tag is always available, and changing the short_open_tag directive no longer affects it. WordPress dropped support for versions prior to PHP 5.6 in 2019, and since then raised the minimum supported PHP version to 7.2. Currently, according to WordPress.org stats, the percentage of active WP installs using PHP < 5.4 is 0.4% and the percentage of sites still using WP < 5.2 is 4.0%. Therefore, it is now safe to allow the use of short echo tags.

This tag is useful as it provides a more concise syntax for outputting values in template files. WordPress developers should be allowed to use it. An issue requesting this change is the most liked issue in the WPCSWordPress Community Support A public benefit corporation and a subsidiary of the WordPress Foundation, established in 2016. repository, indicating community support.

This proposal is about allowing the use of the short echo tag for single statements, not encouraging its use, so no immediate changes are required. In practice, this means that:

  • Existing open patches for CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. are not affected as either style is allowed.
  • Existing WP Core code and code in official WP themes should not be updated, as both styles are permitted. A patchpatch A special text file that describes changes to code, by identifying the files and lines which are added, removed, and altered. It may also be referred to as a diff. A patch can be applied to a codebase for testing. to enforce the use of short echo tags in all possible places will NOT be accepted.
  • However, a new official theme could choose to use short echo tags if desired.

Suggested change to the handbook

The suggestion is to modify the rule titled “No Shorthand PHP Tags” as follows:

New title: No PHP short open tag

Content:

Important: Never use the PHP short open tag (`<?`). Always use the full PHP open tag (`<?php`). Using the PHP short echo tag (`<?=`) is allowed, though short echo tag snippets should only contain a single statement.

Correct:

<?php … ?>
<?= esc_html( $var ); ?>

Incorrect:

<? … ?>

How to keep short echo tags forbidden in a given project

If this proposal is accepted, but a project wants to keep the short echo tag forbidden in its own codebase, it can do so by adding the following snippet to its PHPCSPHP Code Sniffer PHP Code Sniffer, a popular tool for analyzing code quality. The WordPress Coding Standards rely on PHPCS. configuration after the WordPress standard is included:

<rule ref="Generic.PHP.DisallowShortOpenTag.EchoFound">
    <severity>5</severity>
</rule>

References

#codingstandards, #php, #wpcs

Props @dingo_d, @garyj, and @jrf for reviewing this post.

AI as a WordPress Fundamental

WordPress Fundamentals

Imagine WordPress without a database.

Not changing the kind of database. No database at all. WordPress without the ability to persist data. One could use the filesystem. But how would things like 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. work? Some particularly clever minds might take this as a challenge and think of something, but WordPress would be fundamentally different.

The funny thing about this mental experiment is that your average WordPress user doesn’t know what a database is, much less the fundamental role it plays within WordPress. It’s taken for granted. Of course posts save, comments can be made, and settings are stored. Why wouldn’t they?

Even 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 developers the presence of the database is assumed. No one checks if the database exists before using get_post_meta() or grabbing $wpdb. Entire products are built around the assumption that the database is present. Simpler products store things in meta while more complex products add custom tables. From simple to complex, products utilize the database to unlock incredible possibilities. It’s safe to say the vast majority of the impressive plugin ecosystem relies on the database.

AI as a Fundamental

What if this were true of AI?

What if, from the end-user to the plugin developer, they could take for granted that there’s an AI model accessible to me by virtue of being in WordPress? What kinds of things would people use it for? What amazing things would people create that are built on the reliable presence of a capable LLM?

It’s tempting to think of AI as a feature. Users look at products like ChatGPT or Claude Code and imagine a chat interface. So it may be tempting to imagine WordPress with a chat interface to a powerful LLM that does all sorts of cool things with and for the user. But the idea is not merely that; it is more than that.

Even with the database, there are certain features like saving a post that feel closely tied to the database. But when someone likes a post, they’re not thinking “I’m saving this like”. They just did something and it’s still there. Why wouldn’t it be? With LLMs the chat interface feels close to the model because it’s a direct interaction. But what about features like clicking a “generate alt text” button for an image that just fills in the alt text? In this case, it’s creating an AI-powered feature without it being obvious. And so it should be! When one imagines AI as an engine, humming within WordPress that can be used for anything, then things get even more exciting.

AI Features at WordPress Scale

The most incredible thing about WordPress is its ecosystem. Every single day there are people creating and improving plugins that push the capabilitiescapability 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). of WordPress further and further. Each day WordPress grows to be even better.

Imagine if every single developer was empowered with AI capabilities without having to handle the complexities of AI integration. What if the developer just did something like

$$image = Ai_Client::prompt( 'Create an image that beautifully reflects this post content' )
  ->with_text($post_content)
  ->generate_image();

Simple as that. Nothing more required to interact with the AI. One could build everything from simple interactive tools to powerful agents. If AI is fundamental to WordPress, and it’s unleashed on the ecosystem, then there’s simply no competitor that can keep up. (As a note, this code isn’t just an idea, this is real! It’s the WP AI Client and is proposed for WordPress 7.0!)

To be abundantly clear, this is the bedrock of this vision: In order for AI to truly be a cornerstone of WordPress’ next wave of success, AI has to be a win for the entire ecosystem. To press it further, WordPress is what it is today because of its ecosystem, therefore adoption by the ecosystem is not a nice to have, it’s the most necessary goal. No competitor can possibly keep up with the scale and speed of innovation in the WordPress ecosystem. That is our advantage, and AI can unlock the next stage of innovation.

An ushering strategy

The real challenge, therefore, is how to empower everyone with this capabilitycapability 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).. At this moment, the most feasible method for integrating with LLMs is through cloud providers such as OpenAI, Google, and Anthropic, or through self-hosted means which is not for the faint of heart. So if a plugin adds a bunch of AI features then they need to either provide the service themselves (e.g. Elementor’s Angie) or send the user off to generate an OpenAI (or whatever) key, come back, and paste it in. In either case there’s additional complexity and cost, the kinds of which drive away the majority of users. Again, imagine if it was also Bring Your Own Database?

What if hosts brought the AI like they do databases?

If databases were optional in WordPress, then hosts including a database as part of their managed hosting would be a huge competitive advantage. The capabilities and experience of the WordPress site would be substantial. If plugins included AI-powered features, then this same reasoning would flow into hosts that provide the AI model as part of the hosting plan. WordPress would work without AI (an important note), but to a noticeably lesser degree in terms of user value. Hosts even have the choice to determine how they want to solve that problem (proprietary model, proxy, etc.) to play with their own cost-to-value proposition and be competitive.

With this in place, plugin developers would be able to assume that a capable model exists which they can use to power their features. This eliminates the common and substantial pain point for each developer to figure out how to bring a model or get the user to bring their own. Not only does that reduce friction for the user, but it greatly lowers the necessary competency for the developer. Armed with the ability to simply run prompts any time and anywhere, the developer doesn’t need to know more than how to do that and can get back to innovating.

Backwards Compatibility

This is WordPress, so it’s important to acknowledge the need for backwards compatibility. There’s a strategy that’s already in place for this. Within the WP AI Client, it has a system for finding the best model for a given prompt — based on the needs of the prompt. It’s quite sophisticated! It also has methods that can be used to check if there is a model available to do the work. This is really important, because it allows the developer to check for the AI before making the assumption.

Imagine a “Generate Alt text” button, for example. The developer can use the check methods to conditionally display the button — present if there’s a supporting model, and hidden if not. This keeps the plugin working in a backwards compatible way.

As time goes on, ideally the need for these sorts of checks will be reduced, ultimately getting to the point now where databases are truly assumed to be present.

Where the vision meets us

This journey has already begun with the formation of the AI Team in WordPress and the AI Building Block for WordPress was created. For this to succeed, innovation and effort are needed from two communities within the WordPress community:

Developers

Adoption and innovation of the Abilities 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. (coming in WP 6.9), WP AI Client (proposed for WP 7.0), and MCP Adapter from developers is critical. Even if you’re not sure about what AI features to make, just using Abilities will make other AI integrations even more capable. Otherwise, thinking outside the chat bot (though that’s great, too) and imagining what you could do by passing text, images, audios and so forth to AI, and getting back text, images, audios, videos, and embeddings. The upcoming Workflows API will then make it possible to chain together Abilities into truly powerful flows. Imagine publishing a post which triggers a workflow to use AI to summarize its content, send an AI generated email to an audience, and then note its completion in a 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/. post.

Really, just do what you do already and make amazing things! To learn more about how this connects to developers and what they can do, read AI for WordPress Developers.

Hosts

As already mentioned, hosts are critical in the distribution of AI models to the ecosystem. By introducing AI in hosting plans, WordPress becomes even more capable simply by including a model, giving a competitive advantage. Hosts can also use this AI within WordPress for doing things like interacting with the customer’s account via MCP. Also think about developers and how to empower them to develop within your environment, possibly offering some access for developers to test their plugin on your platform to make sure it works as intended.

To learn more about how this connects to hosts and what they can do, read AI for WordPress Hosts.

Conclusion

There will be separate posts written specifically for developers and hosts to provide more specific information on what they’ll need to understand to get started. You’re encouraged to jump into the Making WordPress Slack and reach out in the #core-ai channel with any questions or needs that arise.

AI is an industry shift, quickly becoming a cornerstone of the next generation of technology. For WordPress to grow into the next phase it’s critical that AI become a fundamental part of WordPress itself, and for this to succeed everyone has a role to fulfill.

Props to @annezazu, @jeffpaul for the pre-publish review

X-post: WordPress Playground: 2025 Year in Review

X-post from +make.wordpress.org/playground: WordPress Playground: 2025 Year in Review

What’s new in Gutenberg 22.2 (03 December)?

“What’s new in 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/…” posts (labeled with the #gutenberg-new tag) are posted following every Gutenberg release on a biweekly basis, showcasing new features included in each release. As a reminder, here’s an overview of different ways to keep up with Gutenberg and the Editor.

What's new in Gutenberg 22.2

Gutenberg 22.2 has been released and is available for download!

A total of 161 PRs were merged in Gutenberg 22.2, with 4 first-time contributors! With WordPress 6.9 released this week, many contributors were focused on 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. fixes, performance, 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. editor polish, and a series of 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) and developer experience improvements. There are still some great features and enhancements in this release, highlighted below.

Table of contents

Cover block video embeds

A big feature in this release is the ability to use embedded videos (like YouTube or Vimeo) as background videos in the Cover block, rather than being restricted to locally uploaded files. This is a major quality-of-life improvement for those who want to offload video hosting and bandwidth. (73023)

Image

There’s further development on the experimental Breadcrumbs block. It now includes better handling for homepages, last item attributes, 404/search/archive pages, archive links, post type archive links, as well as support for paginated content. All of these additions are aimed at making breadcrumb navigation more robust and context-aware. (72832)(73249) (73283)(73435) (72905)

Image

Styling options for the Math block.

Gutenberg 22.2 adds style options to the Math block in Gutenberg, addressing the inconsistency where inline math inherits paragraph styling but display math blocks previously lacked their own styling controls (73544).

standard styling option added to the Math block

Other Notable Highlights

Button Block Pseudo-state Styling

Theme designers and developers can now style button states (hover, focus, active, and focus visible) directly within the theme.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., making it much easier to keep all design controls centralized and consistent. This reduces the reliance on custom CSSCSS Cascading Style Sheets. for things like button hover states. (71418)

{
    "styles": {
        "blocks":{
                "core/button":{
                    "color":{
                        "background":"blue"
                    },
                    ":hover":{
                        "color":{
                        "background":"green"
                        }
                    },
                    ":focus":{
                        "color":{
                        "background":"purple"
                        }
                    }
                }
            }
    }
}

Data Views Upgrades

Data Views received several improvements, including:

  • A new “activity layout” brings a timeline-like view, perfect for things like revision history, logs, or any content that benefits from a chronological display. This layout handles interactions—like keyboard navigation—in a way that fits the timeline format. (72780)
  • The table column 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. now lets you add columns to the left or right for better customization (72929).

Changelog

List of all the changes

Block Library

  • Breadcrumbs: Add archive link if enabled in posts. (72832)
  • Breadcrumbs: Add attachment handling. (73249)
  • Breadcrumbs: Add 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. for preferred 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 term per post type. (73283)
  • Breadcrumbs: Add post type archive link if it’s not the same as home URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org. (73435)
  • Breadcrumbs: Add support for paginated post content. (72905)
  • Cover: Add support for background videos as embeds. (73023)
  • Math: Enable styles options. (73544)
  • Tabs block: Improve store functionality. (73229)
  • Term Name, Term Count :Add example block previews. (73388)
  • [Button Block]: Add support for pseudo elements for the block and its variations on theme.json. (71418)

DataViews

  • Add insert left/right in table column header. (72929)
  • Apply background to DataViews wrapper. (73390)
  • DataForms: Add pattern validation. (73156)
  • DataForms: Update Email Control component to use envelope icon instead of a Symbol. (73184)
  • Field 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.: Add format to date field type. (72999)
  • Introduce activity layout. (72780)
  • Only apply hover styles when there are bulk actions. (73248)
  • Sticky elements inherit bg from container. (73240)
  • Theme: Add density support for surface padding. (73215)

Patterns

  • Add edit section to the list view instead of Ungroup. (73199)
  • Change the icon and label for pattern section to use the pattern icon and name. (73203)
  • Remove ungroup option for section blocks. (73183)
  • Sections: Remove hover outlines in outline mode. (73263)
  • Update pattern editing button labels. (73195)
  • contentOnly patterns: Mark patterns as contentOnly by adding metadata.patternName to the root block (patterns endpoint). (73375)

Block Editor

  • FontFamilyControl: Hard deprecate bottom margin. (73340)
  • Block Editor: Filter file input accept attribute based on upload_mimes. (73562)
  • Add cart icon. (73509)
  • templateLock: ContentOnly – support content block insertion. (73425)
  • RichText: Begin to support hiding richtext controls while having keyboard shortcuts available. (73181)
  • Add width block supports under dimensions. (71905)
  • Add text justify. (73201)

Bug Fixes

Block Library

  • Accordion Block: Trigger panel opening from URL hash or anchor link. (73357)
  • Accordion Item: Don’t use grid layout. (73501)
  • Accordion: add box-sizing:Border-box rule. (73507)
  • Fix block selection when navigation link ui is open. (73368)
  • Fix navigation 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.) entity binding. (73255)
  • Fix: Custom font size taking over fit text. (73241)
  • Fix: Stretch Text overflows into the padding area. (73327)
  • HTMLHTML HyperText Markup Language. The semantic scripting language primarily used for outputting content in web browsers. Block: Fix scrolling within the modal. (73506)
  • HTML Block: Remove editorStyles from HTMLEditModal. (73347)
  • Image block: Set img_srcset to avoid PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 7.4 or higher undefined var warning. (73453)
  • Math block: Fix accessibility. (73508)
  • Merge “Icon Size” and “Icon size” translationtranslation The process (or result) of changing text, words, and display formatting to support another language. Also see localization, internationalization. strings. (73325)
  • Simplify and improve navigation link creation flow. (73210)

DataViews

  • DataForm: Autofocus first input on panel view. (72322)
  • DataForm: Fix issue with array fields in layout panel. (73344)
  • Ensure primary actions are not wrapped in the list layout. (73333)
  • Field API format: Fix and use WordPress input. (73538)
  • Fields: Fix author field view when editing. (73482)
  • Fix alignment when viewing a DataView with table layout and non-default column alignment. (73398)
  • Open the filters from the column table consistently. (72998)
  • [DataForm]: The ModalContent component doesn’t properly check for fields validity – [#73330]. (73339)
  • Theme: Fix color ramp generation to avoid unmet contrasts. (73331)

Block Editor

  • Border Radius Control: Empty Values triggers unintended px unit conversion. (73324)
  • Drag and drop: Remove grab cursor for multi-selection. (73521)
  • Drag: Hide block tools popovers. (73539)
  • Stretchy text: Hide variations in Block Inspector (hack). (73238)
  • Styles Tab: Fix bug where contentOnly experiment forced it to always be displayed. (73534)
  • Disable Term Query blocks in Widgets Editor. (73449)
  • Comments Count and Comments Link: Ensures that the preview is displayed correctly in the StyleBook. (73213)

Global Styles

  • Preview Styles: Prevent leaked shadow due to blur. (73545)
  • Update generateGlobalStyles function to include variationStyles option. (73535)
  • Variations global styles: Replace useSetting with useStyle for fetching block variations. (73533)
  • Global Styles: Fix media upload permission check. (73503)
  • WP_Theme_JSON_Gutenberg: Preserve valid non-preset settings when KSES filters are active. (73452)

Components

  • Fix: Keep Guide close button visible on hover. (73220)
  • Normalize displayed dates to UTC time for DateTimePicker. (73444)
  • Try fixing full-screen modal height so contents can scroll. (73150)

Block bindings

  • Error handling for external sources. (72585)
  • Fix coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress./term-data source bug, refactor, add unit testunit test Code written to test a small piece of code or functionality within a larger application. Everything from themes to WordPress core have a series of unit tests. Also see regression. coverage. (73366)
  • Move computation of sources into dedicated useSelect. (72974)

Interactivity API

  • iAPI: Fix using getServerContext in derived state getters. (73518)
  • iAPI: Return a deep-clone object from getServerState and getServerContext functions. (73437)

Collaboration

  • Notes position alignment in HTML. (73046)
  • Notes: Collapse note on blur. (73158)
  • Notes: Fix warning in comment content check. (73198)

Patterns

  • Check for prevent default on event to enable media placeholder button. (73564)
  • contentOnly patterns: Fix lock icon appearing on toolbar when editing a section. (73457)

Block API

  • Block Support: Change block visibility support key. (73432)

Layout

  • Prevent empty contentSize and wideSize values ​​from being saved. (73281)

Accessibility

  • Fix a11yAccessibility 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) of descriptions and alerts for “Invalidinvalid A resolution on the bug tracker (and generally common in software development, sometimes also notabug) that indicates the ticket is not a bug, is a support request, or is generally invalid.” Nav Items. (73177)

DataViews

  • Add grid keyboard navigation. (72997)
  • Make DataViews table checkbox permanently visible. (73245)

Performance

  • Remove some modal subscriptions when inactive. (73014)
  • Theme: Simplify ramp object by flattening warnings to optional top-level property. (72942)

Experiments

  • Add experimental abilities and workflow palette and move abilities API. (72703)
  • Lazy Editor: Fix Media Library loading. (73176)
  • Lazy Editor: Fix script modules loading. (73237)
  • Navigation Route: Add initial list and edit routes. (73259)
  • Refactor: Make WordPress abilities a script module instead of a global. (73364)
  • Routing: Add init modules. (73284)
  • Routing: Add pattern routes. (73317)
  • Routing: Add styles page as a route. (73197)
  • Routing: Add template part route. (73303)
  • Routing: Extract route package. (73191)
  • Routing: Support canvas clicks. (73348)
  • Styles Route: Allow switching between stylebook and homepage. (73253)

Patterns

  • ContentOnly Patterns experiment: Add content only inspector fields. (71730)
  • ContentOnly mode: Exclude template parts for now. (73332)
  • Routes: Small fixes to the pattern list and template part list routes. (73520)

Templates API

  • Add template route to the new site editor infrastructure. (73525)
  • Template Route: Add the ‘add new template’ button. (73542)
  • Template Activation: Rename gutenberg_get_block_template. (73582)
  • Template Activation: Use string IDs when experiment is off. (73585)

Block Library

  • Disable TinyMCE: Polish refresh message. (73485)
  • contentOnly Patterns experiment: Add content only support again for template parts. (73419)

DataViews

  • Routing: Preload routes properly. (73384)
  • Add experiment flag for Customizable Navigation Overlays. (73356)

Media

  • Reuse mediaUpload filter for new media modal by wrapping it in a class component. (73225)

Documentation

  • DataViews: Combine duplicate “enhancements” grouping in changelog. (73227)
  • DataViews: Update documentation for layout prop. (73470)
  • Docs: Use consistent content formatting for experimental packages. (73212)
  • Field API docs: Improve Edit. (73202)
  • Field API: Document missing props. (73515)
  • Field API: Update documentation for operators. (73523)
  • Field API: Update documentation to better communicate field types. (73349)
  • Update Gutenberg Version for WordPress 6.9. (72925)
  • Update dataviews readme with new pickerTable layout. (73372)
  • Update undestanding-global-state-local-context-and-derived-state.md. (73233)

Code Quality

  • Asset Loader: Load all scripts in body (footer). (73584)
  • Core Data: Update Attachment type to more accurately reflect fields in media API responses. (73223)

Patterns

  • Content only block experiment: Blocks provide the form. (73479)
  • ContentOnlyControls: Refactor to use DataForm. (73374)
  • Resolve_pattern_blocks sync with Core patchpatch A special text file that describes changes to code, by identifying the files and lines which are added, removed, and altered. It may also be referred to as a diff. A patch can be applied to a codebase for testing.. (73570)

DataViews

  • Field API: Simplify field normalization. (73387)
  • Field API: Simplify normalization. (73546)
  • Revert “[DataForm]: The ModalContent component doesn’t properly check for fields validity – [#73330]”. (73367)

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

  • Command Palette: Backportbackport A port is when code from one branch (or trunk) is merged into another branch or trunk. Some changes in WordPress point releases are the result of backporting code from trunk to the release branch. changes in core. (73567)

Components

  • Storybook: Replace implicit actions with explicit ones. (73502)

Block bindings

  • Make core/post-data source code more semantic. (73394)

Collaboration

  • Notes: Ignore flood and duplicate checks. (73232)

Block Library

  • Deprecate Pullquote Block. (73228)

Tools

  • Project: Add CODEOWNERS entries for ui and theme packages. (73369)
  • Update codeowners for packages/dataviews. (73204)

Build Tooling

  • Add missing package dependencies. (73258)
  • Build: Fix CSS rebuilds. (73380)
  • Build: Make pages building using the routing infrastructure independent of Gutenberg. (73379)
  • Build: Moment-timezone shouldn’t be a mandatory dependency. (73352)
  • Exclude JSJS JavaScript, a web scripting language typically executed in the browser. Often used for advanced user interfaces and behaviors./TS test files from build. (73495)
  • Framework: Sync lockfile changes under Node.js v24 build. (73314)
  • Scripts: Improve handling of check-licenses for optional dependencies. (73026)

Testing

  • Block Bindings: Add unit test coverage for core/post-data source. (73055)
  • Block Bindings: Remove end-to-end test theme. (73209)
  • Unit testing: Allow Composer to auto-detect PHP version. (73358)
  • end-to-end Tests: Remove movie CPTs after block bindings tests. (73235)
  • end-to-end Tests: Skip flaky list view test. (73234)

Various

  • UIUI User interface: Remove shorthand prop options from Box component. (73529)

Collaboration

  • Notes: Improve delete confirm message for replies. (73173)
  • Update button label from “Add new note” to “Add new reply”. (73189)

Templates API

  • Template activation: Move php files. (73402)

Block Library

  • contentOnly patterns experiment: Make the Inspector fields key a private API. (73376)

Patterns

Double-click on pattern to edit pattern. (73268)

First-time contributors

The following PRs were merged by first-time contributors:

  • @PaulAsaf2: Update undestanding-global-state-local-context-and-derived-state.md. (73233)
  • @RoyHridoy: Fix: Keep Guide close button visible on hover. (73220)
  • @triple0t: Dataforms: Update Email Control component to use envelope icon instead of atSymbol. (73184)
  • @xristos3490: Fix alignment when viewing a DataView with table layout and non-default column alignment. (73398)

Contributors

The following contributors merged PRs in this release:

@aaronrobertshaw @adamsilverstein @aduth @andrewserong @annezazu @anomiex @audrasjb @bph @cbravobernal @DAreRodz @ellatrix @felixarntz @getdave @gigitux @harshbhonsle @hbhalodia @jameskoster @jasmussen @jeryj @jorgefilipecosta @jsnajdr @karthick-murugan @luisherranz @MaggieCabrera @Mamaduka @mcsf @mikachan @mikejolley @mtias @ntsekouras @oandregal @ockham @PaulAsaf2 @priethor @ramonjd @RoyHridoy @ryanwelcher @scruffian @senadir @shimotmk @simison @SirLouen @t-hamano @talldan @tellthemachines @triple0t @tyxla @xristos3490 @youknowriad

Props to @annezazu and @matveb for reviewing this post, and @joen for the visual assets!

#block-editor, #core-editor, #gutenberg, #gutenberg-new

Summary, Dev Chat, December 3, 2025

Start of the meeting in 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/., facilitated by @benjamin_zekavica 🔗 Agenda post.

Announcements 📢

WordPress 6.9 is now available!

WordPress 6.9 is now available for download. Huge thanks to all contributors who made this release possible. 

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/ 22.2 has been released!

Gutenberg 22.2 has been released and is available for download!

Discussions 💬

Clarify wording for the Version field in TracTrac An open source project by Edgewall Software that serves as a bug tracker and project management tool for WordPress.

@SirLouen pointed out that the Handbook currently says the Version field shows when a 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. was “discovered.” @joedolson noted this can be confusing, and most agreed it should show the version where the bug was introduced.

@jorbin has updated the Handbook, and everyone is welcome to update any other places in the Handbook where the old wording still appears.

#6-9, #core, #dev-chat

Dev Chat Agenda – December 3, 2025

The next WordPress Developers Chat will take place on Wednesday, December 3, 2025, at 15:00 UTC in the core channel on Make WordPress Slack.

The live meeting will focus on the discussion for upcoming releases, and have an open floor section.

The various curated agenda sections below refer to additional items. If you have ticketticket Created for both bug reports and feature development on the bug tracker. requests for help, please continue to post details in the comments section at the end of this agenda or bring them up during the dev chat.

Announcements 📢

WordPress 6.9 is now available!

WordPress 6.9 is now available for download. Huge thanks to all contributors who made this release possible. 🎉

Discussions 💬

The discussion section of the agenda is for discussing important topics affecting the upcoming release or larger initiatives that impact the CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. Team. To nominate a topic for discussion, please leave a comment on this agenda with a summary of the topic, any relevant links that will help people get context for the discussion, and what kind of feedback you are looking for from others participating in the discussion.

Clarify wording for the Version field in TracTrac An open source project by Edgewall Software that serves as a bug tracker and project management tool for WordPress.

@SirLouen suggests updating the Handbook wording. The current description says the Version field reflects the version where a 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. was “discovered”, which may be misleading. Proposed change: use “introduced” for improved clarity. See Reference.

Open floor  🎙️

Any topic can be raised for discussion in the comments, as well as requests for assistance on tickets. Tickets in the milestone for the next major or maintenance release will be prioritized.

Please include details of tickets / PRs and the links in the comments, and indicate whether you intend to be available during the meeting for discussion or will be async.

#6-9, #agenda, #core, #dev-chat

WordPress 6.9 Release Candidate 4

The forth 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). (“RC4”) for WordPress 6.9 is ready for download and testing!

This version of the WordPress software is under development. Please do not install, run, or test this version of WordPress on production or mission-critical websites. Instead, it’s recommended that you evaluate RC4 on a test server and site.

Reaching this phase of the release cycle is an important milestone. While release candidates are considered ready for release, testing remains crucial to ensure that everything in WordPress 6.9 is the best it can be.

You can test WordPress 6.9 RC4 in four ways:

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-partyInstall and activate the WordPress Beta Tester plugin on a WordPress install. (Select the “Bleeding edgebleeding edge The latest revision of the software, generally in development and often unstable. Also known as trunk.” channel and “BetaBeta A pre-release of software that is given out to a large group of users to trial under real conditions. Beta versions have gone through alpha testing in-house and are generally fairly close in look, feel and function to the final product; however, design changes often occur as part of the process./RCrelease 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). Only” stream).
Direct DownloadDownload the RC4 version (zip) and install it on a WordPress website.
Command LineUse the following WP-CLI command: 
wp core update --version=6.9-RC4
WordPress PlaygroundUse the 6.9 RC4 WordPress Playground instance to test the software directly in your browser without the need for a separate site or setup.

The scheduled final release date for WordPress 6.9 is December 2, 2025. The full release schedule can be found here. Your help testing RC versions is vital to making this release as stable and powerful as possible. Please continue checking the Make WordPress Core blog for 6.9-related posts in the coming weeks for more information.

What’s in WordPress 6.9 RC4?

Get a recap of WordPress 6.9’s highlighted features in the Beta 1 announcement. Take a look at the WordPress 6.9 Field Guide. For more technical information related to issues addressed since RC3, you can browse the following links:

The following updates have been addressed since RC3:

  • #64305: Hidden async-upload field marked as required causes publishing to fail in the editor.
  • #64315: Running _wp_cron() during shutdown breaks sites using ALTERNATE_WP_CRON.
  • #64269: “Remove” button in Media Library gallery has a UIUI User interface styling issue.
  • #41604: 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/. incorrectly returns success instead of an error when updating a non-existent setting.
  • Ability to Hide blocks

How you can contribute

WordPress is open sourceOpen Source Open Source denotes software for which the original source code is made freely available and may be redistributed and modified. Open Source **must be** delivered via a licensing model, see GPL. software made possible by a passionate community of people collaborating on and contributing to its development. The resources below outline various ways you can help the world’s most popular open source web platform, regardless of your technical expertise.

Get involved in testing

Testing for issues is crucial to the development of any software. It’s also a meaningful way for anyone to contribute. 

Your help testing the WordPress 6.9 RC4 version is key to ensuring that the final release is the best it can be. While testing the upgrade process is essential, trying out new features is equally important. This detailed guide will walk you through testing features in WordPress 6.9. For those new to testing, follow this general testing guide for more details on getting set up.

If you encounter an issue, please report it to the Alpha/Beta area of the support forums or directly to WordPress Trac if you are comfortable writing a reproducible 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. report.  You can also check your issue against a list of known bugs

Curious about testing releases in general?  Follow along with the testing initiatives in Make Core and join the #core-test channel on Making WordPress Slack.

Update your theme or plugin

For plugin and theme authors, your products play an integral role in extending the functionality and value of WordPress for all users.

Thanks for continuing to test your themes and plugins with the WordPress 6.9 beta releases. If you haven’t yet, make sure to conclude your testing and update the “Tested up to” version in your plugin’s readme file to 6.9.

If you find compatibility issues, please post detailed information to the support forum.

Test on your hosting platforms

Web hosts provide vital infrastructure for supporting WordPress and its users. Testing on hosting systems helps inform the development process while ensuring that WordPress and hosting platforms are fully compatible, free of errors, optimized for the best possible user experience, and that updates roll out to customer sites without issue.

Want to test WordPress on your hosting system? Get started with configuring distributed hosting tests here

Help translate WordPress

Do you speak a language other than English? ¿Español? Français? Русский? 日本語? हिन्दी? বাংলা? मराठी? ಕನ್ನಡ?  You can help translate WordPress into more than 100 languages. This release milestone (RC2) also marks the hard string freeze point of the 6.9 release cycle.

An RC4 haiku

Petals gently pause,
Perfect in their final form –
Waiting for release.

Props to @amykamala, @wildworks, @krupajnanda, @westonruter for proofreading and review.

#6-9, #development, #release

Ability to Hide Blocks in WordPress 6.9

WordPress 6.9 now includes a built-in feature to hide blocks, making it easy to tuck content away without deleting it. You can now hide blocks: select a 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., click the ellipsis, and choose “Hide”. Hidden blocks are visually removed from the editor, and fully omitted from the published markup. Scripts and styles for hidden blocks are also omitted from the rendered page by default (see WordPress 6.9 Frontend Performance Field Guide for more details).

To unhide a block, open the List View, identify hidden blocks via the “Hidden” icon next to them, open the ellipsis menu again, and choose “Show”. You can also toggle Hide/Show from the keyboard: use Ctrl + Shift + H on Windows or Linux, + Shift + H on macOS.

How to disable the hide option

Because it is implemented as a standard 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. support flag, opting into or out of this capabilitycapability 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). aligns with the rest of the block supports.

The support is enabled by default for every block type except for a short list of coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. blocks. To disable the support selectively, hook into the block_type_metadata() filter, adjust the metadata, and update the supports.visibility flag:

function disable_block_visibility_support( $metadata ) {
	// Disable visibility support for the core/group block.
	if ( isset( $metadata['name'] ) && 'core/group' === $metadata['name'] ) {
		$metadata['supports']['visibility'] = false;
	}
	return $metadata;
}
add_filter( 'block_type_metadata', 'disable_block_visibility_support' );

For additional implementation details and history, see Gutenberg PR #71203.


Props to @joen for co-authoring the note.
Props to @westonruter, @ramonopoly for review.

#6-9, #dev-notes, #dev-notes-6-9

WordPress Importer can now migrate URLs in your content

Moving a WordPress site has always meant fixing countless broken URLs. The links still pointed to the old domain, the images didn’t load, and the cover blocks lost their background. Not anymore! WordPress Importer now migrates the URLs in your imported content.

A Real Example

Imagine you’re editor-in-chief of https://yummy-🍲-recipes.org/vegan — an imaginary cooking site with vegan recipes. Your reader base is growing, things are going well, but when you meet people in person, they find it difficult to type in that emoji. You decide to move to an all-ASCII domain: https://yummy-cooking-recipes.org/

Your first step is exporting the site content. You go to wp-adminadmin (and super admin), click the right button, export the xml file, and… what is it? Some posts have a really weird-looking markup. Is it because of that 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 you installed last week? Or the 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. editor work you contracted last month? You’re not sure. The markup is not wrong. It is valid HTMLHTML HyperText Markup Language. The semantic scripting language primarily used for outputting content in web browsers., and it renders well in every web browser. It’s just not what you’ve expected:

<!-- wp:cover {"url":"https://yummy-\uD83C\uDF7E-recipes.org/vegan/wp-content/uploads/photo.jpg","align":"left","id":761} -->
<div
	class="wp-block-cover"
	style="
		background-image: url(&#104;ttps:&#x2f;&#x2f;yummy-\u1f372-recipes.org&#x2f;vegan&#x2f;wp-content&#x25;2Fuploads%2Fphoto.jpg);
	"
>
	<div class="wp-block-cover__inner-container yummy-🍲-recipes.org/vegan/-cover">
		<img
			src="&#104;ttps://xn--yummy--recipes-vb87&#x6d;.org/vegan/wp-content/uploads/cover.jpg"
		/>

		<h1>Yummy Vegan Recipes!</h1>

		<p>You are on the official yummy-🍲-recipes.org/vegan site!</p>

		<p>
			Be careful – there is a phishing site you may mistake us for:
			extra-yummy-🍲-recipes.org/vegan/.

			Oh! And our email is: hello@yummy-🍲-recipes.org
		</p>
	</div>
</div>
<!-- /wp:cover -->

You sigh and think Well, that will take some work to adjust. The existing URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org rewriting tools, such as wp search-replace, will catch some URLs but miss most of them. They may alter the warning about the phishing site, which mentions a similar but distinct domain. And then you notice the last WordPress importer release.

WordPress importer now solves this exact problem!

You import your content on the new site with a bit of disbelief. Can it really get it right? You think. But you try it, and, after a brief moment, the import is finished with all the URLs correctly updated:

<!-- wp:cover {"url":"https://yummy-cooking-recipes.org/wp-content/uploads/photo.jpg","align":"left","id":761} -->
<div
	class="wp-block-cover"
	style="
		background-image: url(&quot;https://yummy-cooking-recipes.org/wp-content%2Fuploads%2Fphoto.jpg&quot;);
	"
>
	<div class="wp-block-cover__inner-container yummy-🍲-recipes.org/vegan/-cover">
		<img
			src="https://yummy-cooking-recipes.org/wp-content/uploads/cover.jpg"
		/>

		<h1>WordPress news!</h1>

		<p>You are on the official yummy-cooking-recipes.org/ site!</p>

		<p>
			Be careful – there is a phishing site you may mistake us for:
			extra-yummy-🍲-recipes.org/vegan/.

			Oh! And our email is: hello@yummy-🍲-recipes.org
		</p>
	</div>
</div>
<!-- /wp:cover -->

Isn’t that great?

Breaking down what the importer did

The WordPress importer knows the difference between a URL that needs migrating and an unrelated text that just happens to contain similar characters. Let’s take a closer look at the data migrationMigration Moving the code, database and media files for a website site from one server to another. Most typically done when changing hosting companies. we’ve just done.

These parts were migrated:

  • Domain encoded using punycode (xn--yummy--recipes-vb87m.org)
  • 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. with Unicode escapes (yummy-\uD83C\uDF7E-recipes.org)
  • HTML attributes with entities (src="https://xn--yummy--recipes-vb87&#x6d;.org/vegan/wp-content/uploads/cover.jpg")
  • CSSCSS Cascading Style Sheets. with Unicode escapes encoded as an HTML attribute (style="background-image: url(https://yummy-\u1f372-recipes.org/vegan/wp-content%2Fuploads%2Fphoto.jpg);")
  • URLs using %-encoding mixed with HTML entities (&#x25;2Fuploads%2Fphoto.jpg)

These parts stayed exactly as they were:

  • The CSS class yummy-🍲-recipes.org/vegan/-cover. The class name coincides with the domain, but it’s still a unique identifier defined in a stylesheet. Changing it would affect how the site is displayed.
  • The email address hello@yummy-🍲-recipes.org. In this migration, only the website domain changes. Old emails continue to work.
  • The reference to extra-yummy-🍲-recipes.org. It’s a different domain. It would be modified by a simple string replacement, but the WordPress importer recognizes the difference and preserves the original domain.

The WordPress importer parses each data format and encoding, respecting the syntactical nuances, and finds the raw URLs beneath all the layers. All of that happens during the import. The old URLs never make it to the database.

Under the hood, URL rewriting is powered by the new structured data parsers shipped in WordPress CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. and in the WordPress/php-toolkit repository. BlockMarkupUrlProcessor is the orchestra director coordinating the effort of multiple format-specific parsers such as WP_HTML_Processor, CSSProcessor, CSSURLProcessor, URLInTextProcessor, _wp_scan_utf8, and others.

Because the imported data doesn’t require post-processing, there’s no need to run the traditional UPDATE wp_post SET post_content=REPLACE(old_url, new_url, post_content) queries after the import. This is a big deal. Those queries might be just a minor inconvenience on a small site, but on larger sites, they could take days and lock the most important tables.

If you are interested in even more technical context, see the original Pull Request and the various resources linked in the description.

Try It Out

URL rewriting is available in WordPress Importer 0.9.5 out of the box. You only need to check the checkbox before starting the import:

Image

WP-CLI has an open Pull Request to support this feature.

If you’d like to try it out now, here’s a WordPress Playground demo that imports a content page similar to the example used in this post. You can inspect the imported markup and also go to wp-admin and try importing your own file.

Please share your feedback – it matters a lot! You can share your experience with WordPress Importer in the comments under this post. For any issues and feature requests, feel free to open an issue in the WordPress/wordpress-importer repository.

What’s next?

The WordPress importer improvement roadmap lists several more upcoming features to improve site migrations, such as support for importing large files, concurrent media downloads, or a direct WordPress-to-WordPress site synchronization. You can follow along and share your thoughts in the roadmap issue.

Props to @dmsnell for the major effort he put into the structured data parsers and all his guidance and feedback. Props to @zaerl for his help with reviewing WordPress-importer PRs. Props to @bph for the feedback that helped greatly improve the URL rewriting experience and also for reviewing this post.

X-post: Announcing the AI Experiments Plugin v0.1.0

X-comment from +make.wordpress.org/ai: Comment on Announcing the AI Experiments Plugin v0.1.0