gutenberg icon indicating copy to clipboard operation
gutenberg copied to clipboard

Blocks: Introduce `format` in attribute definitions, use for Block Bindings

Open ockham opened this issue 2 months ago • 41 comments

What?

Introduce a new format field for use in attribute definitions (e.g. in block.json), and use it to filter block bindings source items based on format compatibility with bound attribute.

Fixes https://github.com/WordPress/gutenberg/issues/72446. Reverts https://github.com/WordPress/gutenberg/pull/72712.

Why?

To remove incompatible source items from the block bindings UI for a given block bindings source.

For example, when we show the available items from the core/post-data list for the Date block's datetime attribute, we only want to show the date and modified source items, but not link (which is an url and thus incompatible with a datetime field).

How?

By introducing a format field in attribute definitions, and adding block bindings code to peruse it.

Testing Instructions

  • In the editor, insert a Date block.
  • In the block inspector, open the "Attributes" panel.
  • Click on the datetime attribute to expand the dropdown menu. It should contain the "Post Data" source.
  • Verify that there are two items available from that source: Post Date and Modified Date.

Screenshots or screencast

Before After
image image

TODO

  • [ ] Add unit test coverage (to packages/editor/src/bindings/test/post-data.js (?)).

ockham avatar Oct 27 '25 15:10 ockham

Discussion

I'd like to discuss if this could still be considered for WP 6.9. I realize that introducing an addition to block.json so late in the cycle could be controversial. However:

  • "Format" is a fairly established concept, and one that we might've introduced sooner or later anyway for more granular "typing" of attributes. (Maybe there could be some connection to the new Fields API and components?)
  • Special attention needs to be paid when choosing what kinds of formats to allow. However, some standardization exists for those; we can take inspiration from other places in WP -- e.g. this.

ockham avatar Oct 27 '25 15:10 ockham

Size Change: +23 B (0%)

Total Size: 2.58 MB

Filename Size Change
build/scripts/block-editor/index.min.js 314 kB -11 B (0%)
build/scripts/block-library/index.min.js 278 kB +17 B (+0.01%)
build/scripts/editor/index.min.js 284 kB +17 B (+0.01%)
ℹ️ View Unchanged
Filename Size
build/modules/a11y/index.min.js 355 B
build/modules/abilities/index.min.js 42.3 kB
build/modules/block-editor/utils/fit-text-frontend.min.js 549 B
build/modules/block-library/accordion/view.min.js 779 B
build/modules/block-library/file/view.min.js 346 B
build/modules/block-library/form/view.min.js 528 B
build/modules/block-library/image/view.min.js 1.95 kB
build/modules/block-library/navigation/view.min.js 1.03 kB
build/modules/block-library/query/view.min.js 518 B
build/modules/block-library/search/view.min.js 498 B
build/modules/block-library/tabs/view.min.js 859 B
build/modules/boot/index.min.js 103 kB
build/modules/core-abilities/index.min.js 890 B
build/modules/edit-site-init/index.min.js 2.14 kB
build/modules/interactivity-router/full-page.min.js 451 B
build/modules/interactivity-router/index.min.js 11.5 kB
build/modules/interactivity/index.min.js 14.9 kB
build/modules/latex-to-mathml/index.min.js 56.5 kB
build/modules/latex-to-mathml/loader.min.js 131 B
build/modules/lazy-editor/index.min.js 18.8 kB
build/modules/route/index.min.js 24.6 kB
build/modules/workflow/index.min.js 36.8 kB
build/scripts/a11y/index.min.js 1.06 kB
build/scripts/annotations/index.min.js 2.38 kB
build/scripts/api-fetch/index.min.js 2.83 kB
build/scripts/autop/index.min.js 2.18 kB
build/scripts/blob/index.min.js 631 B
build/scripts/block-directory/index.min.js 8.03 kB
build/scripts/block-serialization-default-parser/index.min.js 1.16 kB
build/scripts/block-serialization-spec-parser/index.min.js 3.08 kB
build/scripts/blocks/index.min.js 56.4 kB
build/scripts/commands/index.min.js 19.9 kB
build/scripts/components/index.min.js 273 kB
build/scripts/compose/index.min.js 13.9 kB
build/scripts/core-commands/index.min.js 4.13 kB
build/scripts/core-data/index.min.js 86.7 kB
build/scripts/customize-widgets/index.min.js 12.3 kB
build/scripts/data-controls/index.min.js 793 B
build/scripts/data/index.min.js 9.62 kB
build/scripts/date/index.min.js 23.6 kB
build/scripts/deprecated/index.min.js 752 B
build/scripts/dom-ready/index.min.js 476 B
build/scripts/dom/index.min.js 4.91 kB
build/scripts/edit-post/index.min.js 16.3 kB
build/scripts/edit-site/index.min.js 234 kB
build/scripts/edit-widgets/index.min.js 20 kB
build/scripts/element/index.min.js 5.19 kB
build/scripts/escape-html/index.min.js 586 B
build/scripts/format-library/index.min.js 10.8 kB
build/scripts/hooks/index.min.js 1.83 kB
build/scripts/html-entities/index.min.js 494 B
build/scripts/i18n/index.min.js 2.46 kB
build/scripts/is-shallow-equal/index.min.js 568 B
build/scripts/keyboard-shortcuts/index.min.js 1.57 kB
build/scripts/keycodes/index.min.js 1.53 kB
build/scripts/list-reusable-blocks/index.min.js 2.44 kB
build/scripts/media-utils/index.min.js 69.5 kB
build/scripts/notices/index.min.js 1.11 kB
build/scripts/nux/index.min.js 1.88 kB
build/scripts/patterns/index.min.js 7.87 kB
build/scripts/plugins/index.min.js 2.14 kB
build/scripts/preferences-persistence/index.min.js 2.15 kB
build/scripts/preferences/index.min.js 3.31 kB
build/scripts/primitives/index.min.js 1.01 kB
build/scripts/priority-queue/index.min.js 1.61 kB
build/scripts/private-apis/index.min.js 1.07 kB
build/scripts/react-i18n/index.min.js 832 B
build/scripts/react-refresh-entry/index.min.js 9.44 kB
build/scripts/react-refresh-runtime/index.min.js 3.59 kB
build/scripts/redux-routine/index.min.js 3.36 kB
build/scripts/reusable-blocks/index.min.js 2.93 kB
build/scripts/rich-text/index.min.js 12.9 kB
build/scripts/router/index.min.js 5.96 kB
build/scripts/server-side-render/index.min.js 1.91 kB
build/scripts/shortcode/index.min.js 1.58 kB
build/scripts/style-engine/index.min.js 2.33 kB
build/scripts/theme/index.min.js 20.8 kB
build/scripts/token-list/index.min.js 739 B
build/scripts/undo-manager/index.min.js 917 B
build/scripts/url/index.min.js 3.98 kB
build/scripts/vendors/react-dom.min.js 43 kB
build/scripts/vendors/react-jsx-runtime.min.js 691 B
build/scripts/vendors/react.min.js 4.27 kB
build/scripts/viewport/index.min.js 1.22 kB
build/scripts/warning/index.min.js 454 B
build/scripts/widgets/index.min.js 7.81 kB
build/scripts/wordcount/index.min.js 1.04 kB
build/styles/block-directory/style-rtl.css 1.05 kB
build/styles/block-directory/style.css 1.05 kB
build/styles/block-editor/content-rtl.css 4.8 kB
build/styles/block-editor/content.css 4.79 kB
build/styles/block-editor/default-editor-styles-rtl.css 224 B
build/styles/block-editor/default-editor-styles.css 224 B
build/styles/block-editor/style-rtl.css 16.4 kB
build/styles/block-editor/style.css 16.4 kB
build/styles/block-library/accordion-heading/style-rtl.css 325 B
build/styles/block-library/accordion-heading/style.css 325 B
build/styles/block-library/accordion-item/style-rtl.css 180 B
build/styles/block-library/accordion-item/style.css 180 B
build/styles/block-library/accordion-panel/style-rtl.css 99 B
build/styles/block-library/accordion-panel/style.css 99 B
build/styles/block-library/accordion/style-rtl.css 62 B
build/styles/block-library/accordion/style.css 62 B
build/styles/block-library/archives/editor-rtl.css 61 B
build/styles/block-library/archives/editor.css 61 B
build/styles/block-library/archives/style-rtl.css 90 B
build/styles/block-library/archives/style.css 90 B
build/styles/block-library/audio/editor-rtl.css 149 B
build/styles/block-library/audio/editor.css 151 B
build/styles/block-library/audio/style-rtl.css 132 B
build/styles/block-library/audio/style.css 132 B
build/styles/block-library/audio/theme-rtl.css 134 B
build/styles/block-library/audio/theme.css 134 B
build/styles/block-library/avatar/editor-rtl.css 115 B
build/styles/block-library/avatar/editor.css 115 B
build/styles/block-library/avatar/style-rtl.css 104 B
build/styles/block-library/avatar/style.css 104 B
build/styles/block-library/breadcrumbs/style-rtl.css 203 B
build/styles/block-library/breadcrumbs/style.css 203 B
build/styles/block-library/button/editor-rtl.css 265 B
build/styles/block-library/button/editor.css 265 B
build/styles/block-library/button/style-rtl.css 554 B
build/styles/block-library/button/style.css 554 B
build/styles/block-library/buttons/editor-rtl.css 291 B
build/styles/block-library/buttons/editor.css 291 B
build/styles/block-library/buttons/style-rtl.css 349 B
build/styles/block-library/buttons/style.css 349 B
build/styles/block-library/calendar/style-rtl.css 239 B
build/styles/block-library/calendar/style.css 239 B
build/styles/block-library/categories/editor-rtl.css 132 B
build/styles/block-library/categories/editor.css 131 B
build/styles/block-library/categories/style-rtl.css 152 B
build/styles/block-library/categories/style.css 152 B
build/styles/block-library/classic-rtl.css 321 B
build/styles/block-library/classic.css 321 B
build/styles/block-library/code/editor-rtl.css 53 B
build/styles/block-library/code/editor.css 53 B
build/styles/block-library/code/style-rtl.css 139 B
build/styles/block-library/code/style.css 139 B
build/styles/block-library/code/theme-rtl.css 122 B
build/styles/block-library/code/theme.css 122 B
build/styles/block-library/columns/editor-rtl.css 108 B
build/styles/block-library/columns/editor.css 108 B
build/styles/block-library/columns/style-rtl.css 421 B
build/styles/block-library/columns/style.css 421 B
build/styles/block-library/comment-author-avatar/editor-rtl.css 124 B
build/styles/block-library/comment-author-avatar/editor.css 124 B
build/styles/block-library/comment-author-name/style-rtl.css 72 B
build/styles/block-library/comment-author-name/style.css 72 B
build/styles/block-library/comment-content/style-rtl.css 120 B
build/styles/block-library/comment-content/style.css 120 B
build/styles/block-library/comment-date/style-rtl.css 65 B
build/styles/block-library/comment-date/style.css 65 B
build/styles/block-library/comment-edit-link/style-rtl.css 70 B
build/styles/block-library/comment-edit-link/style.css 70 B
build/styles/block-library/comment-reply-link/style-rtl.css 71 B
build/styles/block-library/comment-reply-link/style.css 71 B
build/styles/block-library/comment-template/style-rtl.css 191 B
build/styles/block-library/comment-template/style.css 191 B
build/styles/block-library/comments-pagination-numbers/editor-rtl.css 122 B
build/styles/block-library/comments-pagination-numbers/editor.css 121 B
build/styles/block-library/comments-pagination/editor-rtl.css 168 B
build/styles/block-library/comments-pagination/editor.css 168 B
build/styles/block-library/comments-pagination/style-rtl.css 201 B
build/styles/block-library/comments-pagination/style.css 201 B
build/styles/block-library/comments-title/editor-rtl.css 75 B
build/styles/block-library/comments-title/editor.css 75 B
build/styles/block-library/comments/editor-rtl.css 842 B
build/styles/block-library/comments/editor.css 842 B
build/styles/block-library/comments/style-rtl.css 637 B
build/styles/block-library/comments/style.css 637 B
build/styles/block-library/common-rtl.css 1.11 kB
build/styles/block-library/common.css 1.11 kB
build/styles/block-library/cover/editor-rtl.css 631 B
build/styles/block-library/cover/editor.css 631 B
build/styles/block-library/cover/style-rtl.css 1.82 kB
build/styles/block-library/cover/style.css 1.81 kB
build/styles/block-library/details/editor-rtl.css 65 B
build/styles/block-library/details/editor.css 65 B
build/styles/block-library/details/style-rtl.css 86 B
build/styles/block-library/details/style.css 86 B
build/styles/block-library/editor-elements-rtl.css 75 B
build/styles/block-library/editor-elements.css 75 B
build/styles/block-library/editor-rtl.css 11.8 kB
build/styles/block-library/editor.css 11.8 kB
build/styles/block-library/elements-rtl.css 54 B
build/styles/block-library/elements.css 54 B
build/styles/block-library/embed/editor-rtl.css 331 B
build/styles/block-library/embed/editor.css 331 B
build/styles/block-library/embed/style-rtl.css 448 B
build/styles/block-library/embed/style.css 448 B
build/styles/block-library/embed/theme-rtl.css 133 B
build/styles/block-library/embed/theme.css 133 B
build/styles/block-library/file/editor-rtl.css 324 B
build/styles/block-library/file/editor.css 324 B
build/styles/block-library/file/style-rtl.css 278 B
build/styles/block-library/file/style.css 278 B
build/styles/block-library/footnotes/style-rtl.css 198 B
build/styles/block-library/footnotes/style.css 197 B
build/styles/block-library/form-input/editor-rtl.css 229 B
build/styles/block-library/form-input/editor.css 229 B
build/styles/block-library/form-input/style-rtl.css 366 B
build/styles/block-library/form-input/style.css 366 B
build/styles/block-library/form-submission-notification/editor-rtl.css 344 B
build/styles/block-library/form-submission-notification/editor.css 341 B
build/styles/block-library/form-submit-button/style-rtl.css 69 B
build/styles/block-library/form-submit-button/style.css 69 B
build/styles/block-library/freeform/editor-rtl.css 2.59 kB
build/styles/block-library/freeform/editor.css 2.59 kB
build/styles/block-library/gallery/editor-rtl.css 615 B
build/styles/block-library/gallery/editor.css 616 B
build/styles/block-library/gallery/style-rtl.css 1.84 kB
build/styles/block-library/gallery/style.css 1.84 kB
build/styles/block-library/gallery/theme-rtl.css 108 B
build/styles/block-library/gallery/theme.css 108 B
build/styles/block-library/group/editor-rtl.css 335 B
build/styles/block-library/group/editor.css 335 B
build/styles/block-library/group/style-rtl.css 103 B
build/styles/block-library/group/style.css 103 B
build/styles/block-library/group/theme-rtl.css 79 B
build/styles/block-library/group/theme.css 79 B
build/styles/block-library/heading/style-rtl.css 205 B
build/styles/block-library/heading/style.css 205 B
build/styles/block-library/html/editor-rtl.css 419 B
build/styles/block-library/html/editor.css 419 B
build/styles/block-library/image/editor-rtl.css 763 B
build/styles/block-library/image/editor.css 763 B
build/styles/block-library/image/style-rtl.css 1.6 kB
build/styles/block-library/image/style.css 1.59 kB
build/styles/block-library/image/theme-rtl.css 137 B
build/styles/block-library/image/theme.css 137 B
build/styles/block-library/latest-comments/style-rtl.css 355 B
build/styles/block-library/latest-comments/style.css 354 B
build/styles/block-library/latest-posts/editor-rtl.css 139 B
build/styles/block-library/latest-posts/editor.css 138 B
build/styles/block-library/latest-posts/style-rtl.css 520 B
build/styles/block-library/latest-posts/style.css 520 B
build/styles/block-library/list/style-rtl.css 107 B
build/styles/block-library/list/style.css 107 B
build/styles/block-library/loginout/style-rtl.css 61 B
build/styles/block-library/loginout/style.css 61 B
build/styles/block-library/math/editor-rtl.css 105 B
build/styles/block-library/math/editor.css 105 B
build/styles/block-library/math/style-rtl.css 61 B
build/styles/block-library/math/style.css 61 B
build/styles/block-library/media-text/editor-rtl.css 321 B
build/styles/block-library/media-text/editor.css 320 B
build/styles/block-library/media-text/style-rtl.css 543 B
build/styles/block-library/media-text/style.css 542 B
build/styles/block-library/more/editor-rtl.css 393 B
build/styles/block-library/more/editor.css 393 B
build/styles/block-library/navigation-link/editor-rtl.css 645 B
build/styles/block-library/navigation-link/editor.css 647 B
build/styles/block-library/navigation-link/style-rtl.css 190 B
build/styles/block-library/navigation-link/style.css 188 B
build/styles/block-library/navigation-submenu/editor-rtl.css 295 B
build/styles/block-library/navigation-submenu/editor.css 294 B
build/styles/block-library/navigation/editor-rtl.css 2.25 kB
build/styles/block-library/navigation/editor.css 2.26 kB
build/styles/block-library/navigation/style-rtl.css 2.27 kB
build/styles/block-library/navigation/style.css 2.25 kB
build/styles/block-library/nextpage/editor-rtl.css 392 B
build/styles/block-library/nextpage/editor.css 392 B
build/styles/block-library/page-list/editor-rtl.css 356 B
build/styles/block-library/page-list/editor.css 356 B
build/styles/block-library/page-list/style-rtl.css 192 B
build/styles/block-library/page-list/style.css 192 B
build/styles/block-library/paragraph/editor-rtl.css 251 B
build/styles/block-library/paragraph/editor.css 251 B
build/styles/block-library/paragraph/style-rtl.css 341 B
build/styles/block-library/paragraph/style.css 340 B
build/styles/block-library/post-author-biography/style-rtl.css 74 B
build/styles/block-library/post-author-biography/style.css 74 B
build/styles/block-library/post-author-name/style-rtl.css 69 B
build/styles/block-library/post-author-name/style.css 69 B
build/styles/block-library/post-author/style-rtl.css 188 B
build/styles/block-library/post-author/style.css 189 B
build/styles/block-library/post-comments-count/style-rtl.css 72 B
build/styles/block-library/post-comments-count/style.css 72 B
build/styles/block-library/post-comments-form/editor-rtl.css 96 B
build/styles/block-library/post-comments-form/editor.css 96 B
build/styles/block-library/post-comments-form/style-rtl.css 525 B
build/styles/block-library/post-comments-form/style.css 525 B
build/styles/block-library/post-comments-link/style-rtl.css 71 B
build/styles/block-library/post-comments-link/style.css 71 B
build/styles/block-library/post-content/style-rtl.css 61 B
build/styles/block-library/post-content/style.css 61 B
build/styles/block-library/post-date/style-rtl.css 62 B
build/styles/block-library/post-date/style.css 62 B
build/styles/block-library/post-excerpt/editor-rtl.css 71 B
build/styles/block-library/post-excerpt/editor.css 71 B
build/styles/block-library/post-excerpt/style-rtl.css 155 B
build/styles/block-library/post-excerpt/style.css 155 B
build/styles/block-library/post-featured-image/editor-rtl.css 719 B
build/styles/block-library/post-featured-image/editor.css 717 B
build/styles/block-library/post-featured-image/style-rtl.css 347 B
build/styles/block-library/post-featured-image/style.css 347 B
build/styles/block-library/post-navigation-link/style-rtl.css 215 B
build/styles/block-library/post-navigation-link/style.css 214 B
build/styles/block-library/post-template/style-rtl.css 414 B
build/styles/block-library/post-template/style.css 414 B
build/styles/block-library/post-terms/style-rtl.css 96 B
build/styles/block-library/post-terms/style.css 96 B
build/styles/block-library/post-time-to-read/style-rtl.css 70 B
build/styles/block-library/post-time-to-read/style.css 70 B
build/styles/block-library/post-title/style-rtl.css 162 B
build/styles/block-library/post-title/style.css 162 B
build/styles/block-library/preformatted/style-rtl.css 125 B
build/styles/block-library/preformatted/style.css 125 B
build/styles/block-library/pullquote/editor-rtl.css 133 B
build/styles/block-library/pullquote/editor.css 133 B
build/styles/block-library/pullquote/style-rtl.css 365 B
build/styles/block-library/pullquote/style.css 365 B
build/styles/block-library/pullquote/theme-rtl.css 176 B
build/styles/block-library/pullquote/theme.css 176 B
build/styles/block-library/query-pagination-numbers/editor-rtl.css 121 B
build/styles/block-library/query-pagination-numbers/editor.css 118 B
build/styles/block-library/query-pagination/editor-rtl.css 154 B
build/styles/block-library/query-pagination/editor.css 154 B
build/styles/block-library/query-pagination/style-rtl.css 237 B
build/styles/block-library/query-pagination/style.css 237 B
build/styles/block-library/query-title/style-rtl.css 64 B
build/styles/block-library/query-title/style.css 64 B
build/styles/block-library/query-total/style-rtl.css 64 B
build/styles/block-library/query-total/style.css 64 B
build/styles/block-library/query/editor-rtl.css 438 B
build/styles/block-library/query/editor.css 438 B
build/styles/block-library/quote/style-rtl.css 238 B
build/styles/block-library/quote/style.css 238 B
build/styles/block-library/quote/theme-rtl.css 233 B
build/styles/block-library/quote/theme.css 236 B
build/styles/block-library/read-more/style-rtl.css 131 B
build/styles/block-library/read-more/style.css 131 B
build/styles/block-library/reset-rtl.css 472 B
build/styles/block-library/reset.css 472 B
build/styles/block-library/rss/editor-rtl.css 126 B
build/styles/block-library/rss/editor.css 126 B
build/styles/block-library/rss/style-rtl.css 284 B
build/styles/block-library/rss/style.css 283 B
build/styles/block-library/search/editor-rtl.css 199 B
build/styles/block-library/search/editor.css 199 B
build/styles/block-library/search/style-rtl.css 665 B
build/styles/block-library/search/style.css 666 B
build/styles/block-library/search/theme-rtl.css 113 B
build/styles/block-library/search/theme.css 113 B
build/styles/block-library/separator/editor-rtl.css 100 B
build/styles/block-library/separator/editor.css 100 B
build/styles/block-library/separator/style-rtl.css 248 B
build/styles/block-library/separator/style.css 248 B
build/styles/block-library/separator/theme-rtl.css 195 B
build/styles/block-library/separator/theme.css 195 B
build/styles/block-library/shortcode/editor-rtl.css 286 B
build/styles/block-library/shortcode/editor.css 286 B
build/styles/block-library/site-logo/editor-rtl.css 773 B
build/styles/block-library/site-logo/editor.css 770 B
build/styles/block-library/site-logo/style-rtl.css 218 B
build/styles/block-library/site-logo/style.css 218 B
build/styles/block-library/site-tagline/editor-rtl.css 87 B
build/styles/block-library/site-tagline/editor.css 87 B
build/styles/block-library/site-tagline/style-rtl.css 65 B
build/styles/block-library/site-tagline/style.css 65 B
build/styles/block-library/site-title/editor-rtl.css 85 B
build/styles/block-library/site-title/editor.css 85 B
build/styles/block-library/site-title/style-rtl.css 143 B
build/styles/block-library/site-title/style.css 143 B
build/styles/block-library/social-link/editor-rtl.css 314 B
build/styles/block-library/social-link/editor.css 314 B
build/styles/block-library/social-links/editor-rtl.css 339 B
build/styles/block-library/social-links/editor.css 338 B
build/styles/block-library/social-links/style-rtl.css 1.51 kB
build/styles/block-library/social-links/style.css 1.51 kB
build/styles/block-library/spacer/editor-rtl.css 346 B
build/styles/block-library/spacer/editor.css 346 B
build/styles/block-library/spacer/style-rtl.css 48 B
build/styles/block-library/spacer/style.css 48 B
build/styles/block-library/style-rtl.css 16.5 kB
build/styles/block-library/style.css 16.5 kB
build/styles/block-library/tab/style-rtl.css 202 B
build/styles/block-library/tab/style.css 202 B
build/styles/block-library/table-of-contents/style-rtl.css 83 B
build/styles/block-library/table-of-contents/style.css 83 B
build/styles/block-library/table/editor-rtl.css 394 B
build/styles/block-library/table/editor.css 394 B
build/styles/block-library/table/style-rtl.css 641 B
build/styles/block-library/table/style.css 640 B
build/styles/block-library/table/theme-rtl.css 152 B
build/styles/block-library/table/theme.css 152 B
build/styles/block-library/tabs/editor-rtl.css 236 B
build/styles/block-library/tabs/editor.css 236 B
build/styles/block-library/tabs/style-rtl.css 983 B
build/styles/block-library/tabs/style.css 983 B
build/styles/block-library/tag-cloud/editor-rtl.css 92 B
build/styles/block-library/tag-cloud/editor.css 92 B
build/styles/block-library/tag-cloud/style-rtl.css 248 B
build/styles/block-library/tag-cloud/style.css 248 B
build/styles/block-library/template-part/editor-rtl.css 368 B
build/styles/block-library/template-part/editor.css 368 B
build/styles/block-library/template-part/theme-rtl.css 113 B
build/styles/block-library/template-part/theme.css 113 B
build/styles/block-library/term-count/style-rtl.css 63 B
build/styles/block-library/term-count/style.css 63 B
build/styles/block-library/term-description/style-rtl.css 126 B
build/styles/block-library/term-description/style.css 126 B
build/styles/block-library/term-name/style-rtl.css 62 B
build/styles/block-library/term-name/style.css 62 B
build/styles/block-library/term-template/editor-rtl.css 225 B
build/styles/block-library/term-template/editor.css 225 B
build/styles/block-library/term-template/style-rtl.css 114 B
build/styles/block-library/term-template/style.css 114 B
build/styles/block-library/text-columns/editor-rtl.css 95 B
build/styles/block-library/text-columns/editor.css 95 B
build/styles/block-library/text-columns/style-rtl.css 165 B
build/styles/block-library/text-columns/style.css 165 B
build/styles/block-library/theme-rtl.css 715 B
build/styles/block-library/theme.css 719 B
build/styles/block-library/verse/style-rtl.css 123 B
build/styles/block-library/verse/style.css 123 B
build/styles/block-library/video/editor-rtl.css 415 B
build/styles/block-library/video/editor.css 416 B
build/styles/block-library/video/style-rtl.css 202 B
build/styles/block-library/video/style.css 202 B
build/styles/block-library/video/theme-rtl.css 134 B
build/styles/block-library/video/theme.css 134 B
build/styles/commands/style-rtl.css 1.72 kB
build/styles/commands/style.css 1.72 kB
build/styles/components/style-rtl.css 14 kB
build/styles/components/style.css 14 kB
build/styles/customize-widgets/style-rtl.css 1.44 kB
build/styles/customize-widgets/style.css 1.44 kB
build/styles/edit-post/classic-rtl.css 426 B
build/styles/edit-post/classic.css 427 B
build/styles/edit-post/style-rtl.css 3.38 kB
build/styles/edit-post/style.css 3.38 kB
build/styles/edit-site/style-rtl.css 15.9 kB
build/styles/edit-site/style.css 15.9 kB
build/styles/edit-widgets/style-rtl.css 4.62 kB
build/styles/edit-widgets/style.css 4.62 kB
build/styles/editor/style-rtl.css 18.6 kB
build/styles/editor/style.css 18.6 kB
build/styles/format-library/style-rtl.css 326 B
build/styles/format-library/style.css 326 B
build/styles/list-reusable-blocks/style-rtl.css 1.02 kB
build/styles/list-reusable-blocks/style.css 1.02 kB
build/styles/media-utils/style-rtl.css 400 B
build/styles/media-utils/style.css 400 B
build/styles/nux/style-rtl.css 622 B
build/styles/nux/style.css 618 B
build/styles/patterns/style-rtl.css 611 B
build/styles/patterns/style.css 611 B
build/styles/preferences/style-rtl.css 415 B
build/styles/preferences/style.css 415 B
build/styles/reusable-blocks/style-rtl.css 275 B
build/styles/reusable-blocks/style.css 275 B
build/styles/widgets/style-rtl.css 1.17 kB
build/styles/widgets/style.css 1.18 kB

compressed-size-action

github-actions[bot] avatar Oct 27 '25 15:10 github-actions[bot]

I see you found the reference docs for REST API schema. format is part of JSON schema spec, so there is no risk adopting the list that comes from v4 and WP REST API supports.

It’s exactly what I had envisioned and also aligns with what @chriszarate shared in his feedback.

I would love to see this exact bug fix included in WordPress 6.9 as it’s the most elegant fix possible and at the same time perfectly scalable solution for the future. Newer versions of JSON schema spec added more possible options, but even what we have in place covers the most important string values that have expected structure: date, email, url, color.

If necessary, in the future we could mix it with other concepts from the schema like patterns, and build validation in UI on top of it.

gziolo avatar Oct 27 '25 15:10 gziolo

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: ockham <[email protected]>
Co-authored-by: gziolo <[email protected]>
Co-authored-by: youknowriad <[email protected]>
Co-authored-by: oandregal <[email protected]>
Co-authored-by: cbravobernal <[email protected]>
Co-authored-by: fabiankaegy <[email protected]>
Co-authored-by: t-hamano <[email protected]>
Co-authored-by: ntsekouras <[email protected]>
Co-authored-by: hanneslsm <[email protected]>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

github-actions[bot] avatar Oct 27 '25 15:10 github-actions[bot]

Thanks a lot @gziolo! Really appreciate your feedback ❤️

I'll open this PR for wider review, including by Editor Tech Leads for 6.9 and other interested parties.

Y'all -- would you be okay with getting this into 6.9? I realize it's late in the cycle, but see @gziolo's points:

format is part of JSON schema spec, so there is no risk adopting the list that comes from v4 and WP REST API supports.

It’s exactly what I had envisioned and also aligns with what @chriszarate shared in his feedback.

I would love to see this exact bug fix included in WordPress 6.9 as it’s the most elegant fix possible and at the same time perfectly scalable solution for the future. Newer versions of JSON schema spec added more possible options, but even what we have in place covers the most important string values that have expected structure: date, email, url, color.

ockham avatar Oct 27 '25 16:10 ockham

Flaky tests detected in a11a96dcf150d9bef857f206010156c2dd31d6cc. Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/18868605397 📝 Reported issues:

  • #57525 in /test/e2e/specs/widgets/editing-widgets.spec.js

github-actions[bot] avatar Oct 27 '25 16:10 github-actions[bot]

It's by far the cleanest way to solve incompatibilities when your attribute type is a string, but stills requires a format. This way you can prevent to bind urls on datetimes, for example, same for email, phone number, and several other cases.

It's somewhat risky to edit block schema in a Beta, but is not the first time it happens, for the Interactivity API we did the same for block supports.

cbravobernal avatar Oct 27 '25 16:10 cbravobernal

I like this a lot! Solves several similar headaches I've had before trying to infer the format of a string in block extensions.

fabiankaegy avatar Oct 27 '25 17:10 fabiankaegy

The attributes are (or should be) the exact same things as the "fields" API in dataviews. I know we're also looking at introducing "format" for dataviews. So let's make sure this is the exact same API in both before moving forward. cc @oandregal

youknowriad avatar Oct 28 '25 06:10 youknowriad

@youknowriad You mean these (or is there any better documentation)? Makes sense (although they don't seem to be entirely consistent with the REST API formats, e.g. datetime vs date-time or url vs uri).

If you can point me to the "canonical" list for the Fields API, I'm happy to update this PR accordingly :)

ockham avatar Oct 28 '25 07:10 ockham

@youknowriad You mean these (or is there any better documentation)? Makes sense (although they don't seem to be entirely consistent with the REST API formats, e.g. datetime vs date-time or url vs uri).

You're linking to the "field types" which IMO map more to the "type" of attributes. But we are also thinking of adding "format" for each type.

youknowriad avatar Oct 28 '25 08:10 youknowriad

@youknowriad You mean these (or is there any better documentation)? Makes sense (although they don't seem to be entirely consistent with the REST API formats, e.g. datetime vs date-time or url vs uri).

You're linking to the "field types" which IMO map more to the "type" of attributes. But we are also thinking of adding "format" for each type.

I edited your answer instead of quoting and answering 🤦‍♂️ . I wanted to ask:

Those "field types" seem to be a mix between attribute types ( string, number, boolean, array...) and formats ( datetime, email, telephone, url, color, password ). Is that something we are considering with block attributes?

cbravobernal avatar Oct 28 '25 08:10 cbravobernal

Yes, formats is something I want to tackle soon for the Fields in DataViews/DataForm. It's possible that introducing them modifies the current types, but we'll need to assess that when that happens. This doesn't need to happen today/in the beta cycle for dataviews/dataform as everything is working fine over there (opening the proper UI control, validation).

The Field types story enables users to play with some arguments of the field, to see how it works in different contexts (filters, edit, render, different dataform layouts, etc.). The full API for a field is documented in the handbook.

oandregal avatar Oct 28 '25 09:10 oandregal

Those "field types" seem to be a mix between attribute types ( string, number, boolean, array...) and formats ( datetime, email, telephone, url, color, password ). Is that something we are considering with block attributes?

The list of "field types" is not entirely "fixed" yet, we can always change them but yes, IMO, these and attribute types should be the same thing.

youknowriad avatar Oct 28 '25 09:10 youknowriad

I do think we still have a long road to ensure the field types in "dataviews" are good for consumption in more stable APIs like block registration, but we should be considering them conceptually as the same thing and work towards unifying.

For instance, we might want to reconsider all the current types to match exactly what JSON Schema does.

youknowriad avatar Oct 28 '25 09:10 youknowriad

I explored it further, applying more aggressive refactoring:

diff --git a/packages/block-library/src/button/block.json b/packages/block-library/src/button/block.json
index 6fcb7aca4c5..2ab4164522e 100644
--- a/packages/block-library/src/button/block.json
+++ b/packages/block-library/src/button/block.json
@@ -23,6 +23,7 @@
 		},
 		"url": {
 			"type": "string",
+			"format": "uri",
 			"source": "attribute",
 			"selector": "a",
 			"attribute": "href",
diff --git a/packages/block-library/src/image/block.json b/packages/block-library/src/image/block.json
index 26835df9e85..9804953921a 100644
--- a/packages/block-library/src/image/block.json
+++ b/packages/block-library/src/image/block.json
@@ -22,6 +22,7 @@
 		},
 		"url": {
 			"type": "string",
+			"format": "uri",
 			"source": "attribute",
 			"selector": "img",
 			"attribute": "src",
@@ -56,6 +57,7 @@
 		},
 		"href": {
 			"type": "string",
+			"format": "uri",
 			"source": "attribute",
 			"selector": "figure > a",
 			"attribute": "href",
diff --git a/packages/e2e-tests/plugins/block-bindings.php b/packages/e2e-tests/plugins/block-bindings.php
index 944bfc332c4..9455a935706 100644
--- a/packages/e2e-tests/plugins/block-bindings.php
+++ b/packages/e2e-tests/plugins/block-bindings.php
@@ -24,9 +24,10 @@ function gutenberg_test_block_bindings_registration() {
 			'type'  => 'string',
 		),
 		'url_field'           => array(
-			'label' => 'URL Field Label',
-			'value' => $testing_url,
-			'type'  => 'string',
+			'label'  => 'URL Field Label',
+			'value'  => $testing_url,
+			'type'   => 'string',
+			'format' => 'uri',
 		),
 		'empty_field'         => array(
 			'label' => 'Empty Field Label',
diff --git a/packages/e2e-tests/plugins/block-bindings/index.js b/packages/e2e-tests/plugins/block-bindings/index.js
index 5221cc805c9..ef70f8389d2 100644
--- a/packages/e2e-tests/plugins/block-bindings/index.js
+++ b/packages/e2e-tests/plugins/block-bindings/index.js
@@ -41,6 +41,7 @@ registerBlockBindingsSource( {
 				( [ key, field ] ) => ( {
 					label: field?.label || key,
 					type: field?.type || 'string',
+					format: field?.format,
 					args: {
 						key,
 					},
diff --git a/packages/editor/src/bindings/post-data.js b/packages/editor/src/bindings/post-data.js
index f7181886fb1..4bb9a090302 100644
--- a/packages/editor/src/bindings/post-data.js
+++ b/packages/editor/src/bindings/post-data.js
@@ -187,14 +187,6 @@ export default {
 		return getPostDataFields( select, context, clientId );
 	},
 	editorUI( { select, context } ) {
-		const selectedBlock = select( blockEditorStore ).getSelectedBlock();
-		if ( selectedBlock?.name !== 'core/post-date' ) {
-			return {};
-		}
-		// Exit early for navigation blocks (read-only)
-		if ( NAVIGATION_BLOCK_TYPES.includes( selectedBlock?.name ) ) {
-			return {};
-		}
 		const postDataFields = Object.entries(
 			getPostDataFields( select, context ) || {}
 		).map( ( [ key, field ] ) => ( {
diff --git a/packages/editor/src/bindings/post-meta.js b/packages/editor/src/bindings/post-meta.js
index 644ea36f06d..4796d38bc78 100644
--- a/packages/editor/src/bindings/post-meta.js
+++ b/packages/editor/src/bindings/post-meta.js
@@ -154,6 +154,7 @@ export default {
 				key,
 			},
 			type: field.type,
+			format: field.format,
 		} ) );
 		/*
 		 * We need to define the data as [{ label: string, value: any, type: https://developer.wordpress.org/block-editor/reference-guides/block-api/block-attributes/#type-validation }]
diff --git a/packages/editor/src/bindings/term-data.js b/packages/editor/src/bindings/term-data.js
index 8dbf29d982f..b213b0dd822 100644
--- a/packages/editor/src/bindings/term-data.js
+++ b/packages/editor/src/bindings/term-data.js
@@ -39,6 +39,7 @@ function createDataFields( termDataValues, idValue ) {
 			label: __( 'Link' ),
 			value: termDataValues?.link,
 			type: 'string',
+			format: 'uri',
 		},
 		description: {
 			label: __( 'Description' ),
@@ -209,6 +210,7 @@ export default {
 		).map( ( [ key, field ] ) => ( {
 			label: field.label,
 			type: field.type,
+			format: field.format,
 			args: {
 				field: key,
 			},

The experience in the UI improves nicely:

https://github.com/user-attachments/assets/b7b05fc8-dd48-4d09-943a-52ade90d67a2

It still might need some special handling for the Navigation blocks, as there are other issues present when users interact with the Attributes panel. Although I would argue it's similar to everything else we see with blocks in the placeholder state, like Image block with no url, or Heading block with no text.

gziolo avatar Oct 28 '25 09:10 gziolo

The list of "field types" is not entirely "fixed" yet, we can always change them but yes, IMO, these and attribute types should be the same thing.

For instance, we might want to reconsider all the current types to match exactly what JSON Schema does.

This is what WordPress REST API supports: https://developer.wordpress.org/rest-api/extending-the-rest-api/schema/#primitive-types

This is what block attributes support:

https://developer.wordpress.org/block-editor/reference-guides/block-api/block-attributes/#type-validation

Comparison:

Type Block API (Block Attributes) REST API (Schema) Notes
null ✅ Supported ✅ Supported Represents an explicit null value.
boolean ✅ Supported ✅ Supported true or false.
string ✅ Supported ✅ Supported A text value.
number ✅ Alias of integer ✅ Supported In REST API, can include decimals (float).
integer ✅ Supported ✅ Supported Whole numbers only.
array ✅ Supported ✅ Supported A list of values (numeric array).
object ✅ Supported ✅ Supported Key/value map (associative array).

Both support also enum. For block attributes, there was added support for virtual rich-text type.

gziolo avatar Oct 28 '25 09:10 gziolo

Leaving here what I commented on slack, too many places to discuss this :)


Looking at the links shared, I think we need more specific formats that the ones that exist in the REST API. At least, I haven't found how to:

  • date format that is not a date-time (they have different UI controls, filters, etc.)
  • how to provide the format of the date: iso 8601, or any other
  • how to tell that a number should have only 1 decimal

These are the kind of questions we've heard from folks using the APIs.

Another question I have is how to work with nested data object. Example: user.profile.name. In a given DataForm, we may only want to expose the name, and so we have utils to work with that (see). The REST API/JSON Schema would require us to have two object fields (user + profile) and a string field (name). We'd need to look at this because DataViews/DataForm is used in a variety of scenarios (core + plugins), and some of them don't adhere as strongly as the core REST API to the JSON Schema format.

The validation aspect is something we are tracking here, and it's along the same lines as the REST API (FWIW, I reviewed JSON Schema + HTML Validation when preparing that).

Then, the Field API deals with more than data access that we also need to define for each field type (and the field author can override). Take a look at the Edit control: while there's a default edit control per field type (or format), consumers need the ability to tweak them (for example, to display more/less lines in a textarea, or to add prefix/suffix to input controls, etc.). Same for creating filters based on the field type. That's not something I've seen in JSON Schema. The Field API for DataViews/DataForm needs to accommodate data access requirements but also UI requirements.

So, whether formats make sense for block bindings: I can't comment on that, not deeply familiar with that API. I can say that, in the form they are described in the linked docs, they're insufficient for what we need to do in DataViews/DataForm.

oandregal avatar Oct 28 '25 10:10 oandregal

@oandregal I think the main question to solve now is that for this PR this consider "uri" as a format, while right now it's a "type" in dataviews. JSON Schema also uses "format". So I'm thinking that we should update the DataViews Fields API to use format as well in these case, and ensure field types can use the "format" in their Edit functions (custom or not)

youknowriad avatar Oct 28 '25 10:10 youknowriad

@oandregal The other thing for dataviews is whether required should move top level instead of being nested in isValid to match JSON Schemas.

youknowriad avatar Oct 28 '25 10:10 youknowriad

@youknowriad If we introduce formats in the way they work for the REST API, it'll be a regression for the Field API in DataViews/DataForm (cannot support both date and datetime). It also doesn't offer a way to support the things we need to (number of decimals, date format, etc.). I'd rather address the these things first to make sure there's a converging path. Then, when the converging path is clearer, we move any other properties around.

oandregal avatar Oct 28 '25 10:10 oandregal

If we introduce formats in the way they work for the REST API, it'll be a regression for the Field API in DataViews/DataForm (cannot support both date and datetime)

I don't understand? How so? it's just a different shape for the API no?

I'd rather address the these things first to make sure there's a converging path. Then, when the converging path is clearer, we move any other properties around.

I actually think there shouldn't be any conversion, it should be the same.

youknowriad avatar Oct 28 '25 10:10 youknowriad

I don't understand? How so? it's just a different shape for the API no?

I mentioned here a few issues with using what the REST API uses. Things we already support would no longer be supported — the date type, for example. In slack, Greg mentioned newer version of the JSON Schema support more things.

I actually think there shouldn't be any conversion, it should be the same.

That's a direction worth pursuing. Note I said converging, not converting 🙂

I prefer if we worked this way: first, understand how to support the things we already support plus the needs we've already identified (some I shared above). Only when we're certain we can do it, we start moving properties around.


@ockham In case it wasn't clear from my comment above: the formats as it works in the REST API is more limiting than what we have already working in DataViews/DataForm.

With the caveat that I haven't looked at every detail: we may converge into JSON Schema for everything by upgrading to a newer JSON Schema version, as Greg suggested. I don't have the answer for that right now, but I guess the question to unblock this PR is: if we need migrating, how does that affect this PR? Would that be a backwards-compatible issue, or would it be okay?

oandregal avatar Oct 28 '25 13:10 oandregal

Things we already support would no longer be supported — the date type, for example.

I'm still having some trouble following, In my mind the idea for date is to merge both in a single type but have "date-time" and "date" be formats that impact Edit, validation... (that would match JSON Schema).

What kind of regression this produces?

youknowriad avatar Oct 28 '25 13:10 youknowriad

I'm still having some trouble following, In my mind the idea for date is to merge both in a single type but have "date-time" and "date" be formats that impact Edit, validation... (that would match JSON Schema).

What kind of regression this produces?

The only format available is date-time. There's no date format.

oandregal avatar Oct 28 '25 13:10 oandregal

JSON Schema allows both of them and more. I think that's just a current limitation of the REST API.

What I'm saying is that we should update how we define the format and types in DataViews to match JSON Schema but I think supporting more formats that what the "standard" defines is actually a good thing. I'm more concerned about the API shape than the actual formats we support or not. I do think we should continue support all what's currently supported in dataviews.

youknowriad avatar Oct 28 '25 13:10 youknowriad

This is how the REST API compares to the JSON Schema Draft 04 (2013) for formats. I understand this doesn't make the REST API not compliant with the schema because implementors can have custom extensions.

JSON Schema Draft 04 REST API (supported, documented) Comment
date-time
email
uri
hostname
ipv4 REST API uses generic ip.
ipv6 REST API uses generic ip.
ip Custom extension.
hex-color Custom extension.
uuid Custom extension. Introduced in 2019-09 version.
text-field Custom extension.
textarea-field Custom extension.

oandregal avatar Nov 05 '25 19:11 oandregal

I've been looking a bit more how the JSON Schema is used in WordPress core and:

  • The REST API and the Ability API use it to declare the shape of the data they work with.
    • Both use the JSON Schema Draft 04 (published in 2013). This schema has several limitations, including not being able to declare date vs datetime.
    • I haven't done a full compliant analysis, but in a quick look I've detected core has gaps with respect to the schema (lacking not, allOf validation keywords), some bugs, and there are a few liberties (e.g., formats) where the deviation is higher.
    • It seems difficult to change the schema for backward-compatible reasons (see), though I understand this is nuanced.
    • Core implements their own functions to sanitize and validate input (e.g., rest_validate_value_from_schema, rest_sanitize_value_from_schema) and does not use any external library.
  • The block.json and the theme.json use JSON Schema to declare the shape of those objects, but the objects themselves have nothing to do with JSON Schema. There are some coincidences (e.g., block types).

These are the major use cases I've found.

oandregal avatar Nov 05 '25 19:11 oandregal

With the RC1 release scheduled for next week, I'd like to confirm whether this pull request is ready to be shipped. If not, are there any other temporary solutions available?

t-hamano avatar Nov 07 '25 13:11 t-hamano

@t-hamano I have yet to catch up on the latest discussion on this PR, but unless there's been a big/unexpected new development, the suggested change was deemed to require some more deliberation and coordination -- so it wasn't going to be merged for 6.9.

Instead, we've merged https://github.com/WordPress/gutenberg/pull/72712 as a workaround.

I'll remove the "Backport to WP 6.9 Beta/RC" label.

ockham avatar Nov 10 '25 10:11 ockham