Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Block bindings: Bring bindings UI in Site Editor #64072

Merged
merged 30 commits into from
Sep 17, 2024

Conversation

cbravobernal
Copy link
Contributor

@cbravobernal cbravobernal commented Jul 29, 2024

What?

Include registered meta data to the core-data schema, so the user can list the registered meta values on the block bindings UI when editing a template.

This allows creating layouts by calling custom meta data and custom binding sources, using the UI.

Testing Instructions

1.) Register your meta in a PHP snippet

register_meta(
		'post',
		'all_templates_key',
		array(
			'show_in_rest'      => true,
			'single'            => true,
			'type'              => 'string',
			'default'           => 'https://images.igdb.com/igdb/image/upload/t_1080p/ar67u.webp',
		)
	);

register_meta(
		'post',
		'videogame_cover',
		array(
                        'object_subtype' => 'videogame',
			'show_in_rest'      => true,
			'single'            => true,
			'type'              => 'string',
			'default'           => 'https://images.igdb.com/igdb/image/upload/t_cover_big/co67qb.webp',
		)
	);
  1. Register a custom post type:
function register_videogame_post_type() {
    $labels = array(
        'name'               => _x('Videogames', 'post type general name', 'textdomain'),
        'singular_name'      => _x('Videogame', 'post type singular name', 'textdomain'),
        'menu_name'          => _x('Videogames', 'admin menu', 'textdomain'),
        'name_admin_bar'     => _x('Videogame', 'add new on admin bar', 'textdomain'),
        'add_new'            => _x('Add New', 'videogame', 'textdomain'),
        'add_new_item'       => __('Add New Videogame', 'textdomain'),
        'new_item'           => __('New Videogame', 'textdomain'),
        'edit_item'          => __('Edit Videogame', 'textdomain'),
        'view_item'          => __('View Videogame', 'textdomain'),
        'all_items'          => __('All Videogames', 'textdomain'),
        'search_items'       => __('Search Videogames', 'textdomain'),
        'parent_item_colon'  => __('Parent Videogames:', 'textdomain'),
        'not_found'          => __('No videogames found.', 'textdomain'),
        'not_found_in_trash' => __('No videogames found in Trash.', 'textdomain')
    );

    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => array('slug' => 'videogame'),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => null,
        'supports'           => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments', 'custom-fields'),
		'show_in_rest' => true,
    );

    register_post_type('videogame', $args);
}
add_action('init', 'register_videogame_post_type');
  1. Create a custom template, check that only all_templates_key can be selected.
Screenshot 2024-09-06 at 12 31 40
  1. Create a video game template, check that videogame_cover and all_templates_key can be selected.
Screenshot 2024-09-06 at 12 36 20

@gziolo
Copy link
Member

gziolo commented Jul 30, 2024

This is a similar use case to what @Mamaduka contributed recently for canUser check in @wordpress/core-data where the metadata gets exposed through REST API using its schema obtained through OPTIONS request (it is already preloaded on the server when the editor initializes).

export function canUser(

export const canUser =

@Mamaduka Mamaduka added the REST API Interaction Related to REST API label Jul 30, 2024
@Mamaduka
Copy link
Member

This is probably the right PR - #59243.

@cbravobernal, it would be helpful if you could expand on why this is needed.

@cbravobernal cbravobernal force-pushed the experiment/add-meta-post-type-api branch from 379ef7c to ff0cd99 Compare July 31, 2024 10:00
@cbravobernal cbravobernal added the [Type] Experimental Experimental feature or API. label Jul 31, 2024
@cbravobernal
Copy link
Contributor Author

This is probably the right PR - #59243.

@cbravobernal, it would be helpful if you could expand on why this is needed.

The idea is to be able to add post meta data bindings to any kind of template. Like this:

Screen.Recording.2024-07-31.at.12.00.44.mov

Copy link

github-actions bot commented Jul 31, 2024

Size Change: +3.26 kB (+0.18%)

Total Size: 1.77 MB

Filename Size Change
build/a11y/index.min.js 949 B -2 B (-0.21%)
build/block-editor/index.min.js 257 kB -196 B (-0.08%)
build/block-editor/style-rtl.css 16 kB -152 B (-0.94%)
build/block-editor/style.css 16 kB -156 B (-0.97%)
build/block-library/blocks/form-input/style-rtl.css 357 B +15 B (+4.39%)
build/block-library/blocks/form-input/style.css 357 B +15 B (+4.39%)
build/block-library/index.min.js 219 kB +704 B (+0.32%)
build/block-library/style-rtl.css 15 kB +17 B (+0.11%)
build/block-library/style.css 15 kB +17 B (+0.11%)
build/commands/index.min.js 16.1 kB -3 B (-0.02%)
build/components/index.min.js 224 kB +212 B (+0.09%)
build/components/style-rtl.css 12.1 kB +26 B (+0.21%)
build/components/style.css 12.1 kB +27 B (+0.22%)
build/core-data/index.min.js 73.4 kB +203 B (+0.28%)
build/customize-widgets/index.min.js 11 kB -2 B (-0.02%)
build/data/index.min.js 8.98 kB -2 B (-0.02%)
build/edit-post/index.min.js 13.1 kB +439 B (+3.47%)
build/edit-post/style-rtl.css 2.54 kB +221 B (+9.55%) ⚠️
build/edit-post/style.css 2.53 kB +223 B (+9.65%) ⚠️
build/edit-site/index.min.js 217 kB +354 B (+0.16%)
build/edit-site/posts-rtl.css 7.3 kB +1 B (+0.01%)
build/edit-site/posts.css 7.3 kB +2 B (+0.03%)
build/edit-site/style-rtl.css 12.6 kB +13 B (+0.1%)
build/edit-site/style.css 12.6 kB +13 B (+0.1%)
build/edit-widgets/index.min.js 17.7 kB -3 B (-0.02%)
build/editor/index.min.js 102 kB +14 B (+0.01%)
build/editor/style-rtl.css 9.33 kB +45 B (+0.48%)
build/editor/style.css 9.33 kB +46 B (+0.5%)
build/interactivity/debug.min.js 0 B -16.4 kB (removed) 🏆
build/interactivity/file.min.js 0 B -447 B (removed) 🏆
build/interactivity/image.min.js 0 B -1.78 kB (removed) 🏆
build/interactivity/index.min.js 0 B -13.2 kB (removed) 🏆
build/interactivity/navigation.min.js 0 B -1.16 kB (removed) 🏆
build/interactivity/query.min.js 0 B -742 B (removed) 🏆
build/interactivity/router.min.js 0 B -2.8 kB (removed) 🏆
build/interactivity/search.min.js 0 B -615 B (removed) 🏆
build/preferences/index.min.js 2.9 kB +2 B (+0.07%)
build/private-apis/index.min.js 1.01 kB +5 B (+0.5%)
build/vendors/react-dom.min.js 41.7 kB +2 B (0%)
build/widgets/index.min.js 7.19 kB -9 B (-0.13%)
build-module/a11y/index.min.js 898 B +898 B (new file) 🆕
build-module/block-library/file/view.min.js 447 B +447 B (new file) 🆕
build-module/block-library/image/view.min.js 1.78 kB +1.78 kB (new file) 🆕
build-module/block-library/navigation/view.min.js 1.16 kB +1.16 kB (new file) 🆕
build-module/block-library/query/view.min.js 743 B +743 B (new file) 🆕
build-module/block-library/search/view.min.js 616 B +616 B (new file) 🆕
build-module/interactivity-router/index.min.js 2.8 kB +2.8 kB (new file) 🆕
build-module/interactivity/debug.min.js 16.6 kB +16.6 kB (new file) 🆕
build-module/interactivity/index.min.js 13.3 kB +13.3 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size
build/annotations/index.min.js 2.26 kB
build/api-fetch/index.min.js 2.32 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 579 B
build/block-directory/index.min.js 7.11 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/content-rtl.css 4.65 kB
build/block-editor/content.css 4.64 kB
build/block-editor/default-editor-styles-rtl.css 394 B
build/block-editor/default-editor-styles.css 394 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 149 B
build/block-library/blocks/audio/editor.css 151 B
build/block-library/blocks/audio/style-rtl.css 132 B
build/block-library/blocks/audio/style.css 132 B
build/block-library/blocks/audio/theme-rtl.css 134 B
build/block-library/blocks/audio/theme.css 134 B
build/block-library/blocks/avatar/editor-rtl.css 115 B
build/block-library/blocks/avatar/editor.css 115 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/button/editor-rtl.css 265 B
build/block-library/blocks/button/editor.css 265 B
build/block-library/blocks/button/style-rtl.css 538 B
build/block-library/blocks/button/style.css 538 B
build/block-library/blocks/buttons/editor-rtl.css 291 B
build/block-library/blocks/buttons/editor.css 291 B
build/block-library/blocks/buttons/style-rtl.css 328 B
build/block-library/blocks/buttons/style.css 328 B
build/block-library/blocks/calendar/style-rtl.css 240 B
build/block-library/blocks/calendar/style.css 240 B
build/block-library/blocks/categories/editor-rtl.css 132 B
build/block-library/blocks/categories/editor.css 131 B
build/block-library/blocks/categories/style-rtl.css 152 B
build/block-library/blocks/categories/style.css 152 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 122 B
build/block-library/blocks/code/theme.css 122 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 420 B
build/block-library/blocks/columns/style.css 420 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 124 B
build/block-library/blocks/comment-author-avatar/editor.css 124 B
build/block-library/blocks/comment-author-name/style-rtl.css 72 B
build/block-library/blocks/comment-author-name/style.css 72 B
build/block-library/blocks/comment-content/style-rtl.css 120 B
build/block-library/blocks/comment-content/style.css 120 B
build/block-library/blocks/comment-date/style-rtl.css 65 B
build/block-library/blocks/comment-date/style.css 65 B
build/block-library/blocks/comment-edit-link/style-rtl.css 70 B
build/block-library/blocks/comment-edit-link/style.css 70 B
build/block-library/blocks/comment-reply-link/style-rtl.css 71 B
build/block-library/blocks/comment-reply-link/style.css 71 B
build/block-library/blocks/comment-template/style-rtl.css 200 B
build/block-library/blocks/comment-template/style.css 199 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 228 B
build/block-library/blocks/comments-pagination/editor.css 217 B
build/block-library/blocks/comments-pagination/style-rtl.css 234 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 832 B
build/block-library/blocks/comments/editor.css 832 B
build/block-library/blocks/comments/style-rtl.css 632 B
build/block-library/blocks/comments/style.css 631 B
build/block-library/blocks/cover/editor-rtl.css 641 B
build/block-library/blocks/cover/editor.css 642 B
build/block-library/blocks/cover/style-rtl.css 1.62 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 86 B
build/block-library/blocks/details/style.css 86 B
build/block-library/blocks/embed/editor-rtl.css 331 B
build/block-library/blocks/embed/editor.css 331 B
build/block-library/blocks/embed/style-rtl.css 419 B
build/block-library/blocks/embed/style.css 419 B
build/block-library/blocks/embed/theme-rtl.css 133 B
build/block-library/blocks/embed/theme.css 133 B
build/block-library/blocks/file/editor-rtl.css 326 B
build/block-library/blocks/file/editor.css 326 B
build/block-library/blocks/file/style-rtl.css 278 B
build/block-library/blocks/file/style.css 279 B
build/block-library/blocks/file/view.min.js 324 B
build/block-library/blocks/footnotes/style-rtl.css 198 B
build/block-library/blocks/footnotes/style.css 197 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 229 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 344 B
build/block-library/blocks/form-submission-notification/editor.css 341 B
build/block-library/blocks/form-submit-button/style-rtl.css 69 B
build/block-library/blocks/form-submit-button/style.css 69 B
build/block-library/blocks/form/view.min.js 470 B
build/block-library/blocks/freeform/editor-rtl.css 2.6 kB
build/block-library/blocks/freeform/editor.css 2.6 kB
build/block-library/blocks/gallery/editor-rtl.css 955 B
build/block-library/blocks/gallery/editor.css 958 B
build/block-library/blocks/gallery/style-rtl.css 1.83 kB
build/block-library/blocks/gallery/style.css 1.82 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 333 B
build/block-library/blocks/group/editor.css 333 B
build/block-library/blocks/group/style-rtl.css 103 B
build/block-library/blocks/group/style.css 103 B
build/block-library/blocks/group/theme-rtl.css 79 B
build/block-library/blocks/group/theme.css 79 B
build/block-library/blocks/heading/style-rtl.css 188 B
build/block-library/blocks/heading/style.css 188 B
build/block-library/blocks/html/editor-rtl.css 346 B
build/block-library/blocks/html/editor.css 347 B
build/block-library/blocks/image/editor-rtl.css 785 B
build/block-library/blocks/image/editor.css 787 B
build/block-library/blocks/image/style-rtl.css 1.59 kB
build/block-library/blocks/image/style.css 1.59 kB
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/image/view.min.js 1.65 kB
build/block-library/blocks/latest-comments/style-rtl.css 355 B
build/block-library/blocks/latest-comments/style.css 354 B
build/block-library/blocks/latest-posts/editor-rtl.css 179 B
build/block-library/blocks/latest-posts/editor.css 179 B
build/block-library/blocks/latest-posts/style-rtl.css 509 B
build/block-library/blocks/latest-posts/style.css 510 B
build/block-library/blocks/list/style-rtl.css 107 B
build/block-library/blocks/list/style.css 107 B
build/block-library/blocks/loginout/style-rtl.css 61 B
build/block-library/blocks/loginout/style.css 61 B
build/block-library/blocks/media-text/editor-rtl.css 321 B
build/block-library/blocks/media-text/editor.css 320 B
build/block-library/blocks/media-text/style-rtl.css 558 B
build/block-library/blocks/media-text/style.css 556 B
build/block-library/blocks/more/editor-rtl.css 427 B
build/block-library/blocks/more/editor.css 427 B
build/block-library/blocks/navigation-link/editor-rtl.css 644 B
build/block-library/blocks/navigation-link/editor.css 645 B
build/block-library/blocks/navigation-link/style-rtl.css 192 B
build/block-library/blocks/navigation-link/style.css 191 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 295 B
build/block-library/blocks/navigation-submenu/editor.css 294 B
build/block-library/blocks/navigation/editor-rtl.css 2.19 kB
build/block-library/blocks/navigation/editor.css 2.2 kB
build/block-library/blocks/navigation/style-rtl.css 2.25 kB
build/block-library/blocks/navigation/style.css 2.23 kB
build/block-library/blocks/navigation/view.min.js 1.03 kB
build/block-library/blocks/nextpage/editor-rtl.css 392 B
build/block-library/blocks/nextpage/editor.css 392 B
build/block-library/blocks/page-list/editor-rtl.css 378 B
build/block-library/blocks/page-list/editor.css 378 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 236 B
build/block-library/blocks/paragraph/editor.css 236 B
build/block-library/blocks/paragraph/style-rtl.css 341 B
build/block-library/blocks/paragraph/style.css 340 B
build/block-library/blocks/post-author-biography/style-rtl.css 74 B
build/block-library/blocks/post-author-biography/style.css 74 B
build/block-library/blocks/post-author-name/style-rtl.css 69 B
build/block-library/blocks/post-author-name/style.css 69 B
build/block-library/blocks/post-author/editor-rtl.css 107 B
build/block-library/blocks/post-author/editor.css 107 B
build/block-library/blocks/post-author/style-rtl.css 188 B
build/block-library/blocks/post-author/style.css 189 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 527 B
build/block-library/blocks/post-comments-form/style.css 528 B
build/block-library/blocks/post-content/editor-rtl.css 74 B
build/block-library/blocks/post-content/editor.css 74 B
build/block-library/blocks/post-content/style-rtl.css 79 B
build/block-library/blocks/post-content/style.css 79 B
build/block-library/blocks/post-date/style-rtl.css 62 B
build/block-library/blocks/post-date/style.css 62 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 155 B
build/block-library/blocks/post-excerpt/style.css 155 B
build/block-library/blocks/post-featured-image/editor-rtl.css 729 B
build/block-library/blocks/post-featured-image/editor.css 726 B
build/block-library/blocks/post-featured-image/style-rtl.css 347 B
build/block-library/blocks/post-featured-image/style.css 347 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 399 B
build/block-library/blocks/post-template/style.css 398 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 70 B
build/block-library/blocks/post-time-to-read/style.css 70 B
build/block-library/blocks/post-title/style-rtl.css 226 B
build/block-library/blocks/post-title/style.css 226 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 134 B
build/block-library/blocks/pullquote/editor.css 134 B
build/block-library/blocks/pullquote/style-rtl.css 342 B
build/block-library/blocks/pullquote/style.css 342 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 121 B
build/block-library/blocks/query-pagination-numbers/editor.css 118 B
build/block-library/blocks/query-pagination/editor-rtl.css 154 B
build/block-library/blocks/query-pagination/editor.css 154 B
build/block-library/blocks/query-pagination/style-rtl.css 237 B
build/block-library/blocks/query-pagination/style.css 237 B
build/block-library/blocks/query-title/style-rtl.css 64 B
build/block-library/blocks/query-title/style.css 64 B
build/block-library/blocks/query/editor-rtl.css 452 B
build/block-library/blocks/query/editor.css 451 B
build/block-library/blocks/query/view.min.js 958 B
build/block-library/blocks/quote/style-rtl.css 238 B
build/block-library/blocks/quote/style.css 238 B
build/block-library/blocks/quote/theme-rtl.css 233 B
build/block-library/blocks/quote/theme.css 236 B
build/block-library/blocks/read-more/style-rtl.css 138 B
build/block-library/blocks/read-more/style.css 138 B
build/block-library/blocks/rss/editor-rtl.css 101 B
build/block-library/blocks/rss/editor.css 101 B
build/block-library/blocks/rss/style-rtl.css 288 B
build/block-library/blocks/rss/style.css 287 B
build/block-library/blocks/search/editor-rtl.css 199 B
build/block-library/blocks/search/editor.css 199 B
build/block-library/blocks/search/style-rtl.css 672 B
build/block-library/blocks/search/style.css 671 B
build/block-library/blocks/search/theme-rtl.css 113 B
build/block-library/blocks/search/theme.css 113 B
build/block-library/blocks/search/view.min.js 475 B
build/block-library/blocks/separator/editor-rtl.css 100 B
build/block-library/blocks/separator/editor.css 100 B
build/block-library/blocks/separator/style-rtl.css 248 B
build/block-library/blocks/separator/style.css 248 B
build/block-library/blocks/separator/theme-rtl.css 195 B
build/block-library/blocks/separator/theme.css 195 B
build/block-library/blocks/shortcode/editor-rtl.css 286 B
build/block-library/blocks/shortcode/editor.css 286 B
build/block-library/blocks/site-logo/editor-rtl.css 806 B
build/block-library/blocks/site-logo/editor.css 803 B
build/block-library/blocks/site-logo/style-rtl.css 218 B
build/block-library/blocks/site-logo/style.css 218 B
build/block-library/blocks/site-tagline/editor-rtl.css 87 B
build/block-library/blocks/site-tagline/editor.css 87 B
build/block-library/blocks/site-tagline/style-rtl.css 65 B
build/block-library/blocks/site-tagline/style.css 65 B
build/block-library/blocks/site-title/editor-rtl.css 85 B
build/block-library/blocks/site-title/editor.css 85 B
build/block-library/blocks/site-title/style-rtl.css 206 B
build/block-library/blocks/site-title/style.css 206 B
build/block-library/blocks/social-link/editor-rtl.css 338 B
build/block-library/blocks/social-link/editor.css 338 B
build/block-library/blocks/social-links/editor-rtl.css 757 B
build/block-library/blocks/social-links/editor.css 756 B
build/block-library/blocks/social-links/style-rtl.css 1.51 kB
build/block-library/blocks/social-links/style.css 1.5 kB
build/block-library/blocks/spacer/editor-rtl.css 346 B
build/block-library/blocks/spacer/editor.css 346 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table-of-contents/style-rtl.css 83 B
build/block-library/blocks/table-of-contents/style.css 83 B
build/block-library/blocks/table/editor-rtl.css 394 B
build/block-library/blocks/table/editor.css 394 B
build/block-library/blocks/table/style-rtl.css 640 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 152 B
build/block-library/blocks/table/theme.css 152 B
build/block-library/blocks/tag-cloud/editor-rtl.css 144 B
build/block-library/blocks/tag-cloud/editor.css 144 B
build/block-library/blocks/tag-cloud/style-rtl.css 266 B
build/block-library/blocks/tag-cloud/style.css 265 B
build/block-library/blocks/template-part/editor-rtl.css 368 B
build/block-library/blocks/template-part/editor.css 368 B
build/block-library/blocks/template-part/theme-rtl.css 113 B
build/block-library/blocks/template-part/theme.css 113 B
build/block-library/blocks/term-description/style-rtl.css 126 B
build/block-library/blocks/term-description/style.css 126 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 165 B
build/block-library/blocks/text-columns/style.css 165 B
build/block-library/blocks/verse/style-rtl.css 98 B
build/block-library/blocks/verse/style.css 98 B
build/block-library/blocks/video/editor-rtl.css 396 B
build/block-library/blocks/video/editor.css 397 B
build/block-library/blocks/video/style-rtl.css 192 B
build/block-library/blocks/video/style.css 192 B
build/block-library/blocks/video/theme-rtl.css 134 B
build/block-library/blocks/video/theme.css 134 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.7 kB
build/block-library/editor.css 11.7 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/theme-rtl.css 708 B
build/block-library/theme.css 712 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 52.3 kB
build/commands/style-rtl.css 955 B
build/commands/style.css 952 B
build/compose/index.min.js 12.7 kB
build/core-commands/index.min.js 2.82 kB
build/customize-widgets/style-rtl.css 1.35 kB
build/customize-widgets/style.css 1.35 kB
build/data-controls/index.min.js 641 B
build/date/index.min.js 18 kB
build/deprecated/index.min.js 458 B
build/dom-ready/index.min.js 325 B
build/dom/index.min.js 4.66 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 580 B
build/edit-widgets/style-rtl.css 4.2 kB
build/edit-widgets/style.css 4.2 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.11 kB
build/format-library/style-rtl.css 476 B
build/format-library/style.css 476 B
build/hooks/index.min.js 1.54 kB
build/html-entities/index.min.js 445 B
build/i18n/index.min.js 3.58 kB
build/is-shallow-equal/index.min.js 526 B
build/keyboard-shortcuts/index.min.js 1.31 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.18 kB
build/list-reusable-blocks/style-rtl.css 846 B
build/list-reusable-blocks/style.css 846 B
build/media-utils/index.min.js 3.2 kB
build/notices/index.min.js 946 B
build/nux/index.min.js 1.61 kB
build/nux/style-rtl.css 749 B
build/nux/style.css 745 B
build/patterns/index.min.js 7.34 kB
build/patterns/style-rtl.css 687 B
build/patterns/style.css 685 B
build/plugins/index.min.js 1.81 kB
build/preferences-persistence/index.min.js 2.06 kB
build/preferences/style-rtl.css 554 B
build/preferences/style.css 554 B
build/primitives/index.min.js 829 B
build/priority-queue/index.min.js 1.54 kB
build/react-i18n/index.min.js 630 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.76 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.55 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.1 kB
build/router/index.min.js 1.96 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 2.04 kB
build/token-list/index.min.js 581 B
build/url/index.min.js 3.9 kB
build/vendors/react-jsx-runtime.min.js 560 B
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 965 B
build/warning/index.min.js 250 B
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

Comment on lines 90 to 91
// TODO: Last item 'post' should not be hardcoded.
.getEntityRecord( 'root', 'postType', 'post' );
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This one is tricky. We might need to infer from the template slug the entity it refers to, replicating the template hierarchy. I remember doing something similar in the past and coming up with a relationship table between slugs and entities. I'll explore deeper this point.

Copy link
Member

@gziolo gziolo Jul 31, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It also largely depends on the context, when in Query Loop that explicitly picks a post type different that post, there might be different meta fields defined. In particular, in templates, that might be even more tricky as you often have general templates like single, which applies to all possible post types, but you can also go very specific when providing the template for the products archive page, which would offer more inferred specificity. Maybe for a start, the list of allowed post meta should be grouped by post type and that would be a user decision to pick the one they feel fits best. Alternatively, it could be only meta registered for all post types (when the dev passes and empty string):

Screenshot 2024-07-31 at 14 04 16

@SantosGuillamot
Copy link
Contributor

As mentioned here, I believe one of the main challenges of this pull request is to identify in which template the user is. Depending on the template, the custom fields to show in the UI will be different. Some examples:

  • If I am in a "Category" archive template, it doesn't make sense to be able to connect to post meta because it doesn't apply (unless you are in a query loop).
  • If I am in a "Page" template, it doesn't make sense to show the custom fields registered for a "movie" post type.
  • If I am in an "Index" template, that applies to any post type, I just want to show the fields that are registered for any post type.

There are a bunch of different use cases.

I believe we could create a relationship between the template and the entities it applies to using the template slug. Something similar to the classic themes Template Hierarchy. This could be beneficial not only for this use case but for other ones. Another example could be to know what should be the default of the query loop.

I made an experimental commit (not finished) to showcase what I mean and covering the different template slugs that could exist: link.

Maybe this information is available in another place, but I wasn't able to find it. Another possibility could be adding a new field to the wp_template endpoints to include the related entities there somehow.

Any thoughts? I'm happy to keep investigating any approach.

Apart from that, we need to explore how it will work with other external sources that might face a similar problem as well.

@cbravobernal cbravobernal force-pushed the experiment/add-meta-post-type-api branch 2 times, most recently from d2ccb1e to 71bb464 Compare August 29, 2024 15:51
@cbravobernal cbravobernal changed the title Block bindings: Add meta field to post types - Draft Block bindings: Add meta field to post types Aug 29, 2024
@cbravobernal cbravobernal marked this pull request as ready for review August 29, 2024 16:02
Copy link

github-actions bot commented Aug 29, 2024

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: cbravobernal <cbravobernal@git.wordpress.org>
Co-authored-by: SantosGuillamot <santosguillamot@git.wordpress.org>
Co-authored-by: Mamaduka <mamaduka@git.wordpress.org>
Co-authored-by: gziolo <gziolo@git.wordpress.org>
Co-authored-by: youknowriad <youknowriad@git.wordpress.org>
Co-authored-by: tyxla <tyxla@git.wordpress.org>
Co-authored-by: TimothyBJacobs <timothyblynjacobs@git.wordpress.org>
Co-authored-by: artemiomorales <artemiosans@git.wordpress.org>
Co-authored-by: spacedmonkey <spacedmonkey@git.wordpress.org>

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

@TimothyBJacobs
Copy link
Member

Why is this not using the schema? This was asked here. But I don't see where it was ever addressed?

@cbravobernal
Copy link
Contributor Author

cbravobernal commented Sep 11, 2024

Code has been updated with this change #64072 (comment)

Copy link
Contributor

@artemiomorales artemiomorales left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Continues to work as expected with the most recent changes 👍

I think all that's missing are some tests. Having them as part of this PR makes the most sense, though those could also be added separately.

@SantosGuillamot
Copy link
Contributor

SantosGuillamot commented Sep 16, 2024

I'll try to clarify the object_subtype issue mentioned here.

Let's imagine I have a website with posts, pages, and movies (Custom Post Type). And I register some custom fields:

  • any_post_type: This field is registered without object_subtype. It should be available for posts, pages AND movies.
  • only_posts: This field is registered with object_subtype => 'post'. It should be available ONLY for posts.
  • only_movies: This field is registered with object_subtype => 'movie'. It should be available ONLY for movies.
This is the code I'm using
function testing_fields_and_sources() {
	// Register movie custom post type.
	register_post_type(
		'movie',
		array(
			'label'        => 'Movie',
			'public'       => true,
			'supports'     => array( 'title', 'editor', 'comments', 'revisions', 'trackbacks', 'author', 'excerpt', 'page-attributes', 'thumbnail', 'custom-fields', 'post-formats' ),
			'has_archive'  => true,
			'show_in_rest' => true,
		),
	);

	// Register fields
	register_meta(
		'post',
		'any_post_type',
		array(
			'show_in_rest' => true,
			'type'         => 'string',
			'default'      => 'Any Post Type',
		)
	);
	register_meta(
		'post',
		'only_for_movies',
		array(
			'show_in_rest'   => true,
			'type'           => 'string',
			'default'        => 'Movie Specific',
			'object_subtype' => 'movie',
		)
	);
	register_meta(
		'post',
		'only_for_posts',
		array(
			'show_in_rest'   => true,
			'type'           => 'string',
			'default'        => 'Post Specific',
			'object_subtype' => 'post',
		)
	);
}

add_action( 'init', 'testing_fields_and_sources' );

So far so good. Let's review how this translates while creating connections in templates. Depending on the template I am, i expect to see different fields.

  • Single movie template: I expect to see the fields registered only for movies AND fields registered for any post type. This means only_movies and any_post_type. This works as expected.
  • Single post template: I expect to see the fields registered only for posts AND fields registered for any post type. This means only_posts and any_post_type. This works as expected.
  • Custom templates or index: There are templates that can be apply to any post type (posts, pages, movies). I expect to see ONLY the fields registered for ANY post types. This means just any_post_type. This doesn't work as expected, because it includes the fields registered for post (only_posts).

This last case doesn't work because we are adding a fallback to post when we can't inherit the post type here. However, there is no way to differentiate between the fields that have been registered for any post type and the fields registered only for posts. That's why we were exploring a way of getting only the fields registered without object_subtype.

Basically, we wanted a way to get the fields registered WITHOUT object_subtype to only show those in templates that can apply to any post type. Right now, the fields registered with object_subtype => 'post' are also shown.

Having said that, if it isn't clear how to do so, I believe we could work on that part in a follow-up pull request. I don't think registering a meta field with object_subtype => 'post' is the most common use case.


Apart from that, I made this commit which potentially fixes the useSelect warning and I'll review the latest changes to this pull request. I believe it is close to being ready.

Copy link
Contributor

@SantosGuillamot SantosGuillamot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The pull request looks good to me aside from the problem mentioned here where fields registered only for "posts" are shown in templates that could apply to any post type. But I believe we can explore that in a follow-up PR.

I'd appreciate a second check because I have been deeply involved in the code.

Some aspects I checked:

  • I can connect custom fields in CPT templates like "movies" or "videogames".
  • Only the relevant fields are shown in those templates.
  • It shows the default values and it fallback to the meta key when they don't exist.
  • Other contexts like post editing seem to work as before.

@SantosGuillamot
Copy link
Contributor

In the latest commit, I removed support for templates that can apply to any post type. I think it is safer to go this way and explore how to handle it in a follow-up PR.

@cbravobernal cbravobernal merged commit 893181e into trunk Sep 17, 2024
61 checks passed
@cbravobernal cbravobernal deleted the experiment/add-meta-post-type-api branch September 17, 2024 20:22
@cbravobernal
Copy link
Contributor Author

Merging this so it lands in next Gutenberg release.
I'll work on a e2e battery in a following up PRs.

@github-actions github-actions bot added this to the Gutenberg 19.3 milestone Sep 17, 2024
@gziolo
Copy link
Member

gziolo commented Sep 18, 2024

I left a couple of notes to better understand the implementation. Great work figuring out how to expose the list of meta fields. When paired with the new label property on meta fields, this is going to work nicely in WordPress 6.7.

// `useSelect` is used purposely here to ensure `getFieldsList`
// is updated whenever there are updates in block context.
// `source.getFieldsList` may also call a selector via `registry.select`.
const _fieldsList = {};
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the reason to keep that const outside of useSelect and modify it with the selector?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I move the const inside the useSelect, it interprets it is a new object each time it goes through it, resulting in this warning:

The 'useSelect' hook returns different values when called with the same state and parameters. This can lead to unnecessary rerenders.

I must say I am not fully familiar with how this should work, but it is the only way I found to avoid that message.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you open PR without this local variable that hides the underlying issue? I would recommend asking for help from some folks who have experienced with the internals of useSelect like @jsnajdr and @Mamaduka.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally you should memoize the fieldsList value but here it's almost impossible because the data come from so many different sources. Any getFieldsList callback can select from any store it wants.

The easiest solution is to:

  • return the fieldsList as the top-level object in the useSelect result. const fieldsList = useSelect( ... )
  • move the canUpdateBlockBindings select to its own useSelect call. The two selects don't have anything in common anyway, the select from completely different stores.

That should remove the warning.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've started exploring this here. As commented there, it seems just making these changes is not enough. We can keep the discussion in the other PR.

@gencmedya

This comment was marked as off-topic.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Block bindings REST API Interaction Related to REST API [Type] Experimental Experimental feature or API.
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.