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 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). 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 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).. 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

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)

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)

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

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-party.Install 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 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). 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:

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.

Summary, Dev Chat, November 26, 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 ๐Ÿ“ข

6.9ย 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).ย 3 is now available!

WordPress 6.9 Release Candidate 3 is now available for download and testing.
Further information you can find here.

6.9 Release Day Timeline Shift

Please note that the release preparation timeline for WordPress 6.9 has been adjusted.
A revised schedule is now in place, aligned with theย State of the Wordย onย December 2.
A detailed overview of the updated timeline isย available here.

6.9ย Dev Notesdev 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.

For more detailed information, see the following WordPress 6.9 Dev Notes:

Forthcoming releases ๐Ÿš€

6.9 Timeline

WordPress 6.9ย is planned forย December 2, 2025.

Call for Testingย 

The Test Team invitesย testing and feedbackย on the following upcomingย 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 features:

Discussions ๐Ÿ’ฌ

Browser Support Policy โ€“ Clearer Front-end vs. Adminadmin (and super admin) Rules

Recent issues, including #64266 and #64015, highlighted that itโ€™s not always clear which browsers need to be supported in the WordPress Admin and which ones should be supported on the front end. As block themes and FSE generate more front-end output, clearer guidance would help set expectations.

@joedolson will draft a proposal on the CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. blogblog (versus network, site) to gather broader feedback, with support from @desrosj.

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

6.9 Release Day Timeline Shift for State of the Word

Each and every WordPress release day is an acknowledgment of the collective efforts from every single contributor in the community that helped to make that release possible. The State of the WordState of the Word This is the annual report given by Matt Mullenweg, founder of WordPress at WordCamp US. It looks at what weโ€™ve done, what weโ€™re doing, and the future of WordPress. https://wordpress.tv/tag/state-of-the-word/. has historically also been festive in nature, calling out the broad accomplishments of the WordPress community over the course of the previous calendar year.

The 2025 State of the Word was planned around an idea: what better way to celebrate and honor the 6.9 release and the communityโ€™s accomplishments from 2025 than combining the two occasions? With that in mind, the event was moved to December 2.

While thatโ€™s exciting, thereโ€™s still another level: publishing the 6.9 release to the world during the event! This sets the stage for the ultimate celebration of the WordPress community to close out 2025.

Release Day Planning

Because the release process can take a few hours, getting the timing correct will take quite a bit more coordination than usual.

The event will begin at 20:00 UTC (12:00 PST) and the new targeted release time is 20:30 UTC (12:30 PST).

Keep in mind that things happen. While this is the ideal schedule, unforeseen problems can (and do) come up. The timeline has extra time built just in case something goes wrong within a specific step. This is meant as just a guide.

Pre Final Release

Because the goal is coordinating a specific release time, this checklist should be completed as far in advance as possible. For this release, as much of the list as possible should be completed just after the dry run.

Dry Run (-26 hours)

The dry run should occur 26 hours prior to the planned final release time. This allows a few hours to complete the necessary tasks before starting the 24 hour code freeze.

The list of tasks to perform for the dry run can be found in the Core Handbook.

Release Day

There are a few different checklists for release day: CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress., WordPress.org, Tell the World, and a post-release one.

Core Checklist

Here is the timeline for these tasks for the Core checklist:

TimingTaskAssignment
17:00 UTC (T-210m/3.5h)1. Triage report 40@ellatrix/@davidbaumwald
17:45 UTC (T-165m)2. Pin @committers to pause all committing.@akshayar/@amykamala
17:50 UTC (T-160m)3. Update the `about.php` page (if necessary)@ellatrix/@davidbaumwald
18:00 UTC (T-150m/2.5h)4. Verify `package.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.` is updated.@ellatrix/@davidbaumwald
18:05 UTC (T-145m)5. Verify `src/wp-adminadmin (and super admin)/includes/update-core.php`@ellatrix/@davidbaumwald
18:10 UTC (T-140m)6. No new default theme. Skip this step.NA
18:10 UTC (T-140m)7. Run unit tests.@ellatrix
18:20 UTC (T-130m)8. Run `npm run grunt prerelease`/check 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/ Actions.@davidbaumwald(Just confirming from the Dry run)
18:20 UTC (T-130m)8a. Run security tests.@davidbaumwald
18:35 UTC(T-115m)9. Update version in src/wp-includes/version.php@ellatrix
18:40 UTC (T-110m)10. Tag the release from the 6.9 branchbranch A directory in Subversion. WordPress uses branches to store the latest development code for each major release (3.9, 4.0, etc.). Branches are then updated with code for any minor releases of that branch. Sometimes, a major version of WordPress and its minor versions are collectively referred to as a "branch", such as "the 4.0 branch".@ellatrix/@davidbaumwald
18:45 UTC (T-105m)11. Create release packages via mc.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/@davidbaumwald
18:50 UTC (T-100m)12. Remind those 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/ that links should not be shared.@akshayar/@amykamala

WordPress.org Checklist

The following is the timeline for the WordPress.org checklist:

TimingTaskAssignment
18:55 UTC (T-95m)1. Check packages are showing at w.org/download/releases.@davidbaumwald
19:00 UTC (T-90m/1.5h)2. Unzip/untar packages/verify checksums.@davidbaumwald
19:05 UTC (T-85m)3. Test packages.All Party Attendees
19:35 UTC (T-55m)5. Bump versions in w.org files.@sergeybiryukov
19:40 UTC (T-50m)6. Update credits file (if necessary).@sergeybiryukov
19:45 UTC (T-45m)7. Build language packs.@sergeybiryukov
20:00 UTC (T-30m)State of the Word begins.NA
20:15 UTC (T-15m)Release contributors attending SoTW called on stage.NA
20:18 UTC (T-12m)Take the final screenshot of the downloads counter. (timing differs from the checklist to account for the time gap)@akshayar/@amykamala
20:20 UTC (T-10m)8. DeployDeploy Launching code from a local development environment to the production web server, so that it's available to visitors. to WordPress.org.@sergeybiryukov

Tell the World Checklist

The following is the timeline for the Tell the World checklist:

TimingTaskAssignment
20:25 UTC (T-5m)1. Publish the release video on WordPress.tv (if necessary)N/A
20:30 UTC (T+0m)2. Publish announcement on w.org/news and celebrate. ๐ŸŽ‰@akshayar/@amykamala
20:35 UTC (T+5m)3. Open an amplification request with Marketing.@akshayar/@amykamala
20:40 UTC (T+10m)4. Publish the HelpHub release page.@estelaris
20:45 UTC (T+15m)5. Update the WordPress Versions page.@estelaris
20:50 UTC (T+20m)6. Update the PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 7.4 or higher Compatibility page (link 6.9 row/column headers to .@desrosj
20:55 UTC (T+25m)7. Update the PHPUnit compatibility page.@desrosj

Post Release

The post release checklist can be handled on a less strict timeline as the event continues.

Summary

While each version of WordPress is released by a collection of contributors working synchronously around the globe, this is the first time a release will be published during an event with a specific release time being targeted. Please ask questions early and often to ensure everything is accounted for and everyone is on the same page. A little planning now will help get this right so the community can have lots of fun doing it.

Itโ€™s a wonderful opportunity to celebrate all the hard work thatโ€™s gone into this release both in person and from afar. Letโ€™s lean on each other, be kind, chip in where we can when we need to, and get 6.9 across the finish line!

Props @davidbaumwald, @annezazu, @sergeybiryukov, @johnbillion for post and timeline review.

#6-9

WordPress 6.9 Field Guide

Edit 11/25/25: The Miscellaneous Editor Changes developer note was published after the Field GuideField guide The field guide is a type of blogpost published on Make/Core during the release candidate phase of the WordPress release cycle. The field guide generally lists all the dev notes published during the beta cycle. This guide is linked in the about page of the corresponding version of WordPress, in the release post and in the HelpHub version page.. It has been added below.

Edit 12/15/25 The Adjacent Post Navigation Changes developer note was published after the Field Guide and has been added below.

This guide outlines major developer features and breaking changes in 6.9 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 400 Core Trac tickets included in WordPress 6.9, over 125 of which are enhancements and feature requests, and more than 250 bug fixes. This release includes 35+ tickets focused on the Editor, 15 tickets focused on wp-admin, and over 45 tickets focused on performance.

Additionally, this release includes 440 enhancements and more than 570 bug fixes for 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, Site Editor, DataViews, and other related Core APIs.

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


Table of contents


New Ways to Collaborate

Creating and managing content with WordPress 6.9 is more versatile, with new tools and features that encourage collaboration and increase the ease of use. Users can now add notes to blocks, and can take advantage of optimized DataViews and a command palette implemented across wp-admin.

Notes

In WordPress 6.9 editors can write notes and reply to others directly at the individual block level, allowing teams to collaborate, track changes, and provide feedback during the editing process. Notes can be resolved, edited, deleted, and email notifications are sent to the post author when a new one is left.

Updates to 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., DataViews and DataForms Components

This release also comes with upgrades to the Field API as well as the DataViews and DataForms components.


In the Field API the field type has been expanded to include more than 10 new field types, 11+ edit controls that support validation, over 16 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. operators and user-input filters in filterBy, readOnly options to disable field editing, and so much more. Updated DataViews functions include improvements to modals and text-based actions, infinite scroll, and the ability to build custom layouts with children that leverage DataViewsโ€™ internal state management and data handling logic. DataViews also now persists via @wordpress/views while DataForms now has an improved panel, new card and row layouts, and revamped controlled validation.

Improved Editing Tools and Architecture

WordPressers can now drag and drop blocks more easily, hide blocks with a click, and use the new WP_Block_Processor class to convert documents into a block structure, while page architecture is improved with the continued integration of iframes.

Direct Drag and Drop

Drag and drop has been improved, with the ability to directly move blocks around within the site editor instead of a drag chip, for a faster, easier, and more intuitive editing experience.

Ability to Hide Blocks

WordPress 6.9 allows editors to hide and reveal blocks with a simple click.

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. Integration in Post Editor

As part of an ongoing initiative to move the post editor into an iframe, a few changes have been made to help with this transition:

  1. The block.json schema now only allowsapiVersion 3 for new or updated blocks.
  2. A warning will be displayed in the browser console when a block is registered usingapiVersion 1 or 2.ย 

These changes aim to help developers migrate their blocks to use apiVersion 3 with the plan to fully place the editor within an iframe in WordPress 7.0. While this change has been researched and tested at length, additional testing is needed by block and 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 to make any necessary improvements in future releases.

Streaming Block Parser

WordPress 6.9 includes a new WP_Block_Processor tool for scanning block structure in HTMLHTML HyperText Markup Language. The semantic scripting language primarily used for outputting content in web browsers. documents. The new class walks through the document to analyze or adjust the block structure while showing a structural view without affecting text, converting documents into a nested array of block information and parsed 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. attributes.

New Blocks and Block Improvements

An expanded block library with new and upgraded blocks is bundled into 6.9, which includes a new math block, new accordion block, terms query block, comments link and comments count blocks, and improved heading and time to read blocks. This release also contains modified text editing abilities with fitText block support that enables automatic font size adjustment to fit text within its container boundaries (and much more).

Perform Calculations using ฯ€ in the Math Block

The new Math block adds support for MathML and LaTeX renderers to display math in either block or inline mode, which can be added in any rich text field including tables, headings, and lists.

Collapsible Content with the new Accordion Block

The new Accordion Block in 6.9 supports custom styling and pattern 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).. Learn how to style accordion blocks here.

Heading Block CSSCSS Cascading Style Sheets. Specificity Fix

6.9 includes a refined CSS selector for padding in headings that have a background, which now targetsย headings with both.wp-block-heading and.has-background classes to ensure padding customizations affect only the intended block.

New & Improved APIs

Meet the Abilities API

The Abilities API enables WordPress Core, plugins, and themes to register their functionality in a unified, standardized, machine-readable format. The Abilities API is part of the broader AI Building Blocks for WordPress initiative to build the tools needed for extenders to integrate AI tools into WordPress in a native way.

Updates to Interactivity API

In WordPress 6.9 the Interactivity API now offers a standardized way to assign unique IDs to Interactivity API directives, allowing website elements to be given multiple similar directives without conflicts. The getServerState() and getServerContext() functions have been updated, and a new algorithm optimizes script and stylesheet handling, enhanced support for router regions in interactive elements, and adds a new attachTo property that acts as a CSS selector pointing to the parent element for router rendering.

Updates to HTML API

The HTML API has been refined in 6.9, with multiple 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 and enhancements. The WP_HTML_Processor::serialize_token()is now public, extending the safety of the HTML API to outside code modifying and combining HTML, while set_modifiable_text() now rejects SCRIPT element contents that could disturb its normal closing.

Improved Block Binding API

The updated Block Bindings interface in 6.9 focuses on usability, with the added ability to switch between sources, and bind or unbind attributes with a single click, while the new block_bindings_supported_attributes_{$block_type}filter facilitates customizing how a blockโ€™s attributes connect to a Block Bindings source.

Optimized Performance

WordPress 6.9 delivers significant performance improvements designed to improve the site loading experience for visitors. Improvements to LCP (Largest Contentful Paint) metric are achieved by implementing on-demand block styles for classic themes, minifying block theme styles, and increasing the limit for inline stylesโ€”all of which reduce render blocking. The critical rendering path is decongested by deprioritizing non-critical scripts (e.g. for interactive blocks and emoji detection) which had competed with loading resources like the LCP elementโ€™s image. Page stability is also improved by preventing the Video block from causing layout shifts.

Many other enhancements are shipped, such as optimized database queries, improved caching, better spawning of WP Cron, and a new template enhancementenhancement Enhancements are simple improvements to WordPress, such as the addition of a hook, a new feature, or an improvement to an existing feature. output buffer which opens the door for many future optimizations which were previously impossible.

Modernizing UTF-8 Support

A new fallback pipeline written in PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 7.4 or higher enables WordPress 6.9 to process text encoding and UTF-8 handling independently of the running environment, bringing more reliability across WordPress environments and for themes and plugins that work with international content, emojis and the like.

Updated Query Cache Handling

The 6.9 release changes how cache keys are created when caching queries performed through WP_Query. While persistent object cache drop-ins should not be affected, developers and web hosts should make note of the changes and take advantage of the four new functions introduced.

Remove Support for Loading Assets Conditionally for IE

WordPress 6.9 removes support for enqueing scripts and styles with legacy conditional statements that target specific versions of Internet Explorer conditional. All remaining related checks have also been removed from the default themes, an effort that began in #56699. The code related to Genericons has also been updated for themes that included this webfont.

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) Updates

WordPress 6.9 includes 10 enhancements and 23 bug fixes focused on accessibility, offering new and improved screen reader notifications, improved semantics and focus management, and updated CSS generated content to prevent excess content from being read.

PHP 8.5 Support

WordPress 6.9 has added โ€œ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. supportโ€ for PHP 8.5, addressing all known incompatibilities, warnings, and notices while maintaining support for older PHP versions (currently 7.2 and up). As a reminder, โ€œBeta supportโ€ is a label applied to versions of PHP that have less than 10% usage across all WordPress sites.

Miscellaneous Developer Changes

A range of additional developer-related updates improve both the user experience and the development experience. These changes span various areas of WordPress Core, including media, 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, new 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., and browser interactions. While individually minor, they collectively reflect ongoing efforts to enhance usability in WordPress and provide a more predictable and flexible foundation for developers.

Miscellaneous Editor Changes

The 6.9 release also brings a number of miscellaneous developer-focused changes within the Block Editor. Be sure to read 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. so youโ€™re up to speed!

Updated Adminadmin (and super admin) Menu Search Query

In WordPress 6.9, the search query used by the admin menu has changed from $_SERVER['QUERY_STRING'] to $_GET. This makes the search behavior more predictable and avoids issues caused by depending on the raw query string. Extensions that override or inspect admin menu search behavior should review any assumptions about how the menu search value is retrieved.

Additional Support for HTTPSHTTPS HTTPS is an acronym for Hyper Text Transfer Protocol Secure. HTTPS is the secure version of HTTP, the protocol over which data is sent between your browser and the website that you are connected to. The 'S' at the end of HTTPS stands for 'Secure'. It means all communications between your browser and the website are encrypted. This is especially helpful for protecting sensitive data like banking information. in URLURL A specific web address of a website or web page on the Internet, such as a websiteโ€™s URL www.wordpress.org-escaping Functions

In WordPress 6.9, the esc_url(), esc_url_raw() and sanitize_url() functions can now be configured to prepend https:// to a URL that does not already contain a scheme by default when the first item in the $protocols array is 'https'.

Improved Email Handling and Inline Image Support

WordPress 6.9 introduces several updates that make the email system more reliable and more flexible for developers. The wp_mail() function now sets sender addresses in an extensibleExtensible This is the ability to add additional functionality to the code. Plugins extend the WordPress core software. way, protects encoding headers between calls, and leans more consistently on PHPMailer for content type handling. Many long standing bugs around 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. handling and message formatting have also been resolved.

This release also adds support for inline and embedded images in HTML emails, allowing developers to send richer message templates without relying on external image URLs. Email content that uses cid: based references can now render images directly inside the message, opening up cleaner options for branded notifications, transactional emails, and plugin generated workflows.

Adjacent Post Navigation Query Changes

SQL queries triggered by get_adjacent_post()functions have been updated in 6.9 as part of a bug fix. This change does change query handling in the Storefront theme and any themes that are a derivative of Storefront. Follow TracTrac An open source project by Edgewall Software that serves as a bug tracker and project management tool for WordPress. #64390ย for more details.

PHP AI Client

The new PHP AI Client SDK facilitates integration of AI abilities with plugins and PHP projects. The interface works with all AI providers, and developers can specify which AI abilities to include, which provider, and which model to use. Credentials are centrally managed and work across all compatible plugins.

MCP Adapter

The new MCP Adapter utilizes Model Context Protocol (MCP) to standardize the applicationโ€™s interactions with LLMs, expose abilities to AI assistants, and connect with other MCP servers. This allows WordPress to act as both server and client, registering its capabilities through the Abilities API for AI assistants to discover and use, while also integrating with other MCP servers, making it possible to leverage external AI tools within WordPress.

But wait, there is more!

6.9 offers so much more!ย  More than 250 bugs, 123 enhancements and feature requests, and 22 blessed tasks have been marked as fixed in WordPress 6.9.

Below are a few more to highlight:

  • Abilities API: Roadmap to WP 6.9: defining and deciding (AI-83)
  • Accessibility: Navigation block: fix submenu Escape key behavior (GB-69834)
  • Editor: Button Block: Add HTML Element selection in Advanced settingsย  (Accessibility) (GB-70139)
  • Editor: Enable the Command Palette everywhere in admin dashboard (GB-58218)
  • Editor: New block additions for the Block Library (GB-71026)
  • Editor: Toolbar: Adjust colors for dark mode supportย  (GB-66454)
  • General: Replace deprecated / non-standard CSS for speak and aural (accessibility) (GB-63603)
  • Global Styles: Move Randomize colors button to Edit Palette panel (GB-66169)

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 @desrosj, @jorbin, @sabernhardt, @joedolson, @priethor, @jeffpaul, @westonruter, @davidbaumwald, @akshayar, and @annezazu for review.

#6-9, #field-guide

Miscellaneous Editor Changes in WordPress 6.9

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. Variations: Haveย getActiveBlockVariationย fall back to default variation

WordPress 6.9 introduces aย small changeย to active block variation detection.

To understand what that change looks like, recall that a block variation can include anย isActiveย criterionย that will be used to determine if a given block instance matches the variation.

The change concerns the case in which none of theย isActiveย criteria of a block typeโ€™s variations match a given block instance. In this case, WordPress 6.9 will use the variation with theย isDefaultย propertyย set toย trueย as fallback, if any.

Two limitations apply:

  1. The variation with theย isDefaultย property is only used as fallback if it doesnโ€™tย alsoย include anย isActiveย criterion, as that would mean that the variation did not match that criterion (and thus cannot be assumed to be active).
  2. The fallback is only applied for theย blockย andย transformย scopes but not to theย inserter, as to not affect the block name displayed there.

In practice, the updated behavior should be consistent with usersโ€™ and developersโ€™ expectations, as theย isDefaultย variation is typically used to set a default block variation different from the โ€œvanillaโ€ block type.

Together with the improvements made to active block variation detectionย in WordPress 6.6ย , this change allows block authors to express the criteria for active block detection in a very succinct and 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.-only manner. For an example, see how these principles were applied toย rewrite Group block variations.

CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress.-data: Media Entity Deprecation

What is being deprecated?

In WordPress 6.9, theย @wordpress/core-dataย packageโ€™sย mediaย entity is being deprecated. This entity is usually accessed through a range of APIs:

  • Theย getMediaย andย getMediaItemsย selectors or resolvers.
  • Theย saveMediaย andย deleteMediaย actions.
  • Theย getEntityRecord,ย getEntityRecordsย and other selectors or resolvers when passed theย 'root'ย andย 'media'ย params (e.g.ย getEntityRecords( 'root', 'media' );).
  • Theย editEntityRecord,ย saveEntityRecord,ย deleteEntityRecordย and other actions when passed theย 'root'ย andย 'media'ย params (e.g.ย deleteEntityRecord( 'root', 'media', 123)).

These 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. calls will continue to work in WordPress 6.9, but will now log a deprecation message that recommends switching to a different signature.

Why is this being deprecated?

Theย mediaย entity was found to be duplicating another entity,ย attachment. This attachment entity is usually accessed through API calls likeย getEntityRecords( 'postType', 'attachment' );. These two entities both internally use theย mediaย 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/ endpoint and return results forย attachmentย post types.

The entity system maintains a cache of REST API data, and the two separate entity types result in two separate caches that might contain different states for the same data. If the caches become desynchonized, this can result in noticeable bugs where a user interface might show outdated data, or old data overwrites newer data when saved.

Various solutions for fixing this issue were explored, but the option that was found to be safest was to deprecate the media entity in favor of the attachment entity.

How to update your code to use theย attachmentย entity

Replacing API calls

The following code snippet shows some examples of how to update your API calls:

wp.data.select( 'core' ).getMedia( 123 ); // now deprecated
wp.data.select( 'core' ).getEntityRecord( 'root', 'media', 123 ); // now deprecated
wp.data.select( 'core' ).getEntityRecord( 'postType', 'attachment', 123 ); // recommended update

wp.data.select( 'core' ).getMediaItems(); // now deprecated
wp.data.select( 'core' ).getEntityRecords( 'root', 'media' ); // now deprecated
wp.data.select( 'core' ).getEntityRecords( 'postType', 'attachment' ); // recommended update

wp.data.dispatch( 'core' ).saveMedia( 123, { // ... media data } ); // now deprecated
wp.data.dispatch( 'core' ).saveEntityRecord( 'root', 'media', 123, { // ... media data } ); // now deprecated
wp.data.dispatch( 'core' ).saveEntityRecord( 'postType', 'attachment', 123,  { // ... media data } ); // recommended update

wp.data.dispatch( 'core' ).deleteMedia( 123 ); // now deprecated
wp.data.dispatch( 'core' ).deleteEntityRecord( 'root', 'media', 123 ); // now deprecated
wp.data.dispatch( 'core' ).deleteEntityRecord( 'postType', 'attachment', 123 ); // recommended update
Changes to theย captionย property when using theย getEditedEntityRecordย selector

When making an API call for the โ€˜editedโ€™ version of an entity record (e.g.ย getEditedEntityRecord( 'root', 'media', 123 )), the core data package converts theย captionย property to a string:

caption: "My image's caption"

The attachment entity doesnโ€™t perform the same processing, an API call likeย getEditedEntityRecord( 'postType', 'attachment', 123 )ย returns theย captionย in its object form:

caption: {
    raw: "My image's caption",
    rendered: "My image's caption"
}

Theย caption.rawย property corresponds to the string value that theย mediaย entity returns for theย caption.

When switching to the โ€˜attachmentโ€™ entity, some code may need to be updated to account for this difference.

Block Editor: Support passing updater function to setAttributes

Starting from WordPress 6.9, theย setAttributeย prop passed to a blockโ€™sย Editย component will now support an updater function as an argument.

The updater is a pure function; it takes only the current attributes as its argument and returns the updated attributes.

// Toggle a setting when the user clicks the button.
const toggleSetting = () =>
	setAttributes( ( currentAttr ) => ( {
		mySetting: ! currentAttr.mySetting,
	} ) );

// Append item to the list.
const addListItem = ( newListItem ) =>
	setAttributes( ( currentAttr ) => ( {
		list: [ ...currentAttr.list, newListItem ],
	} ) );

SelectControl: Moved class names to the component root

Theย SelectControlย componentโ€™s class assignments have been adjusted for better consistency with other form components, such asย TextControl. Both the default class name (components-select-control) and any custom class name passed via theย classNameย prop are now applied to the root element of the component, rather than to the internal element.

While this update does not alter the componentโ€™s behavior or visual design, custom CSSCSS Cascading Style Sheets. that previously depended on the inner structure may need to be updated.

Before:

<div class="components-base-control">
  <div class="components-base-control__field">
    <div class="components-flex components-input-base components-select-control my-custom-classname">
      <div class="components-flex-item">
        <label class="components-truncate components-text components-input-control__label">Label</label>
      </div>
      <div class="components-input-control__container">
        <select class="components-select-control__input"></select>
        <div aria-hidden="true" class="components-input-control__backdrop"></div>
      </div>
    </div>
  </div>
</div>

After:

<div class="components-base-control components-select-control my-custom-classname">
  <div class="components-base-control__field">
    <div class="components-flex components-input-base">
      <div class="components-flex-item">
        <label class="components-truncate components-text components-input-control__label">Label</label>
      </div>
      <div class="components-input-control__container">
        <select class="components-select-control__input"></select>
        <div aria-hidden="true" class="components-input-control__backdrop"></div>
      </div>
    </div>
  </div>
</div>

Registering custom social icons

WordPress 6.9 adds support for registering custom social icons to the Social Icons block. With this update, developers can create plugins to define new services and SVGs, and expose them to both the editor and frontend through block variations and PHPPHP The web scripting language in which WordPress is primarily architected. WordPress requires PHP 7.4 or higher filters. For styling, matching brand colors can be handled in CSS and loaded for both views.โ€‹

Example for Ko-fi variation:

registerBlockVariation('core/social-link', {
	name: 'kofi',
	title: 'Ko-fi',
	icon: (
		<SVG role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
			<Path d="M11.351 2.715c-2.7 0-4.986.025-6.83.26C2.078 3.285 0 5.154 0 8.61c0 3.506.182 6.13 1.585 8.493 1.584 2.701 4.233 4.182 7.662 4.182h.83c4.209 0 6.494-2.234 7.637-4a9.5 9.5 0 0 0 1.091-2.338C21.792 14.688 24 12.22 24 9.208v-.415c0-3.247-2.13-5.507-5.792-5.87-1.558-.156-2.65-.208-6.857-.208m0 1.947c4.208 0 5.09.052 6.571.182 2.624.311 4.13 1.584 4.13 4v.39c0 2.156-1.792 3.844-3.87 3.844h-.935l-.156.649c-.208 1.013-.597 1.818-1.039 2.546-.909 1.428-2.545 3.064-5.922 3.064h-.805c-2.571 0-4.831-.883-6.078-3.195-1.09-2-1.298-4.155-1.298-7.506 0-2.181.857-3.402 3.012-3.714 1.533-.233 3.559-.26 6.39-.26m6.547 2.287c-.416 0-.65.234-.65.546v2.935c0 .311.234.545.65.545 1.324 0 2.051-.754 2.051-2s-.727-2.026-2.052-2.026m-10.39.182c-1.818 0-3.013 1.48-3.013 3.142 0 1.533.858 2.857 1.949 3.897.727.701 1.87 1.429 2.649 1.896a1.47 1.47 0 0 0 1.507 0c.78-.467 1.922-1.195 2.623-1.896 1.117-1.039 1.974-2.364 1.974-3.897 0-1.662-1.247-3.142-3.039-3.142-1.065 0-1.792.545-2.338 1.298-.493-.753-1.246-1.298-2.312-1.298"/>
		</SVG>
	),
	attributes: {
		service: 'kofi',
	},
	isActive: ['service']
});

Filters and CSS support synchronization with the frontend output. For more comprehensive references and setup routines, see this Developer Blog post.โ€‹


Props to content authors @bernhard-reiter, @greenshady, @mamaduka, @talldanwp, @wildworks

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

#6-9