releases.shpreview
WordPress/WordPress Core Dev Notes

WordPress Core Dev Notes

Mon
Wed
Fri
JunJulAugSepOctNovDecJanFebMarAprMayJun
Less
More
Releases37Avg11/moVersionsv7.0 to v23.3

Few days ago we announced that WordPress and Gutenberg are upgrading to React 19. But soon after publishing a Gutenberg version with the upgrade (23.3.0) we discovered that many plugins that were built for the previous version of WordPress, with React 18, are incompatible with the new version and crash often.

While there are virtually no API changes between React 18 and 19, the runtimes turned out to be incompatible in unexpected ways. For example, many plugins bundle their own version of the react/jsx-runtime helper used to process JSX syntax, but the shape of the generated objects (elements) is different, and React 19 actively checks and rejects elements generated by the React 18 runtime.

We’ll have to devise a better, less naive and more incremental upgrade strategy. With ability to switch between React 18 and 19 with an experimental feature flag, and with a compat layer for already released plugins. In the meantime, we decided to revert back to React 18, and released the revert in Gutenberg 23.3.2. This gives us time and breathing room to think the new strategy through and test it thorougly. We continue to be committed to doing the upgrade in WordPress 7.1.

Client-side media processing is a progressive enhancement to WordPress’s existing server-based media pipeline. When a user uploads an image in the block editor, their browser decodes, resizes, and encodes all sub-sizes locally using the VIPS image processing library running in WebAssembly (via wasm-vips) before sending them to the server. Browsers that can’t handle the work silently fall back to the existing server-side path without user-visible errors.

The advantage of this approach is that we can provide a uniform, modern image processing experience across all WordPress sites without relying on server-side capabilities. The client-side pipeline supports modern formats (AVIF, WebP, HEIC, UltraHDR, JPEG XL), offering better compression, and more consistent resizing quality regardless of hosting environment. It also reduces CPU and memory load on the server during image uploads by offloading the work to capable devices.

The feature graduated from a Gutenberg experiment to a core Gutenberg feature during the 7.0 cycle and is now targeting WordPress 7.1 as a core capability.

With 7.1 on the horizon, the feature could use testing to help us shake out bugs, validate performance on real content and devices, and stress-test the new capabilities.

Tracking issues:

#76756 — Client Side Media iteration for WordPress 7.1

#74333 — Client Side Media iteration for WordPress 7.0 (previous cycle, closed)

What’s included in this round of testing

The 7.1 iteration tracked in #76756 builds on the 7.0 groundwork and adds several new capabilities. Highlights include improved format support, error handling and upload resilience.

A note on bundle size

Download weight and the lack of new capabilities was the biggest piece of feedback during the 7.0 cycle, so it has been a focus this iteration. Client-side processing now exceeds the format and quality capabilities of the best server-side setups, while loading less ahead of time than the 7.0 prototype

  • Nothing heavy loads up front. The WebAssembly image pipeline (wasm-vips and friends) is fetched on demand the first time a user uploads media – it is not part of the editor’s initial bundle.
  • New capabilities UltraHDR, HEIC and JPEGXL support, as well as the new GIF→video conversion feature, are all new capabilities and added minimal weight.

How to test

Please run through as many of the scenarios below as your environment allows, and report anything that looks wrong — slow, broken, unexpectedly falling back to server-side, visibly lower quality, etc. Test with the latest Gutenberg plugin and in a chromium browser for the feature to be active.

System and Browser Requirements
  • Non-Chromium browsers: Disabled by default because Firefox and Safari don’t support Document-Isolation-Policy. The HEIC canvas fallback still runs in Safari.
  • Low-memory devices: Devices reporting 2 GB of RAM or less are excluded.
  • 2g / slow-2g / Browsers sending the Save-Data header: Excluded because of the large worker download and increased upload bandwidth.
  • CSP restrictions: Sites with worker-src directives that don’t allow blob: fall back to server-side.

You can verify that the feature is active by checking window.__clientSideMediaProcessing in the browser console (should be true), or by looking for network requests to the sideload endpoint. You can also use this mini plugin to check the upload processing type (client or server) – it shows a label on the front end and adds a column to the Media library list view.

1. Baseline upload flow
  • Upload a handful of JPEGs, WebPs, HEICs, AVIFs, GIFs and PNGs (mix of sizes: ~500 KB, ~5 MB, and a >20 MB original) in the editor.
  • Confirm the Image block renders the uploaded image.
  • Verify all expected sub-sizes exist on disk.
  • Compare file sizes and visual quality to the same image uploaded using the media library (which uses server processing).
  • Test uploading avif, webp, heic, png (with various transparency and bit depths), and jpg files and confirm they are processed correctly.
2. HEIC (iPhone photos)
  • Upload a `.heic` image from an iPhone. Use your computer to do the upload (the iPhone’s uploader will automatically convert to JPEG before upload, so you won’t be testing the client-side features if you upload directly from the phone).
  • Confirm it is transcoded to a web format (JPEG/WebP/AVIF depending on your settings) and that sub-sizes are generated.
  • Confirm the original HEIC is also uploaded and preserved.
  • Confirm Portrait and Landscape HEICs work correctly.
  • Try a browser that lacks native HEIC decoding to verify the canvas fallback – see #76731 for browser support details.
3. Modern output formats (AVIF / WebP)
  • use the image_editor_output_format filter to output different formats from jpeg uploads.
  • test uploading avif, webp, heic, png (with various transparency and bit depths), and jpg files and confirm they are processed correctly according to the configured output format.
  • Upload a large JPEG and confirm sub-sizes are emitted in the configured format, including the -scaled variant.
4. Ultra HDR
  • Testable in #74873
  • Upload an Ultra HDR image (you can capture one on a recent Pixel or iPhone, or download samples from gainmap-js demos).
  • Confirm the gain map is preserved through resizing and that sub-sizes still render as HDR on a capable display/browser.
5. JPEG XL (JXL)
  • Testable in #77584.
  • Upload a `.jxl` image (sample gallery).
  • Confirm it is accepted and processed. Report any unexpected behavior.
6. Animated GIF → video
  • Ready to test once #76946 merges
  • Upload a large animated GIF.
  • Confirm it is converted to an MP4 or WebM (depending on implementation), and that the resulting block plays correctly in the editor and on the front end.
7. Batch and concurrent uploads
  • Drag-and-drop 10–20 images at once into the Image block or Media Library.
  • Watch for progress UI, confirm all uploads complete, and check timing against a baseline where client-side is disabled.
8. Resilience
  • Test in #76765.
  • Use browser dev-tools to simulate a slow/flaky network during a batch upload and confirm retry behavior.
  • Try to save a post mid-upload and confirm the editor prevents or defers the save #76973.
  • Upload something, then refresh mid-upload — confirm the editor recovers cleanly.
9. Fallback paths
  • Test in a browser that does not meet capability requirements (Safari, Firefox)
  • Confirm the upload succeeds via the server-side path without user-visible errors. The only signal should be a developer-console message.
10. Extensibility
  • If you maintain a media-related plugin (image optimizers, DAM integrations, custom workflows), try it against a site with client-side media enabled.
  • Exercise the new filters/actions from #74913 and report any gaps.
  • Test disabling Client-side media.
11. Low-powered devices
  • Test on a low-end laptop, older Chromebook, or mid-range phone.
  • Confirm that the capability detection correctly gates the feature off when the device is underpowered and that processing does not lock up the browser.

Questions & bugs

Please report bugs by opening issues on the Gutenberg repo tagged with [Feature: Client Side Media]. Or, leave questions or comments on the tracking issue.

Thank you

Client-side media is a substantial shift in how WordPress handles images, and it only ships well with real-world testing across the full diversity of WordPress sites, browsers, and devices. Every report helps!

Props

Thanks to @jorbin and @ozgursar for reviewing this post!

#call-for-testing, #media

v7.1

A new dedicated outreach effort is underway for WordPress 7.1 to ensure collaborative editing gets the collaborative testing it needs. Please join #collaborative-editing-outreach in WordPress Slack (steps to sign up here) if you:

  • Want to use collaborative editing on a regular basis.
  • Enjoy being an early adopter.
  • Feel comfortable using the latest version of the Gutenberg plugin.
  • Have the ability to participate through the 7.1 cycle (at least until 8/18/26).

Thanks in advance for helping shape the future of this feature.

Why now?

Collaborative features require an inherently collaborative way of testing. For the 7.0 cycle, a lot of time and effort was spent with more developer oriented testing, enterprise level testing, and deterministic testing with hosts. While incredibly useful, this effort broadens the scope of testing by bringing in passionate real-world early adopters across a range of hosting environments and backgrounds. For collaborative editing to truly succeed, it’s important to go beyond just getting stability, performance, and reliability right.

In running the FSE Outreach Program, I saw how powerful it was to have a dedicated space for folks to regularly interact with those building the feature for a faster feedback loop in the right direction. After the hard decision was made to remove collaborative editing from WordPress 7.0, the aim is that ahead of 7.1 the outreach program model provides enough structure to create meaningful feedback without being too overbearing or exclusive considering the timeframe. This was first discussed in #feature-realtime-collaboration before being brought to project leadership.

Who can join?

Anyone is welcome to join #collaborative-editing-outreach! Real Time Collaboration is included in the latest versions of Gutenberg, and can be enabled under `Settings > Writing` in the dashboard when the Gutenberg plugin is active.

It’s critical people from across different hosting environments and use cases are a part of this, from nonprofits to small businesses to newsrooms. If you have a large need for collaborative editing, enjoy sharing feedback, and are comfortable with using the latest Gutenberg plugin, this is an awesome way to contribute to the WordPress project. Test team badges will be given out at the end.

More about the effort

The aim is to engage passionate real-world early adopters across a spread of hosting environments in a dedicated slack channel throughout the release process to ensure a tight feedback loop for both bugs and feature requests. This will take a simple form: a dedicated slack channel (#collaborative-editing-outreach) where folks can get set up with collaborative editing, share ongoing feedback, and those working on the feature can open bugs/make fixes/share improvements/etc. Compared to the FSE Outreach Program, there won’t be ongoing themed calls for testing since they would end up being very repetitive. Instead, key updates will be shared in the slack channel to help inform folks as new fixes or features are added to give feedback on them. The latest updates for collaborative editing will be delivered through the Gutenberg plugin which is why using the latest version is a requirement for this channel. As discussed here, a featured plugin isn’t currently feasible.

Tied to this, outreach will be done to hosting companies to attempt to recruit participants for this outreach program. This is being done to help get as many different environments as possible represented.

Currently, @amykamala, @greenshady, and I will be acting as the small crew driving this forward in the slack channel, alongside the developers and designers working on this feature.

Questions? Comments? Concerns?

Please leave them below. Thanks for engaging.

Thank you to @amykamala @greenshady @maxschmeling for reviewing this post.

#7-1, #collaboration, #feature-real-time-collaboration, #gutenberg, #phase-3

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

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

The various curated agenda sections below refer to additional items. If you have ticket requests for help, please continue to post details in the comments section at the end of this agenda or bring them up during the dev chat.

Announcements

7.1 Development
General announcements

Discussions

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

Open floor

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

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

Props to @audrasjb for collaboration and review.

#7-1, #agenda, #core, #dev-chat

v23.3

“What’s new in 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 23.3?

Gutenberg 23.3 has been released and is available for download!

This release ships the new modal-based media editor as the default cropping experience, advances the experimental customizable WordPress dashboard with five new widgets and significant layout polish, and upgrades the editor to React 19. Responsive styles now extend to individual block instances, and Notes blocks gain support for multiple discussion threads. Other changes include DataViews adopting @wordpress/theme design tokens, accessibility refinements across the Revisions interface, continued Real-time Collaboration reliability fixes, and broader preload coverage for faster post editor loads.

Table of contents

  1. Media editor modal becomes the default crop experience
  2. Experimental customizable WordPress dashboard
  3. Responsive styles for block instance
  4. Other Notable Highlights
  5. Changelog
    1. Features
    2. Enhancements
    3. Bug Fixes
    4. Accessibility
    5. Performance
    6. Experiments
    7. Documentation
    8. Code Quality
    9. Tools
  6. First-time contributors
  7. Contributors

Media editor modal becomes the default crop experience

The Media editor modal replaces the existing inline cropping tool in the Block Editor. The modal pattern keeps the familiar Crop button entry point, and brings freeform and aspect-ratio cropping, flip, fine-grained and snap rotation, and metadata editing into one dedicated workflow. (78653)

Experimental customizable WordPress dashboard

Video

The experimental customizable WordPress dashboard — a widget-based surface available for testing behind an experimental flag in the Gutenberg plugin, allowing users to add, move, resize, and rearrange widgets. It introduces a complete set of widgets — Welcome, Quick Draft, Activity, Site Health, Site Preview, and more — that automatically adapt to different tile sizes. You can fully customize your dashboard by choosing which widgets to display, arranging the layout, adjusting the number of columns, and resizing each widget’s width and height. (77616)

This change is experimental; to give it a try, first go to WP-Admin > Gutenberg > Experiments and enable “New Dashboard experience”.

Responsive styles for block instance

Responsive styles for block instances (78384) building on 23.2’s responsive Global Styles, the Block Style States API extends to the per-instance level (76491). Block instance responsive styles include layout styles (78543) and an Inspector that shows only the relevant settings when a style state is selected. (78280) (78658, 78763, 78670, 78709)

Other Notable Highlights

  • Real-time Collaboration improvements — Notes blocks support multiple threads (75147), better handling of oversized payloads (>16 MiB) and connection-loss states (77724), protocol-mismatch error handling (76991), fewer refresh storms when peers edit (78483), and a mobile fix for Edit/Join row actions in the post list (78597).
  • DataViews adopts @wordpress/theme design tokens (75204) — the first significant in-codebase adoption of the design tokens package. A new “Introduction” Storybook page has been added for the tokens themselves (78449).
  • Accessibility wins — Image block gains a “Mark as decorative” toggle (78064); Revisions diff markers get higher-contrast stripes and scale with user text-size preferences (78473, 78273, 78393); Breadcrumbs block hides separators from screen readers (78524).
  • Performance — Optimized block-supports CSS class rendering (78217), lazy-fetched user pattern categories (78568), shared window listeners across block instances (78310), shared MediaQueryList listener in useMediaQuery (78297), and broader preload coverage on edit-post load (78508, 78565).
  • Components migrations — Continued migration of __experimentalText, __experimentalHStack, and __experimentalVStack to their stable @wordpress/ui counterparts (78155); Tooltip migration progressed across block-editor, editor, and DataViews consumers (78411, 78466, 78470).
  • React 19 upgrade (61521) — Gutenberg is now built against React 19. Most code keeps working unchanged; plugin authors using removed legacy patterns (string refs, ReactDOM.render fallbacks, defaultProps on function components) should review React’s upgrade notes.

Changelog

Features
Post Editor
  • Notes: Support multiple note threads per block. (75147)
Enhancements
Components
  • DataViews: Adopt @wordpress/theme design tokens. (75204)
  • Draggable: Scope the clone’s fallback z-index to non-slot placements. (78354)
  • Navigation: Hard deprecate component. (78529)
  • Overlays: Extend positioner slot pattern to Popover, Select, Autocomplete. (78168)
  • Tabs, TabPanel: Align styles with wp-ui. (78418)
  • Tooltip migration: Dataviews consumers (3/5). (78470)
  • UI Button: Optimize overflow styles. (78300)
  • UI Card: Full bleed as header hero image and content cover. (77856)
  • Visually align Notice from @wordpress/components with Notice from @wordpress/ui. (78231)
  • [components] Draggable: Migrate clone wrapper to wp compat overlay slot. (78183)
  • [ui] Add internal wp compat overlay slot helper. (77851)
  • [ui] Autocomplete: Default portal container to the wp compat overlay slot. (78375)
  • [ui] Select: Default portal container to the wp compat overlay slot. (78372)
  • [ui] Tooltip: Default portal container to the wp compat overlay slot. (78095)
  • design-system-mcp: Add server instructions for client usage guidance. (78186)
  • design-system-mcp: Update get_components to optionally support multiple names. (78185)
Block Editor
  • Add support for layout responsive styles. (78543)
  • Add support for pseudo states on single block instances. (76491)
  • Block Inserter: Animate inserter button icon to signal open state. (78306)
  • Hide block variation selector when style state is selected. (78658)
  • Hide wrap by default in flex layout panel. (78269)
  • Integrate slug-based color selection in color panel. (78048)
  • Migrate pattern list item titles to Text from @wordpress/ui. (77656)
  • Refactor: Add extractPresetSlug as a generalized function to extract slugs. (78328)
  • Tooltip migration: Block-editor + block-directory consumers (1/5). (78411)
  • Validate additional CSS on mount. (78682)
Block Library
  • Block Style States: Show only supported inspector controls when selecting a style state. (78280)
  • Columns: Remove redundant Skip option from layout picker. (78405)
  • Hide Cover overlay controls for viewport states. (78763)
  • Hide image dimension tools when a state is selected. (78670)
  • Home Link: Add missing controls. (76672)
  • Move Layout panel into Styles tab so it sits next to Dimensions. (77922)
  • Responsive block instance styles. (78384)
Post Editor
  • Collab Sidebar: Swap near-identical pink for red in avatar palette. (78299)
  • Media Editor: Make the modal the default crop experience. (78653)
  • RTC: Provide PROTOCOL_MISMATCH error handling. (76991)
  • Tooltip migration: Editor + edit-post + edit-site consumers (2/5). (78466)
Media
  • Image cropper: Round zoom control values and display as percentages. (78757)
  • Media Editor Modal: Update the rotation ruler to use a vertical line marker. (78704)
  • Media Editor: Remove resize handles toggle from crop panel. (78758)
Dashboard
  • Add custom widget dashboard resize handle styling. (78236)
  • Dashboard Widgets: Adapt Quick Draft to its tile size with a recent drafts list. (78572)
  • Widget dashboard: Skip tile hover elevation while resizing. (78234)
Font Library
  • Clarify active variant state in Library tab. (78501)
Guidelines
  • Refine access policy. (78296)
Connectors
  • Restyle AI plugin callout with pastel background and beak. (78243)
Client Side Media
  • Add dimension validation to sideload endpoint. (74903)
Data Layer
  • Upgrade to React 19. (61521)
Bug Fixes
Components
  • @wordpress/ui: Compat overlay slot — viewport-sized containing block. (78441)
  • DataViews: Fix wrapper height resolution in flex layouts. (76945)
  • DataViewsPicker Table: Fix first-click row selection. (78423)
  • Fix FormTokenField validation preventing default behavior. (77181)
  • IconButton: Fix focusableWhenDisabled default. (78526)
  • Popover: Don’t close when focus moves into the @wordpress/ui compat overlay slot. (78407)
  • UI Button: Fix disabled cursor style. (78479)
  • UI: Fix item popup typography. (78403)
  • UI: Update Autocomplete clear disabled state. (78520)
  • useCopyToClipboard: Always call onSuccess callback. (78387)
  • useDialog: Handle Escape via React onKeyDown so cascade works through portals. (78433)
Block Library
  • Block/Tabs: Fix editor dirty state on reload by removing unnecessary mount-time attribute init. (78339)
  • Breadcrumbs block: Hide separator from screen readers. (78524)
  • Fix ‘Invalid Date’ when clicking on Now in DateTimePicker on Date Block. (78284)
  • Fix Tabs block losing added tabs when the editor is reopened. (78250)
  • Fix: Discard unsaved HTML block changes on cancel. (78580)
  • Image: Preserve width/height when converting Classic blocks to blocks. (78610)
  • Navigation Link: Preserve custom labels during link updates. (77186)
  • Navigation: Restore block_core_navigation_submenu_render_submenu_icon() as deprecated shim. (78484)
  • Prevent images from appearing squished when only one dimension is set. (70575)
Post Editor
  • Editor: Disable Visual Revisions when classic meta boxes are present. (78249)
  • Editor: Fix Visual Revisions meta keys overlap. (78156)
  • Editor: Use _n() for revisions count aria-label. (78382)
  • Fix image upload crashes. (76707)
  • Fix: Register user-defined taxonomies after user-defined post types. (78497)
  • Fix: Show collaborators when the top toolbar is active. (78049)
  • Global styles revisions: Ensure stylebook shows revision previews. (78490)
  • Script Loader: Defer single-page admin init until DOMContentLoaded (Trac #65103). (78136)
  • Upload Media: Render srcset on the front end for client-side-media uploads. (78359)
Block Editor
  • Block Inspector: Hide Styles tab in preview mode. (78230)
  • Block Toolbar: Prevent position shifts when using mover control. (77798)
  • Fix inconsistencies in feature selector processing part 2: Pseudo block instances. (78326)
  • Fix: Properly merge schema during mergeSchemas part in getBlockContentSchemaFromTransforms. (70615)
  • List View: Place caret at end of block when selecting. (76797)
  • Reset zoom level on component unmount. (69087)
  • Unset grid span defaults with viewport states enabled. (78709)
Data Layer
  • Core Data: Avoid duplicate ID-less entity permission requests. (78262)
  • Fix: Disable collab sync when incompatible meta boxes are present. (78145)
  • RTC: Fix cursor awareness / presence bug in nested rich text elements. (77673)
  • RTC: Fix block refresh on every update when a peer edits within the code editor. (78483)
  • RTC: Sync the content even if it’s a function. (76796)
  • Real-time Collaboration: Use minimal save payload in persistCRDTDoc. (77050)
Media
  • Media Editor Modal: Only show the crop active state when using keyboard. (78266)
  • Media Editor: Anchor cursorless zoom (slider/keyboard) at crop center. (78385)
  • Media Editor: Enforce a minimum crop size in the image editor. (78268)
  • Media Editor: Scope keyboard shortcuts to the modal. (78322)
  • Media Fields: Fix filename truncation with Tooltip. (78453)
Collaboration
  • RTC: Fix Edit/Join row action invisible on mobile in post list. (78597)
  • RTC: Fix connection lost error modal when /wp-json/wp-sync/v1/updates exceeds 16 MiB limit. (77724)
Global Styles
  • Fix block preview for responsive style states. (78538)
  • Fix inconsistencies in feature selector processing part 1: Global styles. (78276)
Client Side Media
  • Upload Media: Stop propagating -scaled to sub-size filenames. (78038)
  • VIPS: Remove dead batchResizeImage and vipsBatchResizeImage exports. (77975)
Paste
  • Keep <img> inside <a> when pasting plain-text HTML. (78015)
Testing
  • Tests: Temporarily disable REST index output-format assertions pending Core fix. (78788)
Accessibility
Post Editor
  • Image Editor: Focus return after closing image crop modal. (78711)
  • Revisions: Increase diff marker stripe contrast to 75% primary color proportion. (78473)
  • Revisions: Scale diff markers width with user text-size preference. (78273)
  • Revisions: Use CSS outline as secondary non-color indicator for diff blocks. (78393)
Block Library
  • Image block: Add “Mark as decorative” toggle for accessibility. (78064)
  • Image: Fix missing aria-label on lightbox trigger button for single images. (78426)
Performance
  • Block supports: Optimize custom CSS class rendering and parsing. (78217)
  • Fix performance tests when running against old reference commit. (78288)
Post Editor
  • Edit Post: Hoist setupEditor to run before root.render. (78581)
  • Edit Post: Consume preload cache before React mount. (78508)
  • Editor / Block Editor: Lazy-fetch user pattern categories. (78568)
  • Post Taxonomies: Drop redundant per_page: -1 from taxonomy queries. (78569)
Components
  • Blocks: Share window listeners across instances (block props, rich text, …). (78310)
  • Compose: Share a single change listener per MediaQueryList in useMediaQuery. (78297)
  • Compose: Simplify subscribeDelegatedListener root detection. (78492)
Data Layer
  • Core Data: Share parsed blocks cache between resolver and editor hook. (78026)
  • Edit Post Preload: Cover remaining bound GET/OPTIONS requests on load. (78565)
Commands
  • Core Abilities: Defer fetch until workflow palette opens. (78316)
Experiments
Dashboard
  • Add Quick draft widget. (78408)
  • Add chrome UI tools to widgets. (78060)
  • Add command palette commands. (78429)
  • Add dashboard Activity widget. (78552)
  • Add dashboard News widget. (78554)
  • Add dashboard Site Health widget. (78555)
  • Add dashboard Site Preview widget. (78556)
  • Add elevation to widget actionable area. (78563)
  • Add missing package file to the Site Preview widget. (78583)
  • Add Welcome dashboard widget with adaptive layout and content. (78461)
  • Add tooltip explaining disabled menu item. (78344)
  • Contain widget body within its tile to prevent page overflow. (78627)
  • Dashboard Widgets: Add content-bleed presentation variant. (78491)
  • Fix widget rendering on the masonry grid. (78645)
  • Full-size widget inserter. (78390)
  • Grid: Animate sibling tiles when layout reflows during drag or resize. (78395)
  • Grid: Animate tile removals. (78542)
  • Grid: Don’t allow resizing tile beyond min row height or column width. (78402)
  • Grid: Hide resize handles and actions while a tile is resizing. (78391)
  • Grid: Make resize overlay line solid. (78340)
  • Grid: Resize widget and snap resize-placeholder. (78389)
  • Grid: Tiled grid overlay. (78373)
  • Increase widget spacing with --wp-grid-gap. (78439)
  • Layered grid columns and visual layout model picker. (78364)
  • Layout settings drawer with grid/masonry models. (78202)
  • Migrate Layout settings drawer to DataForm. (78336)
  • Mobile improvements. (78522)
  • Per-instance widget settings drawer. (78465)
  • Polish dashboard drag preview motion, elevation, and drop exit. (78348)
  • Prevent pointer events in widget selection. (78681)
  • Quick Draft widget: Layout, empty state, and style refinements. (78601)
  • Refine widget actionable area toolbar styling. (78578)
  • Restrict widget icons to just SVGs (no Dashicons). (78440)
  • Round widget drag radius. (78292)
  • Scale widget picker previews to fill their card. (78602)
  • Seed default layout with bundled widget instances. (78622)
  • Small changes to header. (78513)
  • Tune default grid settings and starter layout. (78633)
  • Use Page hasPadding prop for content spacing. (78469)
  • Use fully-specified fast-deep-equal import. (78660)
  • Welcome widget: Add a subtle shine to the version digits. (78626)
  • Welcome widget: Draw the version number in the banner. (78611)
  • Widget Types: Declarative presentation hint (full-bleed support). (78209)
  • Widget Types: Generic attribute schemas. (78247)
  • Widgets: Declare dependencies in a per-widget package.json. (78463)
Media
  • Extract media editor crop options hook. (78263)
  • Extract media editor save hook. (78225)
  • Media Editor Modal: Add custom datetime view for the sidebar to ensure minimal display of dates. (78265)
  • Media Editor Modal: Fix unexpected tab stop on date fields in the Details sidebar. (78454)
  • Media Editor Modal: Tighten labels for crop handles toggle. (78703)
  • Media Editor Modal: Try placing the save and cancel buttons in the footer. (78708)
  • Media Editor: Harden cropper math layer against non-finite inputs. (78321)
  • Media Editor: Make zoom floor coverage-aware instead of fixed at 1x. (78222)
  • Media editor: Show live crop dimensions during gesture. (78221)
  • Refactor media editor crop state into composite reducer. (78480)
Block Library
  • Classic Block: Use get_post() in wp_declare_classic_block_necessary. (78613)
  • Media: Add undo snackbar for media editor image edits. (78425)
  • Update Classic block deprecation notice. (78445)
Post Editor
  • Add default term for taxonomies. (78233)
  • Add experiment to show admin bar in Post and Site Editor. (77964)
  • Media Editor Experiments: Tidy up by removing old pathways to the media editor experiment. (78489)
Block Editor
  • Grid: Fix immutability lint warning for React hook. (78431)
  • Grid: Visualize columns without outline. (78281)
Documentation
  • Docs: Add Workspace Development guide. (78615)
  • Docs: Update iframe editor migration guide for WordPress 7.0/7.1. (78401)
  • Docs: Update media editor documentation. (78617)
  • Theme: Add Tokens “Introduction” Storybook page. (78449)
  • Theme: Move token structure descriptions into tokens document. (78438)
  • UI Icon: Mark as recommended. (78365)
  • Update plugin release documentation and edit for clarity. (78537)
  • [ui] Trim verbose comments and prose around the compat overlay slot. (78356)
Code Quality
  • Migrate create-test-block.sh to @wordpress/validation-tools workspace. (78665)
Components
  • Add Badge text overflow end-to-end story. (78589)
  • DataViews: Inline z-index values. (78315)
  • Menu: Reduce flaky Space key test scope. (78246)
  • Modal: Inline header z-index. (78362)
  • Move @emotion deps out of root package.json. (78687)
  • RangeControl: Remove erroneous icon prop from web types. (78444)
  • Remove deprecated __experimentalApplyValueToSides export. (78528)
  • Routes: Enforce logical CSS properties in stylesheets. (78291)
  • Storybook: Add text overflow end-to-end stories. (78256)
  • Theme: Remove and prevent dependency grouping comments. (78573)
  • Theme: Update color space registration to avoid side effects. (77653)
  • UI Autocomplete: Fix prop types. (78450)
  • UI Tabs: Recommend component for use. (78442)
  • UI: Add Button variant states end-to-end story. (78634)
Post Editor
  • Deduplicate useGlobalStyles hook code. (78577)
  • Editor: Inline text editor toolbar z-index. (78309)
  • REST: Guard setAccessible() behind PHP < 8.1 in block-editor settings controller. (78478)
  • Use WCIcon alias for component Icon imports. (78366)
  • Use WCTooltip alias for component Tooltip imports. (78396)
Block Editor
  • Fix additional issues with block registration types. (78416)
  • Migrate __experimentalText, __experimentalHStack, and __experimentalVStack to Text and Stack. (78155)
  • Refactor: useMemo on elements and useCallback is back on resetAllFilter. (78329)
  • Simplify component ESLint rules and extend to routes/widgets. (78519)
  • Update the BlockAttribute typedef to allow for multi-type attributes. (78517)
Guidelines
  • Add data-slug attribute to settings list items. (78676)
Block Library
  • ESLint: Restrict deprecated __nextHasNoMarginBottom prop. (78579)
Media
  • Image editor: Remove unnecessary __nextHasNoMarginBottom prop. (78530)
Plugin
  • Connectors: Move from experimental to wordpress-7.0 compat. (78228)
Data Layer
  • Make RTC-related APIs private. (78097)
Tools
  • ESLint: Support private API component denylist. (78451)
Testing
  • Automated Testing: Allow console logging in all bin, scripts, tools files. (78312)
  • Automated Testing: Enable concurrency for ESLint. (78360)
  • Automated Testing: Fix and use built-in mechanism for flagging unused disables. (78313)
  • Automated Testing: Skip ESLint for bundled library code via ignore patterns. (78314)
  • e2e-test-utils-playwright: Add src to published NPM files. (78847)
  • Fix flaky end-to-end test with DataView keyboard navigation. (78503)
  • Fix flaky media upload save lock test. (78544)
  • Fix flaky navigation frontend submenu end-to-end test. (78270)
  • Fix flaky tests (publish-panel.spec.js focus assertion before panel close completed). (77893)
  • Guard PHP unit test to avoid failures on old WP versions. (78547)
  • Perf tests: Capture loading durations before stopTracing(). (78294)
  • Perf tests: Disable Playwright tracing to remove snapshot overhead. (78295)
  • Perf tests: Save Chromium traces as CI artifacts. (77974)
  • Performance Tests: Log timestamps, optimize build overhead. (78237)
  • Performance tests: Fix template click, delete pages at startup. (78193)
  • Post Editor perf test: Remove unwanted actions from timed area. (78323)
  • Preload: Backport user global styles entry for classic themes on WP 6.9. (78546)
  • RTC: Add command to run in WebSockets mode. (78363)
  • Tests: Add timezone-mock to test/unit/package.json. (78277)
  • Tests: Add post-editor preload spec. (78318)
  • Tests: Preload spec — track query strings and use an existing draft. (78343)
  • WP Editor Meta Box e2e: Wait for TinyMCE init. (78631)
Build Tooling
  • (Release): Migrate bin/plugin into @wordpress/release-tools workspace. (77695)
  • Add cherry-pick script and update release tools in package.json. (78560)
  • Build Tools: Move build scripts to @wordpress/build-scripts workspace package. (78509)
  • Build: Detect stale node_modules at build/dev time. (77995)
  • Build: Remove custom job_status output in favor of native result. (78208)
  • Dashboard: Forbid non-module stylesheets in experimental, new widgets. (78496)
  • Fix path for license type detection in license.js. (78245)
  • Improve GHCR asset publishing and expand trigger events to include pull_request. (78211)
  • Move PHP Sync Issue Generator file to @wordpress/release-tools. (78456)
  • Publishing packages: Defer pushing tags until lerna publish succeeds. (78253)
  • Refactor validation tools and update related scripts. (77522)
  • Remove commander.js file from the project. (78400)
  • Remove dependency used for counting available CPUs. (78593)
  • Several improvements to the Dependabot configuration. (78536)
  • Stylelint: Add logical properties exemptions. (78252)
  • Update browserslist. (78840)
  • Widgets: Add TypeScript project configuration. (78467)
  • wp-build: Replace getter-based exports with data properties. (78303)

First-time contributors

The following PRs were merged by first-time contributors:

  • @allilevine: DataViews: Fix wrapper height resolution in flex layouts. (76945)
  • @CookieDarb: Build: Remove custom job_status output in favor of native result. (78208)
  • @danluu: RTC: Fix connection lost error modal when /wp-json/wp-sync/v1/updates exceeds 16 MiB limit. (77724)
  • @ecairol: Navigation: Restore block_core_navigation_submenu_render_submenu_icon() as deprecated shim. (78484)
  • @Raxen001: Migrate __experimentalText, __experimentalHStack, and __experimentalVStack to Text and Stack. (78155)
  • @rushikeshmore: Components: Fix FormTokenField validation preventing default behavior. (77181)
  • @SteveJonesDev: Image block: Add “Mark as decorative” toggle for accessibility. (78064)
  • @taipeicoder: RTC: Fix Edit/Join row action invisible on mobile in post list. (78597)
  • @yyppsk: Navigation Link: Preserve custom labels during link updates. (77186)

Contributors

The following contributors merged PRs in this release:

@aagam-shah @adamsilverstein @aduth @alecgeatches @allilevine @andrewserong @chriszarate @chubes4 @ciampo @CookieDarb @danluu @DarkMatter-999 @desrosj @dhruvikpatel18 @dpmehta @ecairol @ellatrix @fushar @gziolo @himanshupathak95 @im3dabasia @Infinite-Null @ingeniumed @jameskoster @joshualip-plaudit @jsnajdr @juanfra @karmatosed @kushagra-goyal-14 @lschuyler @MaggieCabrera @Mamaduka @manzoorwanijk @Mayank-Tripathi32 @mirka @Mustafabharmal @ntsekouras @paulopmt1 @prasadkarmalkar @R1shabh-Gupta @ramonjd @Raxen001 @retrofox @rushikeshmore @scruffian @shrivastavanolo @simison @SteveJonesDev @t-hamano @taipeicoder @talldan @tellthemachines @tyxla @USERSATOSHI @westonruter @yuliyan @yyppsk

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

The full chat log is available beginning here on Slack.

WordPress Performance Trac tickets

  • @b1ink0 asked about updates on #64471, which aims to add cross-document View Transitions on the frontend.
    • @westonruter shared that there is a bug with View Transitions in the WordPress admin tracked in #65032. @westonruter also shared that PR #11912 is ready for review and addresses issues with the admin menu view transition animation.
    • @westonruter also highlighted #65294, which reports a temporary blank white screen that can appear when creating a new post.

Performance Lab Plugin (and other performance plugins)

  • @westonruter shared that work is underway to fix #2437, which addresses deprecation warnings in the wp-env tests environment.

Open Floor

  • @nickchomey asked about opportunities to contribute to the Performance Team.
    • @westonruter suggested contributing to Performance Lab plugin maintenance, exploring open issues, and submitting pull requests.
    • @nickchomey expressed interest in PHP-based performance work and image optimization, particularly around the Image Placeholders plugin. @westonruter encouraged contributions in that area and suggested connecting with @adamsilverstein regarding related image optimization work.

Our next chat will be held on Tuesday, June 16, 2026 at 16:00 UTC in the #core-performance channel in Slack.

#core-performance, #hosting, #performance, #performance-chat, #summary

On April 11, 2026, Core Committers in attendance (including emeritus) at WordCamp Asia in Mumbai, India gathered for a brief informal meeting.

There was no formal agenda, but a few goals for the meeting were mentioned at the beginning:

  • Allow newer committers to meet more senior ones.
  • Allow anyone to raise questions, concerns, or suggestions that have been on their minds.
  • Just spend some time together chatting and getting to know each other.
  • Discuss short and medium term challenges.

Below are some brief notes from discussions that happened following Chatham House Rule.

7.0 Release

The 7.0 timeline and active freeze on unrelated commits to trunk were discussed before moving on to examining the remaining open tickets in the milestone. All findings and thoughts were added publicly to each individual ticket.

A summary of the state of the real-time collaboration feature was given so that everyone in attendance was up to speed with the approaches being evaluated and what the potential tradeoffs are. Attendees agreed to add any thoughts they had to the respective tickets and pull requests.

It was flagged that there could be some differences between how MySQL/MariaDB and SQLite work. Since Playground runs on SQLite, there could be some compatibility issues with the proposed table structures that surface. It could be helpful for SQLite support to be re-evaluated in WordPress Core to have a more firm policy around support expectations.

Code Syncing from gutenberg Repository

The new build tooling processes introduced during the 7.0 cycle through #64393 were discussed.

  • In practice, it’s not clear what this means going forward when managing multiple branches.
  • For 7.0 and trunk (at the time of the meeting), the gutenberg.sha value pinned is from the wp.7.0 branch.
  • That would remain true for the 7.0 branch, but SVN trunk will be updated to pin from the upstream trunk branch after the release.

One of the benefits of these build script changes is that it’s easier to sync code maintained in the Gutenberg repository more often. What an ideal sync schedule could look like was discussed:

  • Sync on the week following a new release of the Gutenberg plugin. This allows for any .1 and .2 releases that may be necessary to occur.
  • During beta/RC periods, syncing weekly or prior to each pre-release version using a SHA value from the corresponding wp/X.Y branch for the gutenberg.sha property.

This practice does have some nuance that needs to be discussed more broadly. Mainly, when SVN trunk is bumped to X.Y+1-alpha, it makes sense to also update the pinned SHA value in wordpress-develop to represent the most recent Gutenberg plugin release. While this makes sense in theory, it is counter to the current practice of “commit to trunk first, then backport to numbered branches” because there will possibly be some divergence in SVN trunk.

There is also still some code that requires the manual creation of a pull request to wordpress-develop from gutenberg, so the process is not 100% there just yet.

Ways To Improve New Build Scripts
  • There are likely ways to improve how code is imported into the wordpress-develop repo so that it lands in more appropriate locations. Examples: no admin-facing code in wp-includes or using insertion points for various points in wordpress-develop PHP files to copy relevant chunks of code.
  • The inline documentation for the code managed in the gutenberg repository is currently lacking important elements such as @since tags.
  • There is still friction between JavaScript-based and PHP-based functionality in this process.
  • There is more room to automate the process in general.

There was agreement that a good way to proceed would be to take inventory of what manual workflows still exist even after the recent changes to how this is managed.

Performance Team

It was noted that the Performance Team has experienced a decrease in active contributors with only a small number who are regularly active. There are currently 7-10 individual performance-focused plugins being maintained by the team.

There were two agreed upon take aways:

  • Stepping back to highlight the status and goals of each plugin could make it easier for contributors who have not yet been involved to be brought up to speed and potentially attract new contributors.
  • There are a few high-potential plugins that need coordinated effort to get them to the finish line and integrated into Core.

Looking Ahead to WordPress 7.1

The discussion transitioned from discussing those high-potential performance plugins that could possibly be ready for a merge proposal to possible targets for the 7.1 cycle more broadly. Some of the ideas brought up were:

  • Retrying client-side media (was reverted and punted from 7.0).
  • Template Organization/Management (also reverted and punted from 7.0).
  • Front-end view transitions for all users (not just logged out). Still has implementation hurdles that need broader discussion.
  • Per-template styles
  • Enhanced Responsive Images (sizes="auto" support and improved sizes attributes for block themes).

Props @westonruter for peer review.

#core-committer-meetings, #core-committers

It’s been just over a week since WordPress 7.0 was released. Planning for a maintenance release has begun, but in the interest of providing WordPress site owners a high quality experience, a hotfix is available for #65286. This issue affects users of the classic editor who have extended the post publishing panel to add additional action buttons. A permanent fix is targeted for WordPress 7.0.1.

You can download and install either Classic Editor version 1.7.0 or Hotfix version 1.4 if this issue affects a site you are own or manage.

props @desrosj, @flixos90, @joemcgill, @jeffpaul for review.

#classic-editor, #hotfix

Start of the meeting in Slack, facilitated by @audrasjb See the agenda post.

Announcements

WordPress 7.0

WordPress 7.0 “Armstrong” was released on May 20th!

Some new dev notes were published for 7.0:

WordPress 7.0.1

We have some issues in the milestone, but nothing that deserves an immediate 7.0.1 release (this the below discussion concerning potential hotfixes, though).

@jorbin proposed to publish a call for volunteers in the next couple days to target middle or end of June for the release.

WordPress 7.1

WordPress 7.1-alpha is under active development.

Two posts were published concerning 7.1:

General

Discussion

From @masteradhoc: 3 Trac tickets/PR are waiting for review:

@audrasjb will review them in the next days.

@desrosj suggested to add a legal review to #65025 and pinged @4thhubbard to organize that.


From @jorbin:

#65286 is the ticket we are discussing. No actions are blocked, but the publishing screen on the non block editor looks extremely messy, so it’s worth cleaning it up while 7.0.1 is being worked on. @desrosj had proposed putting a fix in the Classic Editor plugin which could absolutely work. I was thinking the Hotfix plugin would make sense since it’s possible for this to affect custom post types and people may not be using the classic editor plugin at the same time. There are also other options […] but I think we should pick one and aim to get a solution out sooner rather than later.

@jeffpaul: “if we’ve not confirmed it affects CPTs, then I’m in favor of the classic editor plugin (and also that its low priority in that case)”.

@audrasjb: “I was about to say the same thing, in fact Classic Editor (plugin) seems like a really good option”.

@desrosj: “My thinking about the Classic Editor plugin instead of the Hotfix plugin is that sites that are choosing to remain using the classic editor likely have this plugin installed and activated already. So it fixes a wide number of sites just by pushing the update (provided they have auto-updates enabled, of course). I think we could still include the fix in the Hotfix plugin as well (anyone experiencing the issue without the Classic Editor plugin could install and activate), but it has far fewer users at 4,000+ compared to 9M+.”

@audrasjb: “But it wouldn’t affect websites where the Block Editor is disabled via a hook, or during CPT registration, etc.”

@davidbaumwald confirmed this affects CPTs without the Classic Editor.

@jorbin: “I like the idea of both hotfix and classic editor. I will also say that hotfix should always have a lot less users than classic editor since one is designed as a short term needed plugin and the other is the hotfix plugin”.

@masteradhoc added that the issue will be fixed on the WP Rocket plugin quite fast, as a ticket is already open there.

@jorbin and @audrasjb noted that the Hotfix plugin should be Featured in the plugins list. @audrasjb added that the plugin should also get a small assets refresh.

In conclusion, there is a path forward for the short term (use both Classic Editor and Hotfix plugins), and @jorbin and @desrosj will coordinate to put this together.


@yaniiliev asked whether there are any changes that the core team would like to see on the new profiles page? Anything missing, anything feeling off? This will be discussed during next week’s meeting. Feel free to comment this summary if you have anything to share about this topic.

#7-0, #7-0-1, #7-1, #core, #dev-chat

WordPress is upgrading from React 18 to React 19. This change will first ship in the Gutenberg plugin (version 23.3) and is expected to land in WordPress 7.1.

In June 2024, WordPress 6.6 shipped React 18.3, which added deprecation warnings to help developers prepare for this upgrade (see Preparation for React 19 Upgrade). Now that the migration work is complete, this post covers everything plugin and theme developers need to know.

Timeline

  • Gutenberg plugin: React 19 will be merged into the Gutenberg trunk branch after the 7.0 release. It will ship in a Gutenberg release shortly after, with npm packages following.
  • WordPress Core: The upgrade is targeted for WordPress 7.1, providing a full release cycle for testing.

We encourage developers to begin testing as early as possible once the Gutenberg plugin release with React 19 is available.

Removed APIs

The following functions have been removed from React 19 after a long deprecation period. In WordPress, these were deprecated since WordPress 6.2 (March 2023):

render and hydrate

ReactDOM.render() and ReactDOM.hydrate() have been removed. Use createRoot() and hydrateRoot() instead:

// Before (deprecated).
import { render } from '@wordpress/element';
render( <App />, document.getElementById( 'root' ) );

// After.
import { createRoot } from '@wordpress/element';
const root = createRoot( document.getElementById( 'root' ) );
root.render( <App /> );
unmountComponentAtNode

ReactDOM.unmountComponentAtNode() has been removed. Use root.unmount() instead:

// Before (deprecated).
import { unmountComponentAtNode } from '@wordpress/element';
unmountComponentAtNode( document.getElementById( 'root' ) );

// After.
root.unmount();
findDOMNode

ReactDOM.findDOMNode() has been removed from React 19. However, @wordpress/element continues to export a polyfill for findDOMNode to ease the transition. Note that the react-dom script itself will no longer include this function — only the wp-element script will provide it.

We recommend migrating away from findDOMNode by using refs instead, as it was already discouraged in earlier versions of React.

defaultProps for function components

As noted in the React 18.3 dev note, defaultProps for function components is no longer supported. Use ES6 default parameters instead:

// Before (no longer supported).
function MyComponent( { size } ) {
	return <div style={ { width: size } } />;
}
MyComponent.defaultProps = { size: 100 };

// After.
function MyComponent( { size = 100 } ) {
	return <div style={ { width: size } } />;
}

Changed behavior

The inert attribute is now a boolean

The HTML inert attribute has changed from a string type to a boolean in React 19. If your code sets inert as a string (inert="true" or inert=""), update it to use a boolean value:

// Before.
<div inert="" />
<div inert="true" />

// After.
<div inert />
<div inert={ true } />
Ref callbacks can return cleanup functions

Ref callbacks can now optionally return a cleanup function, similar to useEffect. React will call the cleanup function when the element is removed from the DOM. This is a powerful new pattern that reduces the need for separate useEffect hooks to manage DOM element lifecycle.

// New pattern: ref callback with cleanup.
<div ref={ ( node ) => {
	if ( node ) {
		const handler = () => { /* ... */ };
		node.addEventListener( 'scroll', handler );
		return () => node.removeEventListener( 'scroll', handler );
	}
} } />

Important: If your existing ref callbacks return a value (e.g., returning something other than undefined), React 19 may interpret that as a cleanup function. Make sure your ref callbacks either return undefined or a valid cleanup function.

forwardRef is no longer needed

In React 19, function components can accept ref as a regular prop. forwardRef still works but is considered deprecated and will be removed in a future version.

// Before.
const MyInput = forwardRef( ( props, ref ) => {
	return <input ref={ ref } { ...props } />;
} );

// After.
function MyInput( { ref, ...props } ) {
	return <input ref={ ref } { ...props } />;
}

New APIs available

React 19 introduces several new APIs, now available through @wordpress/element:

  • use — Read a resource (Promise or Context) during render.
  • useActionState — Manage state based on form action results.
  • useOptimistic — Show optimistic UI state while an async action is in progress.
  • useFormStatus — Access the status of a parent form.

From React 19.2:

  • Activity — Hide and show parts of the UI while preserving their state and DOM.
  • useEffectEvent — Extract non-reactive logic from effects.

TypeScript type changes

React 19 includes a major update to its TypeScript types. Developers using TypeScript should be aware of the following:

Ref types

The MutableRefObject type is deprecated. The type inference rules for useRef and RefObject have changed, especially regarding declaring values as “T or null“. Update your code to use the new RefObject type.

ReactElement props type changed from any to unknown

The ReactElement type now types its props as unknown instead of any. This reveals previously unsound access to props that was silently allowed before. This manifests especially in cloneElement calls, where reading or setting props on a cloned element now requires the element type to explicitly support those props.

HTML element prop conflicts

Many WordPress components extend native HTML elements, accepting all props that (for example) a <div> accepts plus custom props. If the HTML standard adds a new prop to <div> with a name that conflicts with a custom prop, TypeScript may report errors. Developers may need to resolve naming conflicts (as was the case with onToggle in this migration).

For a comprehensive list of TypeScript changes, see the React 19 typechecking guide.

How to test your plugin

  1. Install the latest Gutenberg plugin that includes React 19 (version TBD).
  2. Enable development mode (SCRIPT_DEBUG set to true in wp-config.php) to get detailed warnings and errors.
  3. Test all major features of your plugin — especially any code that uses the removed APIs (render, hydrate, unmountComponentAtNode, findDOMNode, defaultProps for function components).
  4. Check the browser console for React warnings and errors. React 19 has improved error reporting and may surface issues that were previously silent.
  5. Test iframe interactions if your plugin renders content inside iframes or communicates between frames, as there have been subtle behavior changes in this area.

Further reading

Call for testing

We encourage all plugin and theme developers to test their code with the Gutenberg plugin as soon as the React 19 release is available. Early testing helps us identify and fix issues before the upgrade reaches WordPress Core. If you encounter bugs, please report them on the Gutenberg GitHub repository.


Props to @tyxla, @Mamaduka, @jsnajdr, @ellatrix, @aduth, @youknowriad, and @ciampo for their contributions to this migration.

The next WordPress Developers Chat will take place on Wednesday, May 27, 2026, at 15:00 UTC in the core channel on Make WordPress Slack.

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

The various curated agenda sections below refer to additional items. If you have ticket requests for help, please continue to post details in the comments section at the end of this agenda or bring them up during the dev chat.

Announcements

Core Development
General announcements

Discussions

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

Open floor

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

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

Props to @audrasjb for collaboration and review.

#7-0, #agenda, #core, #dev-chat

v7.0

WordPress 7.0 continues to polish accessibility across WordPress Core and Gutenberg, advancing the goals to meet accessibility standards. WordPress 7.0 includes fixes across the platform, improving media management, usability for voice control, and improvements to color contrast with the new admin color scheme. The editor ships with new blocks and improvements to editor navigation and interaction.

Core

Improvements to WordPress Core include 24 accessibility enhancements and bug fixes. Major changes include enhancements to the media library for voice control users and the import of alternative text from image metadata, improvements to control semantics, and fixes to color contrast.

Media

Significant changes to media will improve both the editor and user experience. In WordPress 7.0, using the media library with voice control technology is now possible. Alternative text embedded in photo meta data will be imported and automatically set as the image text alternative when available.

  • #23562 – Using Speech Recognition Software with the Add Media Panel
  • #55535 – Pre-populate Image Alt Text field with IPTC Photo Metadata Standard Alt Text
  • #63895 – Accessibility: Alt Text Metadata is not imported but Description is
  • #63984 – Assess if the tabpanels in the media modals should receive focus
  • #64374 – Alt text helper text can be more educational and visual indicator of opening in new tab
  • #63980 – Set featured image button incorrectly coded as link and missing required ARIA attributes
Admin

Improvements to predictability and verbosity for screen reader users have been made across the admin to provide users with a more consistent and stable interface.

  • #23432 – Review usage of target="_blank" in the admin
  • #33002 – List table: avoid redundant Edit links and reduce noise for screen readers
  • #43084 – dashboard confuses published posts count with all posts
  • #64065 – Dragging theme/plugin ZIP outside file input field, downloads file instead of uploading.
  • #64375 – Set word-break property in screen reader only css.
  • #64313 – Color Contrast raises errors in automated tests for WordPress Dashboard
  • #64382 – Post search input “close” (×) button should use cursor: pointer
  • #64811 – Zero comment notification in admin toolbar has insufficient color contrast
Themes

Numerous improvements to theme template functions and core themes.

  • #62835 – Remove title attributes from author link functions
  • #62982 – Twenty Twenty-Five: The Written by pattern on single posts has too low color contrast in some variations
  • #64064 – Twenty Ten: remove auto-focus script from 404 template
  • #64594 – Block Support: Allow serialization skipping for ariaLabel
  • #64361 – Leverage HTML API to implement block template skip link
Miscellaneous

Improvements in the classic editor, code editing, the Customizer, and login and registration.

  • #63981 – Taxonomy meta box tabs not programmatically identified
  • #42822 – CodeMirror: HTML attributes values hints not fully operable with a keyboard
  • #60726 – The WordPress core password reset needs to pre-populate the username to meet WCAG 2.2
  • #63861 – Explore removing wpmu activation styles
  • #64013 – Color contrast below WCAG standards for newly-added items in customizer menus

Gutenberg

Changes within Gutenberg include 16 accessibility fixes and enhancements, including the addition of new interactive blocks that have undergone accessibility reviews. Numerous fundamental components have had accessibility improvements to ensure that interfaces across the editor are more consistent and understandable.

While there are relatively few accessibility fixes and enhancements in the editor for WordPress 7.0, there are many new interfaces that have undergone accessibility review, per the WordPress commitment to meeting WCAG 2.2 at level AA for all new and updated code. These include the Visual Revisions inspector, Gallery lightboxes, and the new Connectors interface.

Bug fixes:
  • #75165 – RangeControl: support forced-colors mode
  • #66735 – Resize meta box pane without ResizableBox
  • #74387 – Use 12px as minimum font size for warning on fit text (see also #73730)
  • #74205 – add ariaKeyShortcut and shortcutFormats exports
  • #73674 – Fix block toolbar icon CSS when using show icon label preference
  • #73245 – Make DataViews table checkbox permanently visible
  • #72997 – DataViews: Add grid keyboard navigation
  • #70787 – Button: update font-weight to 500
  • #75689 – DataForm: Fix focus loss and refactor Card layout
  • #75271 – Accordion block: Add list view support.
  • #75407 – Gallery: Add list view block support
  • #73823 – Add Heading level variations
New Features:
  • #62906 – Gallery: Add lightbox support
  • #16484 – Add an Icons block
  • #75833 – Add Connectors screen and API
  • #74742 – Add visual revisions

Reviewed by @amykamala, @sabernhardt

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

Eleven years ago, in Core-31992, someone proposed allowing non-US-ASCII email address support in WordPress. The software world has changed considerably since then: internationalized domain names and paths are uniformly handled in browsers, email systems support the wide range of Unicode characters as raw UTF-8, and UTF-8 is the only recommended text encoding for interchange between systems. This means that people are free to use their own names when communicating with others, whether they are Jake, Klára, আরিয়া , അമൽ, or any other name containing letters outside the A-Z range. Unfortuantely, WordPress has not kept up with these changes, and that’s what this post is all about.

This post is a request for comment on adding that support. There are a number of complications with potentially far-reaching implications.

TL;DR

  • WordPress’ email sanitization is based on US-ASCII characters and needs to be relaxed to allow for valid UTF-8, but this introduces new risks, including but not limited to: confusable characters, equivalence through normalization, and non-visible characters.
  • Sites whose databases cannot store full UTF-8 may fail to save valid email addresses. This could be confusing to the site owner and to people attempting to sign up on the site unless properly communicated.
  • Any additional code that assumes emails are encoded as single-byte US-ASCII will need updating, specifically because it was always an invariant before that emails would not contain multi-byte Unicode characters. Filters may start seeing characters they believed were impossible to receive.

If you have experience with email issues, deploy email services, or know about certain critical aspects of this proposal, please share your thoughts here or in Core-31992.

Unicode in email addresses was historically more complicated.

When email sprung up, servers were passing US-ASCII as a 7-bit encoding. The need to send text with characters beyond that range appeared shortly afterwards, and MIME text encoding was standardized in RFC 2047. This is what WordPress refers to in its wp_iso_descrambler() function: a mechanism for transmitting non-ASCII characters using only ASCII bytes. Critically, it only applied to certain headers and could not be applied to email addresses.

This funny-looking string indicates that it is encoded…
 - with the ISO-8859-2 character set.
 - using the quoted form, with escaped hex-codes for non-ASCII characters.

=?ISO-8859-2?Q?=A3=F3d=BC?=

It encodes the latin2 string "Łódź"

While MIME encoding alleviated the problem of sending non-English content, it did nothing to remove the need for people to romanize or ASCIIize their names and institutions. Punycode opened the door for internationalized domain names, again by encoding non-US-ASCII bytes through all-ASCII characters, but this applied only to domain names and remained unrecognizable when not parsed.

This indecipherable string encodes a state machine which, when decoded, produces a UTF-8 byte stream.

xn--l8je6s7a45b.com

It encodes the Japanese domain "あーるいん.com"

As protocols gained more functionality for unescaped UTF-8, such as in IMAP’s UTF-8 extension, more and more servers started allowing non-US-ASCII bytes as long as they were valid UTF-8. Even still, this did not change the state for email addresses, unfortunately, as the old restrictions on that header still applied.

Eventually, major email providers started allowing and passing valid UTF-8 sequences as email addresses, making them a de-facto supported feature. A comprehensive take is standardized in RFC 6530. See last year’s talk at FOSDEM for more information.

What is the proposal for WordPress?

Allow storing Unicode email addresses. (Core-31992)

Functions like is_email(), sanitize_email() and antispambot() need to be extended to support non-ASCII addresses. PHPMailer updates in WordPress 6.9 already made it possible for WordPress to send to Unicode addresses, but it’s not possible for users to use or store them on their account.

PR#5237 unlocks saving Unicode email addresses by modifying these functions, as long as the database permits it. Its validation is locked to the behaviors of <input type=email> elements to ensure compatibility with the browser and a predictable experience.

Back in April, during WordCamp Vienna, geoTLD.group and ICANN sponsored a contributor challenge to work on this very problem. @agulbra, @akirk, @benniledl, and @dmsnell worked together on this problem and proposed a new WP_Email_Address class which can parse email addresses and return the decoded local and domain parts. This class is then used by a filter to replace the decisions from is_email() sanitize_email() with their new counterparts: wp_is_unicode_email() and wp_sanitize_unicode_email(). This approach provides a path for interoperability with modern standards while preserving the ability to maintain the legacy behaviors, and it provides a helpful new class for structurally working with email addresses in various forms and places.

While Unicode email addresses should be supported, it’s still necessary to be able to apply legacy restrictions in some cases, such as for WordPress’ own sender address/RETURN FROM address, which must remain US-ASCII-only1. This proposal is exclusively about supporting Unicode email addresses for WordPress user accounts.

What could go wrong with storing Unicode email addresses?

If the database or site doesn’t support UTF-8 then there is a problem, because there is no guarantee that the email addresses will be able to be stored and retrieved without corruption. The linked pull request includes a new filter which restricts Unicode email support to sites with utf8mb4 databases. That’s a solid and simple restriction that nevertheless allows the overwhelming majority of sites to support the addresses. But this restriction needs to be communicated to site owners in a clear way.

Existing filters and plugin or theme code expecting all-US-ASCII email addresses might start receiving data that was never expected. Things as simple as calls to strlen() will return incorrect values when applied to UTF-8 strings containing multi-byte characters, and validation scripts and sanitization scripts need to be aware of the changes. For example, antispambot() needs updating because it assumes every byte is representable as a hex escape sequence, which is not the case for multibyte strings. Further, Unicode normalization properties means that two strings, which are essentially equivalent, may be treated as two distinct strings by PHP, and various functions need to agree on how to handle these to avoid conflating addresses.

Summary

The task of adding full Unicode support to identifiers in WordPress is worthwhile, despite being a broad and fuzzy challenge.

  • WordPress can start parsing addresses on supporting sites using modern standards.
  • Plugins can disable the modern email parsing.
  • An audit of Core and plugins is necessary to uncover where assumptions about US-ASCII email characters will be broken when WordPress starts allowing Unicode email addresses.
  • Your feedback will help make this process smooth and successful.

Props to Dennis Snell for help with this blog posting, as well as to Manuel Camargo, Dovid Levine, Tushar Bharti, Mukesh Panchal, and Dennis for help with the code.

  1. Sender addresses may use non-US-ASCII characters as an email alias, but the actual address portion should remain US-ASCII compatible – for example From: "मेरी साइट" <noreply@mysite.in>, which most software displays as From: मेरी साइट.

#charset, #email, #unicode

tl;dr: Use of the “beta” label for PHP support has been retired and has been retroactively removed from all versions.

  • WordPress 6.9 and 7.0 are now documented as fully supporting PHP 8.5
  • WordPress 6.8 and later are now documented as fully supporting PHP 8.4
  • WordPress 6.4 and later are now documented as fully supporting PHP 8.3

Due to the acknowledgement that WordPress is rarely used in isolation (without any theme or plugins), support for each version of PHP 8 has up until now been labelled as “beta” until its usage surpasses 10% on any given version of WordPress.

Since version 8.0, the PHP team has regularly shipped stable updates in the 8.x series. This means the work required to make plugins and themes compatible with the newer versions is much lower, and as such use of the “beta” label has been retired. The label has been removed retroactively from all versions. This will provide clarity and confidence to users, and encourages web hosts, developers, and users to continue updating to the latest versions of PHP.

Refer to the handbook page for documentation on PHP compatibility and WordPress versions.

What prompted this change?

The criteria for removing the “beta support” label from any given version of WordPress were adopted in 2023 after remaining PHP compatibility issues were resolved. Use of the “compatible with exceptions” label was retired in April last year and the number and significance of reported compatibility exceptions remains extremely low.

Additionally it’s become apparent that the “beta” label has made some end users and web hosts reluctant to update to newer versions of PHP, and caused some developers of plugins and themes to delay testing and supporting newer versions of PHP.

This label has served its purpose over the years, but can now be retired in order to continue increasing the adoption of newer versions of PHP throughout the ecosystem.

What’s the minimum supported PHP version?

The minimum recommended PHP version remains at 8.3. The minimum supported PHP version is 7.4 since WordPress 7.0. See the Requirements page for all the info.

How and why should I update PHP?

Keeping PHP up to date on your web server ensures your websites remain as performant and secure as possible. Read the guide to updating PHP.

Props to @garyj @westonruter and @jorbin for pre-publishing feedback.

#php, #php-8-0, #php-compatibility

The addition of a free-form image cropper in the Block Editor has been a long-standing feature request. A Gutenberg experiment that integrates this and other image editing features in a “Media Editor Modal” is ready for testing and feedback.

What is it?

The Media Editor Modal replaces the existing inline cropping tool in the Block Editor. The modal pattern keeps the familiar Crop button entry point, and brings freeform and aspect-ratio cropping, flip, fine-grained and snap rotation, and metadata editing into one dedicated workflow.

Under the hood, the modal consumes a core collection custom tools and components that will eventually live in a WordPress package. This will remove the reliance on third-party cropping libraries.

Why the Change?

Image cropping in the Block Editor hasn’t changed much since its introduction. The existing inline image cropper is built on top of the react-easy-crop library. This implementation has a couple of constraints:

  • it’s limited by what’s achievable in the editor canvas and block toolbar, and
  • the library itself has a narrow set of features.

Why build our own library? Well-maintained, open source alternatives that do most of what users expect are few and far between. Furthermore, there’s a general preference for a WordPress-native surface that:

  • has all the features we want “out of the box” such as aspect ratios, freeform cropping handles, intuitive zooming, flip and rotation,
  • includes all the usability features we’d expect such as touch and keyboard support, and
  • is extensible in ways idiomatic to the WordPress ecosystem.

There was an attempt to build a custom, editor-first cropper component, but it was abandoned. Rather than developing separate, one-off flows across blocks, the Media Editor Modal aims to provide a consistent foundation for both a new Media Library experience and various editor contexts, and also serve as platform for building more sophisticated experiences later.

How to Test

If you’re familiar with the Gutenberg plugin development environment, you can check out trunk right now and enable the Media Modal experiment from the experiments page at /wp-admin/admin.php?page=experiments-wp-admin.

The quickest way to test is via Playground. Here’s a link that loads up Playground with Gutenberg Trunk and the Media Editor Modal experiment already active:

Test the Media Editor Modal in Playground

Suggested Testing Flows

The steps are provided just in case you need structure. Don’t feel any need to follow any or all of them.

The important question is whether the modal is solid enough as a replacement for the Image block crop flow, and whether you notice any bugs, UX gaps or unexpected behaviors.

Basic Crop Flow
  1. Open the modal from an Image block.
  2. Resize the crop area.
  3. Pan and zoom the image.
  4. Rotate or flip the image.
  5. Save.
  6. Confirm the block updates to use the edited image.
Details Editing
  1. In a saved post with a title, upload or insert an image.
  2. Open the modal from the Image block.
  3. Switch to the Details tab.
  4. Confirm Author and Attached to fields are populated with your author handle and the current post’s title.
  5. Update alt text and caption.
  6. Save.
  7. Confirm the media item updates.
  8. Confirm the Image block updates when its existing alt/caption values were empty or matched the original media values.
Existing Custom Block Values
  1. Add an Image block.
  2. Manually enter custom alt text or a custom caption in the block.
  3. Open the media editor modal.
  4. Change the attachment’s alt text or caption.
  5. Save.
  6. Confirm custom block-level values are not unexpectedly overwritten.
Keyboard
  1. Open the modal.
  2. Use Tab to move through the crop area, crop handles, toolbar controls, sidebar controls, Save, Cancel, and Close.
  3. Use arrow keys to move or resize the crop area.
  4. Confirm focus is visible and does not get lost.
  5. Try undo/redo with keyboard shortcuts.
  6. Confirm Escape behaves as expected when there are unsaved changes.
Touch Gestures
  1. On a touch device, open the modal from an Image block.
  2. Test drag panning, pinch zoom, and crop area handle dragging for responsiveness and smoothness.
  3. Ensure toolbar actions like rotate, flip, undo, redo, and reset are tappable.

Sharing your Feedback

Comments on this post are a great way to share feedback, but if you’d like to jump into Gutenberg feel free to leave feedback on this tracking issue as it’s the main one covering current tasks for the experimental modal. We’d love to know for example:

  • Did the modal open where you expected it to?
  • Was cropping understandable without extra instruction?
  • Did anything feel slower, confusing, or broken?
  • Did the image tools, including Save and Cancel behave as you’d expect?

Out of Scope

The goal is to make the basic crop/edit workflow solid first, not to ship every image editing feature. Some related work is still being explored separately, for example:

  • Manual pixel crop controls.
  • Restoring original image.
  • Improving undo/redo history states.
  • Broader image editor extensibility for image filter and/or AI integration options.

Thank you for making it this far, and thanks in advance for testing.

Props to @andrewserong and @isabel_brison for helping to write this post.

#core-editor, #gutenberg, #media, #media-modal

v23.2

“What’s new in 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 23.2?

Gutenberg 23.2 has been released and is available for download!

This release introduces an experiment for responsive global block styles with states, brings further improvements to the experimental Content Types management screens, and adds a wave of accessibility refinements to the Revisions interface. The @wordpress/ui package gains a new SelectControl and motion design tokens, while modals now render as bottom sheets on mobile. Other changes include shortcode-to-block transforms, Grid component enhancements, Connectors refinements, and continued Real-time Collaboration reliability fixes.

Table of contents

  1. Responsive global block styles with states (experimental)
  2. Add motion design tokens (duration and easing) to @wordpress/theme
  3. Modal renders as a bottom sheet on mobile
  4. Other Notable Highlights
  5. Changelog
    1. Features
    2. Enhancements
    3. Bug Fixes
    4. Experiments
    5. Documentation
    6. Code Quality
    7. Tools
    8. Various
  6. First-time contributors
  7. Contributors

Responsive global block styles with states (experimental)

You can now customize how individual blocks look on different screen sizes, right from Global Styles.

Head to Global Styles → Blocks, and you’ll find a new States dropdown on each block with Tablet and Mobile options. Select a state, make your style changes, and they’ll apply only to that breakpoint.

This allows theme developers and site builders to define different block styles depending on viewport size and interaction state, paving the way for more adaptive designs managed entirely through the editor. (#77513)

Add motion design tokens (duration and easing) to wordpress/theme

Adds motion design tokens to @wordpress/theme — a set of duration and easing curve tokens for standardizing animation timing across components — and adopts them in Dialog, Modal, and Menu/DropdownMenu.

Video

Modal renders as a bottom sheet on mobile

The Modal component now adapts to narrow viewports by rendering as a bottom sheet, providing a more touch-friendly experience on phones and small tablets. (#77956)

With the new position, important actions are easier to reach with one hand.

Other Notable Highlights

  • Content Types management improvements (experimental): The experimental Content Types screens are extended with several refinements: taxonomy visibility fields let you control where taxonomies appear (#77835), slugs are now auto-filled from the singular label (#77938), and new term/post type count fields provide an at-a-glance view of content usage (#78157). Additional quality-of-life actions—duplicate, view, and quick-edit—round out the management experience.
  • SelectControl added to @wordpress/ui. A new SelectControl primitive joins the design-system package, offering a consistent select input across the editor and admin surfaces. (#77809)
  • Shortcode-to-block transforms. The Embed block now recognizes [ embed ] shortcodes (#77937), and the Shortcode block offers block-specific transforms when the text matches a registered shortcode (#77944).
  • Grid component improvements. The @wordpress/grid package gains a renderResizeHandle render prop (#77811), an edit-mode overlay for DashboardGrid and DashboardLanes (#78199), document cursor lock during resize (#77813), and resize-runaway prevention near the viewport edge (#77854).
  • Revisions accessibility improvements. Diff markers now enforce a 24×24 px minimum target size per WCAG 2.5.8 (#77671), use diagonal stripe patterns to avoid color-only distinction (#77904), and display tooltips (#77690). The revisions slider now paginates by 100 per page for better performance (#77200).
  • Real-time Collaboration reliability fixes. Title divergence between users on page refresh has been resolved (#77666), a race condition on room creation that could split the update log is fixed (#77675), and find_canonical_storage_post_id() no longer returns null incorrectly (#78053).
  • Connectors refinements. Plugin registration now supports an is_active callback (#77897), settings are only auto-registered when the referenced plugin is actually installed and active (#77273), and the Connectors page works on read-only file systems (#77521).

Changelog

Features
Block Editor
  • Try responsive global block styles with states. (77513)
  • Enhance the Connectors page on the read-only file system. (77521)
Enhancements
Components
  • Add SelectControl component to wordpress/ui. (77809)
  • Add motion design tokens (duration and easing) to wordpress/theme. (76097)
  • Button: Align link variant underline with Link and ExternalLink. (77842)
  • Grid: Add renderResizeHandle render prop. (77811)
  • Grid: Add edit-mode overlay to DashboardGrid and DashboardLanes. (78199)
  • Grid: Lock document cursor during resize gesture. (77813)
  • Grid: Prevent resize runaway near viewport edge. (77854)
  • Modal: Render as a bottom sheet on mobile. (77956)
  • Select: Support placeholder prop on Trigger. (78076)
  • Use the theme gray for muted Text. (77999)
  • docgen: Automatic documentation handle for TypeScript overloads. (77558)
  • ui/Tooltip, ui/IconButton: Add positioner slot API. (78089)
Block Library
  • Added Translator Context for Reply. (77891)
  • Embed: Add [ embed ] shortcode transform. (77937)
  • Shortcode: Offer block-specific transforms when text matches a registered shortcode. (77944)
  • i18n: Add context to table header/footer label. (78007)
Block Editor
  • Fix the target block for copying direct insert block attributes. (77877)
  • Make Block Inserter search input sticky while scrolling. (77698)
  • i18n: Add context to scale. (76917)
Post Editor
  • Add lint rule for non-module stylesheet imports. (77984)
  • Remove root UUID dependency. (77960)
Data Layer
  • Widget Types: Bootstrap registry into the dashboard client. (77917)
  • Widget Types: Replace bootstrap with resolver. (77847)
npm Packages
  • Build: Add widgets/ folder support to wordpress/build. (77347)
  • Taxonomy edit route: Declare @wordpress/base-styles as dependency. (77901)
Bug Fixes
Components
  • ColorPalette: Fix duplicate-key warnings and incorrect selection with identical color values. (78004)
  • ColorPicker: Fix inconsistent HEX input clearing behavior. (77912)
  • ExternalLink: Fix focus outline under wp-admin. (77935)
  • Grid: Fix keyboard activation on draggable items. (78163)
  • Grid: Render resize handle as a component. (77888)
  • Link: Fix focus outline around the new-tab icon. (77910)
  • Select: Fix disabled cursor styles. (78112)
  • Select: Hide user agent focus ring in popup. (77919)
  • TabPanel: Fix tab indicator animation. (77812)
  • Text: Fix render prop CSS defenses. (78172)
  • ui/Drawer: Forward render on Drawer.Content to the scroll container. (77941)
  • ui/Drawer: Polish open/close animation, fix swipe on content padding. (77800)
  • Admin UI: Fix nested landmark in Page header. (78001)
  • UI: Use string label type for form controls. (77860)
  • ui/CollapsibleCard: Support rendering Header as a heading element. (77962)
  • Image editor: Improve media editor crop accessibility and dialog focus. (78047)
Connectors
  • Add is_active callback support to plugin registration. (77897)
  • Clarify AI plugin callout copy. (78043)
  • Fix: Only auto-register settings if the plugin the connector references is installed and active. (77273)
  • Increase the right padding of the callout for the mobile layout. (78126)
Block Library
  • Embed: Tighten raw URL transform isMatch. (78021)
  • Fix: The buttons block shows the inserter picker when multiple allowed blocks are registered. (77858)
  • Fix: Shortcode block does not render in Navigation Overlay. (77511)
Post Editor
  • Editor: Paginate revisions slider by 100 per page. (77200)
  • Notes: Keep tall floating threads scrollable on short content. (77821)
  • defaultRenderingMode value not respected when changed using block_editor_settings_all. (77870)
  • i18n: Add context to (site) identity. (78132)
  • Site Editor: Preserve non-global editor styles in pattern previews. (77957)
  • Preserve the leading number when pasting single-line text like dates. (77949)
  • Add aria-label to the Revisions button in the Post Summary sidebar. (78140)
  • Revisions diff markers: Enforce 24×24px minimum target size (WCAG 2.5.8). (77671)
  • Revisions: Add diagonal stripe patterns to diff markers to avoid color-only distinction. (77904)
  • Revisions: Add tooltip to diff marker buttons. (77690)
  • Avoid using centered text. (78125)
  • Editor: Improve revisions diff pairing performance. (77126)
Data Layer
  • RTC: Fix title divergence between users on page refresh after title update. (77666)
  • isFulfilled: Don’t change resolution state, call in resolveSelect. (78151)
  • Fix lockfile drift and missing dep from content-types consolidation. (78109)
  • Guidelines REST: Require read access for the standard route. (77843)
  • Fix popover bind hydration. (77797)
Collaboration
  • RTC: Fix find_canonical_storage_post_id() always returning null. (78053)
  • RTC: Fix race condition on room creation, which can cause a split update log. (77675)
  • Media: Guard gutenberg_delete_heic_companion_file() against non-string $metadata[‘original’]. (78128)
Experiments
  • Add first end-to-end tests for Taxonomies. (77828)
  • Add taxonomy visibility fields. (77835)
  • Add term/post type count fields in content types. (78157)
  • Auto fill slug from a singular label for taxonomies and post types. (77938)
  • Content Types: Various improvements to post type and taxonomy management, including duplicate/view/quick-edit actions, shared utility reuse, and caching and routing fixes. (77754, 77844, 77853, 77885, 77916, 78058, 78059, 78091, 78099, 78102, 78104, 78143, 78146, 78149, 77931)
  • Dashboard: Lift Suspense + error boundary into widget chrome and add a default header. (78012)
  • Grid: Add DashboardLanes masonry surface. (78107)
  • Integrate useView into content types lists. (78197)
  • Make Content Types _builtin. (78150)
  • Render badges for some content types’ fields. (78194)
  • Sync user taxonomies with post types. (77997)
  • Update view content types actions. (78159)
  • User post types REST controller. (77915)
  • Widget Types: REST endpoint and core-data entity. (77987)
  • Widget Types: Server-side registry, decouple wp-build pages. (77958)
Media
  • Image editor: Suppress image editor undo/redo while a crop interaction is active. (77930)
  • Image editor: Update sidebar aspect ratio and resize controls. (78046)
  • Media Editor Modal: Improve image cropper interactions (undo/redo, pan, zoom, rotation), expand keyboard shortcuts and accessibility (focus borders, landmark regions, panel headings), and fix empty metadata fields. (77782, 77826, 77863, 77871, 77875, 77878, 77898, 77899, 78078, 78189)
  • Media editor: Replace fine-rotation slider with RotationRuler. (77906)
  • Grid: Add a warning about being under development. (78022)
Dashboard
  • Add WidgetDashboard.Actions compound. (78019)
  • Add an experimental WidgetDashboard rendering engine. (77770)
  • Add widget inserter modal. (78033)
  • Backend default layout filter. (78040)
  • Dashboard experiment: Animate, customize UX. (78065)
  • Dashboard experiment: New sidebar icon. (78016)
  • Dashboard experiment: Remove storybook examples for now. (78020)
  • Persist layout via wordpress/preferences. (78034)
  • REST endpoint for the default layout. (78066)
  • Staging layer for in-progress layout edits. (78071)
  • Use design animation tokens. (78204)
Block Library
  • Add Classic block migration notice. (78090)
  • Image block: Try syncing updated metadata fields (alt and caption) from the media editor. (78139)
  • Media Editor Experiment: Add a route, based on the media editor modal, and refactor the modal components. (77994)
Documentation
  • Block Editor: Clarify logic for ‘directInsert’ inner blocks setting. (77873)
  • Design System: Add missing packages to Storybook introduction. (77504)
  • Docs: Shortcode transforms with wrapped content + rawHandler JSDoc. (78003)
  • Document how to ignore VSCode Workspace Settings. (77608)
  • RTC: Clarify WPBlockSelection type and link to duplicates in other packages. (77862)
  • Revise README for FocalPointPicker component to use object-position. (77722)
  • UI: Add component status notes to Storybook. (77988)
  • UI: Add missing Portal subcomponents to Storybook. (78108)
  • UI: Fix subcomponent story labels. (78210)
  • UI: Improve documentation for compound exports. (78212)
  • Update nvm installation script to version 0.40.4. (77996)
  • Update references to the default branch. (77606)
Code Quality
  • Add a 1-day minimum release age to npm installs. (78191)
  • Migrate native tests to the workspace. (77425)
  • Script Modules: Guard setAccessible() calls behind the PHP < 8.1 check. (78137)
  • Inline z-index values across Block Manager, meta boxes, pattern chooser, sticky search, layout, and Popover, and remove local z-index helper entries. (77753, 77759, 77772, 77806, 77807, 77808, 78180, 78181)
Post Editor
  • Editor: Refactor ‘PostPublishPanel’ into a function component. (78083)
  • Edit Post: Fix suppressed errors in the Layout component. (77940)
  • Notes: Separate intent from mechanics in openTheSidebar. (78039)
Components
  • Button: Align compound component metadata. (78184)
  • Fix the flaky Menu space key unit test. (77972)
  • Menu: Fix flaky keyboard focus test. (78162)
  • SlotFill: Add dependencies to updateFill effect. (77907)
Plugin
  • Fix activation warning. (77908)
  • Fonts: Move admin menu compat from experimental to WordPress-7.0. (78227)
Block Editor
  • Add translation context for “Exit pattern”. (78158)
  • Remove unused reducer action types. (77880)
  • Backport changes in core. (78103)
  • Refactor client-side style states to use nodes. (78000)
  • Refactor accordion to use CollapsibleCard. (77903)
  • Classic Block: Use onReplace prop for migration actions. (78113)
Data Layer
  • ESLint: Replace eslint-plugin-react-compiler with eslint-plugin-react-hooks. (69962)
  • RTC: Add regression tests for the data corruption bug due to the cursor scope issue. (77662)
Tools
Testing
  • Add RTC y-websocket-server tests. (78179)
  • Add createRecord end-to-end request util. (78017)
  • Configure global fallbackFn for timezone-mock to handle Date subclasses. (78056)
  • Consolidate CI workflows for changelog testing. (78169)
  • E2E: Remove slash from bad embed request mock. (78200)
  • E2E: Reset preferences after navigable-toolbar tests. (78115)
  • Experiment: Add first basic user post types end-to-end tests and update taxonomy tests. (77998)
  • Fix flaky end-to-end tests for publish panel, Pages dataview keyboard navigation, homepage settings, and post content focus mode. (78054, 78063, 78082, 78084)
  • Revision: Fix failing end-to-end test. (78079)
  • Site Editor end-to-end tests: Reimplement the wait for load. (77981)
  • end-to-end tests: Use editPost and createNewPost helpers everywhere. (78170)
Build Tooling
  • Build: Update lint-staged from v10 to v16. (77963)
  • Fix: Guard require_once calls in generated PHP files against deployment race conditions. (78110)
  • Remove save-exact from .npmrc. (78196)
  • Tests: Fix argument forwarding for test: Unit workspace scripts. (77541)
  • Update TypeScript to tsgo (try 2). (77682)
  • bin/dev.mjs: Warn on stale webpack watching this checkout. (78098)
  • Upgrade and unify @types/node version. (77900)
Various
  • Update the UUID dependency. (77848)
  • Fill in end-to-end tests for client-side media processing. (75949)
Components
  • Support object values in the Select primitive. (77861)
  • Update date-fns to v4.1.0 in components and editor packages. (78057)
Block Library
  • Correct capitalization in help text for the Breadcrumbs block. (78175)

First-time contributors

The following PRs were merged by first-time contributors:

  • @369work: Update nvm installation script to version 0.40.4. (77996)
  • @andrea-sdl: Use theme gray for muted Text. (77999)
  • @danluu: RTC: Fix race condition on room creation, which can cause a split update log. (77675)
  • @vishnucmsminds: Add aria-label to the Revisions button in the Post Summary sidebar. (78140)

Contributors

The following contributors merged PRs in this release:

@369work @adamsilverstein @adithya-naik @aduth @afercia @alecgeatches @andrea-sdl @andreawetzel @andrewserong @anomiex @artpi @cbravobernal @ciampo @coderGtm @crisbusquets @danluu @desrosj @dmsnell @dpmehta @ellatrix @hbhalodia @himanshupathak95 @Infinite-Null @jameskoster @jorgefilipecosta @jsnajdr @lancewillett @Mamaduka @manzoorwanijk @mikachan @mirka @Mustafabharmal @ntsekouras @R1shabh-Gupta @ramonjd @retrofox @sarthaknagoshe2002 @scruffian @shail-mehta @simison @t-hamano @talldan @tellthemachines @timse201 @tyxla @USERSATOSHI @vishnucmsminds @vishnupprajapat @youknowriad @yuliyan

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

v7.1

With the release of 7.0 earlier today, trunk is finally open to any and all commits for WordPress 7.1.

Trunk is now WordPress 7.1-alpha

While the common practice is for trunk to open once the next release has been branched, closing the primary branch to any commits unrelated to 7.0 was necessary to avoid making it more complicated to add, modify, or remove features from the release during the extension to the cycle to evaluate the state and readiness of the Real-time collaboration feature.

Thank you to everyone for your continued patience.

Backporting to the numbered branches

As a reminder, the “double signoff” policy applies to changes being made to any numbered version branch. The dev-feedback commit keywords should be used to request a second committer’s review, with dev-reviewed being added after an additional signoff is given.

More information on this process can be found in the Make WordPress Core Handbook.

Props @jorbin, @audrasjb, @amykamala, @4thhubbard, @mosescursor for peer review.

#7-1

v7.0

WordPress 7.0 RC5 is ready for download and testing!

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

WordPress 7.0 RC5 can be tested using any of the following methods:

Plugin

Install and activate the WordPress Beta Tester plugin on a WordPress install. (Select the “Bleeding edge” channel and “Beta/RC Only” stream.)

Direct Download

Download the RC5 version (zip) and install it on a WordPress website.

Command Line

Use this WP-CLI command: wp core update --version=7.0–RC5

WordPress Playground

Use the WordPress Playground instance to test the software directly in your browser. No setup is required – just click and go!

The scheduled final release date for WordPress 7.0 May 20, 2026. The full release schedule can be found here. Your help testing Beta and RC versions is vital to making this release as stable and powerful as possible. Thank you to everyone who helps with testing!

Please continue checking the Make WordPress Core blog for 7.0-related posts in the coming weeks for more information.

What’s new in WordPress 7.0? Check out the Field Guide for details and highlights.

This is an extra RC

Testing for issues is critical to the development of any software, and testing works!

This RC is being released to test changes prior to the final release of 7.0.

You can browse the technical details for all issues addressed since Beta 5 using these links:

The 7.0 release is scheduled for Wednesday, May 20th. As always, a successful release depends on your confirmation during testing. So please download and test!

How to test this release

Your help testing the WordPress 7.0 RC5 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 7.0.

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

A RC5 haiku

Gift for everyone

RC5 shines like the sun

Test it and have fun

Props to @sergeybiryukov, @huzaifaalmesbah for proofreading and review.

#7-0, #development, #release

The full chat log is available beginning here on Slack.

WordPress Performance Trac tickets

  • @westonruter shared updates related to WordPress 7.0 ahead of the scheduled release the next day. Regarding loading block styles on classic themes, which had several fixes during the 7.0 release cycle, @westonruter updated the Load Combined Core Block Assets plugin to bump the “Tested up to” version and added an inline admin notice for sites on 7.0 with the plugin active, asking users to re-check whether the plugin is still needed.

Performance Lab Plugin (and other performance plugins)

  • @westonruter also updated the “Tested up to” version for the Instant Back/Forward plugin, which is included among the features listed in Performance Lab. @westonruter mentioned that the “Tested up to” versions for the Performance Lab plugins still need to be updated on WordPress.org, though the changes had already been done in Git.
  • @westonruter shared that PR #2469 bumps the minimum supported PHP version in the Performance Lab monorepo from PHP 7.2 to PHP 7.4.
  • @westonruter also shared PR #2479, which adds an .npmrc file to harden npm installs against supply chain attacks. Security was improved with ignore-scripts = true in the .npmrc among other enhancements. @westonruter noted that this means the pre-commit Husky hooks are no longer installed automatically, so the handbook documentation was updated to mention that npm run prepare now needs to be run during the initial setup.
  • @westonruter also shared PR #2482, which fixes plugin installation and activation flows in Performance Lab when WordPress is using FTP filesystem methods such as ftpext or ftpsockets. The issue was originally discovered while testing the new Connectors screen in Core, where provider plugins failed to install. @westonruter mentioned that the PR is still being kept as a draft until the related Gutenberg PR is merged.
  • @westonruter also shared PR #2473 to improve GitHub Copilot usage in the Performance Lab repository by pre-warming wp-env in the coding agent setup steps. @westonruter later mentioned that the PR had been approved and was being merged.
  • @westonruter added that several PRs still remain in need of review.

Open Floor

  • @adamsilverstein shared a newly opened issue to explore adding AI based performance recommendations to the plugin when WordPress 7.0 is available and AI is configured #2485
    • @adamsilverstein mentioned that this may work better as a separate plugin and shared that AI has improved enough to provide genuinely useful recommendations to users and potentially even fix issues automatically. @adamsilverstein also referenced the earlier wp-performance-wizard project built two years ago, noting that it already provided good results at the time and that the new idea would likely start with a simpler approach.

Our next chat will be held on Tuesday, June 2, 2026 at 16:00 UTC in the #core-performance channel in Slack.

#core-performance, #hosting, #performance, #performance-chat, #summary

Last Checked
1h ago
Latest
Jun 5, 2026
Tracking since Apr 2, 2026