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

[Site Editor]: Add fallback template content on creation #42520

Merged
merged 7 commits into from
Aug 4, 2022

Conversation

ntsekouras
Copy link
Contributor

What?

Resolves: #36648
Alternative of: #42007, #41848, #37054

Why?

This PR finds and adds fallback template content on creation. It does so in server-side - without a strong opinion about this..

Testing Instructions

  1. In site editor create templates and expect them to have the respective fallback template content from Template Hierarchy
    .

Examples:

  1. If we have category template it will be the fallback content for any specific category template
  2. If we only have archive template(not category) it will be the fallback content for any specific category template
  3. If we have only singular template it will be the fallback content for any specific postType post(single-book-hello, single-post, single-post-hi) and for page, single and attachment templates
  4. front-page will fallback to home

Notes

  1. Every new template right now fallbacks to index template content, if no better match is found.
  2. We could add some specific starting content for templates that doesn't make much sense to fallback to index like 404 in a follow up.

@ntsekouras ntsekouras added [Type] Enhancement A suggestion for improvement. Core REST API Task Task for Core REST API efforts [Feature] Site Editor Related to the overarching Site Editor (formerly "full site editing") labels Jul 19, 2022
@ntsekouras ntsekouras self-assigned this Jul 19, 2022
@github-actions
Copy link

github-actions bot commented Jul 19, 2022

Size Change: +537 B (0%)

Total Size: 1.27 MB

Filename Size Change
build/block-library/index.min.js 185 kB +76 B (0%)
build/components/index.min.js 231 kB +1 B (0%)
build/edit-site/index.min.js 55.8 kB +106 B (0%)
build/element/index.min.js 4.68 kB +354 B (+8%) 🔍
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 982 B
build/annotations/index.min.js 2.76 kB
build/api-fetch/index.min.js 2.26 kB
build/autop/index.min.js 2.14 kB
build/blob/index.min.js 475 B
build/block-directory/index.min.js 6.58 kB
build/block-directory/style-rtl.css 990 B
build/block-directory/style.css 991 B
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/index.min.js 154 kB
build/block-editor/style-rtl.css 14.7 kB
build/block-editor/style.css 14.7 kB
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 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 103 B
build/block-library/blocks/audio/style.css 103 B
build/block-library/blocks/audio/theme-rtl.css 110 B
build/block-library/blocks/audio/theme.css 110 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 59 B
build/block-library/blocks/avatar/style.css 59 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 441 B
build/block-library/blocks/button/editor.css 441 B
build/block-library/blocks/button/style-rtl.css 542 B
build/block-library/blocks/button/style.css 542 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 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 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 187 B
build/block-library/blocks/comment-template/style.css 185 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 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 834 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 630 B
build/block-library/blocks/cover/editor-rtl.css 615 B
build/block-library/blocks/cover/editor.css 616 B
build/block-library/blocks/cover/style-rtl.css 1.55 kB
build/block-library/blocks/cover/style.css 1.55 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 110 B
build/block-library/blocks/embed/theme.css 110 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 253 B
build/block-library/blocks/file/style.css 254 B
build/block-library/blocks/file/view.min.js 346 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 948 B
build/block-library/blocks/gallery/editor.css 950 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 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 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 327 B
build/block-library/blocks/html/editor.css 329 B
build/block-library/blocks/image/editor-rtl.css 736 B
build/block-library/blocks/image/editor.css 737 B
build/block-library/blocks/image/style-rtl.css 627 B
build/block-library/blocks/image/style.css 630 B
build/block-library/blocks/image/theme-rtl.css 110 B
build/block-library/blocks/image/theme.css 110 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 463 B
build/block-library/blocks/latest-posts/style.css 462 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 705 B
build/block-library/blocks/navigation-link/editor.css 703 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation-submenu/view.min.js 423 B
build/block-library/blocks/navigation/editor-rtl.css 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 kB
build/block-library/blocks/navigation/style-rtl.css 1.96 kB
build/block-library/blocks/navigation/style.css 1.95 kB
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 443 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 363 B
build/block-library/blocks/page-list/editor.css 363 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 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 260 B
build/block-library/blocks/paragraph/style.css 260 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 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 493 B
build/block-library/blocks/post-comments-form/style.css 493 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 605 B
build/block-library/blocks/post-featured-image/editor.css 605 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 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 282 B
build/block-library/blocks/post-template/style.css 282 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 370 B
build/block-library/blocks/pullquote/style.css 370 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 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 282 B
build/block-library/blocks/query-pagination/style.css 278 B
build/block-library/blocks/query/editor-rtl.css 365 B
build/block-library/blocks/query/editor.css 364 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 385 B
build/block-library/blocks/search/style.css 386 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 464 B
build/block-library/blocks/shortcode/editor.css 464 B
build/block-library/blocks/site-logo/editor-rtl.css 708 B
build/block-library/blocks/site-logo/editor.css 708 B
build/block-library/blocks/site-logo/style-rtl.css 192 B
build/block-library/blocks/site-logo/style.css 192 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.39 kB
build/block-library/blocks/social-links/style.css 1.38 kB
build/block-library/blocks/spacer/editor-rtl.css 322 B
build/block-library/blocks/spacer/editor.css 322 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/editor-rtl.css 494 B
build/block-library/blocks/table/editor.css 494 B
build/block-library/blocks/table/style-rtl.css 611 B
build/block-library/blocks/table/style.css 609 B
build/block-library/blocks/table/theme-rtl.css 175 B
build/block-library/blocks/table/theme.css 175 B
build/block-library/blocks/tag-cloud/style-rtl.css 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 235 B
build/block-library/blocks/template-part/editor.css 235 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 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 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 561 B
build/block-library/blocks/video/editor.css 563 B
build/block-library/blocks/video/style-rtl.css 159 B
build/block-library/blocks/video/style.css 159 B
build/block-library/blocks/video/theme-rtl.css 110 B
build/block-library/blocks/video/theme.css 110 B
build/block-library/common-rtl.css 1.01 kB
build/block-library/common.css 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 10.9 kB
build/block-library/editor.css 10.9 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 11.8 kB
build/block-library/style.css 11.9 kB
build/block-library/theme-rtl.css 695 B
build/block-library/theme.css 700 B
build/block-serialization-default-parser/index.min.js 1.11 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 47.3 kB
build/components/style-rtl.css 14.1 kB
build/components/style.css 14.1 kB
build/compose/index.min.js 11.7 kB
build/core-data/index.min.js 14.7 kB
build/customize-widgets/index.min.js 11.3 kB
build/customize-widgets/style-rtl.css 1.4 kB
build/customize-widgets/style.css 1.4 kB
build/data-controls/index.min.js 653 B
build/data/index.min.js 8.03 kB
build/date/index.min.js 32 kB
build/deprecated/index.min.js 507 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.69 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 4.02 kB
build/edit-navigation/style.css 4.03 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 30.5 kB
build/edit-post/style-rtl.css 6.94 kB
build/edit-post/style.css 6.94 kB
build/edit-site/style-rtl.css 8.22 kB
build/edit-site/style.css 8.21 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.35 kB
build/edit-widgets/style.css 4.35 kB
build/editor/index.min.js 41.3 kB
build/editor/style-rtl.css 3.66 kB
build/editor/style.css 3.65 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 6.75 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.64 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.77 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.78 kB
build/keycodes/index.min.js 1.39 kB
build/list-reusable-blocks/index.min.js 1.74 kB
build/list-reusable-blocks/style-rtl.css 835 B
build/list-reusable-blocks/style.css 835 B
build/media-utils/index.min.js 2.93 kB
build/notices/index.min.js 953 B
build/nux/index.min.js 2.05 kB
build/nux/style-rtl.css 732 B
build/nux/style.css 728 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.22 kB
build/preferences/index.min.js 1.3 kB
build/primitives/index.min.js 933 B
build/priority-queue/index.min.js 612 B
build/react-i18n/index.min.js 696 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.74 kB
build/reusable-blocks/index.min.js 2.22 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.53 kB
build/token-list/index.min.js 644 B
build/url/index.min.js 3.61 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.19 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@jameskoster
Copy link
Contributor

Every new template right now fallbacks to index template content, if no better match is found.

I'm finding this happens when creating a $custom template, even with single exists.

Everything else seems to be working well.

@ockham
Copy link
Contributor

ockham commented Jul 20, 2022

@TimothyBJacobs had a few suggestions over at #42007 that might make sense to apply to this PR. I'm not quite familiar enough with the intricacies of the REST API to know what exactly they would look like when applied, but maybe @TimothyBJacobs you can leave a few notes here? 😄

Copy link
Contributor

@ockham ockham left a comment

Choose a reason for hiding this comment

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

Okay, I guess we can keep gutenberg_get_template_hierarchy as-is if you prefer.

Overall, this is testing well. I've added a few more suggestions; I'll recap them here for easier readability:

  • Let's consider using the existing endpoint route, and replying with a 302 redirect to the fallback template if the requested template doesn't exist (see).
  • Let's maybe add unit tests for gutenberg_get_template_hierarchy itself (rather than only for the endpoint) -- IMO, it's good to cover the lower-level function as well, in case we'd like to e.g. reuse it elsewhere.
  • Let's at least add a TODO about special cases with hyphenated post types (see).
  • @jameskoster suggested having Custom templates fall back to Single, which IMO makes sense (see).

@ntsekouras
Copy link
Contributor Author

Thanks again for the thorough review Bernie! I haven't addressed all your comments now, but I will, at the start of next week and will follow up on this PR.

  • Let's maybe add unit tests for gutenberg_get_template_hierarchy itself (rather than only for the endpoint) -- IMO, it's good to cover the lower-level function as well, in case we'd like to e.g. reuse it elsewhere.
  • @jameskoster suggested having Custom templates fall back to Single, which IMO makes sense (see).

Agreed on the above.

  • Let's at least add a TODO about special cases with hyphenated post types (see).

I'll try adding this in this PR.

@ntsekouras ntsekouras force-pushed the add/fallback-template-content-on-creation branch from c137cfa to 3a035bd Compare July 26, 2022 08:18
@ntsekouras
Copy link
Contributor Author

This is ready for another round of testing and reviews.

I moved the template hierarchy calculation in client side as the template resolution in core is quite different than our use case. In our case we have a template slug(to be created) but we also have information about the post type or taxonomy slug this template is associated with. In front end core template resolution information needed are extracted by the current route the WP_Query object etc, which are not available to us to make the request to get the fallback.

related comment from @ockham above:

While we cannot directly re-use either part (since they're tightly coupled to the frontend, the current route, and the WP_Query object).

Other updates:

  1. Now the custom templates should fallback properly to [ 'page', 'singular', 'index' ].
  2. Multi word slugs of taxonomies, post types, etc.. should work properly
  3. Added unit tests to the client side implementation for template hierarchy.

@jameskoster
Copy link
Contributor

I can't comment on the code, but everything is working really well for me 🎉

@ockham
Copy link
Contributor

ockham commented Jul 28, 2022

Thanks a lot for all your work, @ntsekouras!

TBH I liked it better before fc72112 😅 Can we maybe revert that? (13563e2 is fine.)

I swear I came back to this PR fully expecting to sign off on it 😅 But I feel that fc72112 just adds a bunch of complexity, and the lookup endpoint seems to make less sense to me than before: We're basically now computing all information about template resolution on the client side:

Bildschirmfoto 2022-07-28 um 12 51 43

The only information we get from the endpoint is which of these templates exists. Aside from the fact that the slug argument seems redundant now: It seems weird to have a dedicated endpoint just to loop through a list of templates and check for their existence. I still think that template resolution (even our version of it which doesn't involve a WP_Query) does have its place in the REST API -- it might come in handy for other clients (maybe serverless themes?).

Other than that, fc72112 adds a lot of complexity and introduces new concepts (such as the meta argument to getTemplateHierarchy), which I believe could potentially make template resolution look even more complicated than it is.

Again, I really appreciate your work; I'm sorry if my earlier suggestions maybe nudged you into a direction you didn't really wanted this PR to go. Anyway, I'd hate for this to result in a compromise that neither of us are happy with.

So let's revert fc72112, and I'll give approval -- sound good? 😊

@ntsekouras
Copy link
Contributor Author

Thanks for the feedback Bernie! It's great to discuss things to try to find the best solution possible, so no worries at all if the process takes a bit longer 😄

Other than that, fc72112 adds a lot of complexity and introduces new concepts (such as the meta argument to getTemplateHierarchy), which I believe could potentially make template resolution look even more complicated than it is.

Actually complexity was the reason I decided to move this client side.. It's not enough to revert as the initial implementation had the issue of multiple words slugs in post types or taxonomies, etc..

So in order to implement that I think the complexity explodes, because we would need to get_post_types, get_taxonomies, etc.. and make checks for each of them if it is part of the slug(also specific part to the slug - not if it exists somewhere), also handle the aliases for some of them like post_tag->tag just to extract what we already have available in the client side.

Do you think we can do the above in php simpler than it is client side now? I think the bigger part of the js util will be the same in php, with the exception of replacing the available meta with the above extraction new logic.

@ockham
Copy link
Contributor

ockham commented Jul 28, 2022

Actually complexity was the reason I decided to move this client side.. It's not enough to revert as the initial implementation had the issue of multiple words slugs in post types or taxonomies, etc..

Ah right, I hadn't seen that! Thanks for clarifying 👍

So in order to implement that I think the complexity explodes, because we would need to get_post_types, get_taxonomies, etc.. and make checks for each of them if it is part of the slug(also specific part to the slug - not if it exists somewhere), also handle the aliases for some of them like post_tag->tag just to extract what we already have available in the client side.

I'm not 100% sure it can be done more simply on the server, but I'd say that since the server is the ultimate source of truth that knows which post types and taxonomies exist, it makes sense to do it there -- anything on the client side would have to either fetch the same info from the server via the REST API, or duplicate it via something like templatePrefix. I feel like it'd be better to instead do the heavy lifting on the server and provide template resolution "as a service" 😅 via the REST API. If I'm not mistaken, this should make it easier for the consumer on the client side (no templatePrefix needed).

In terms of code, I'd vaguely do the following, given a $slug such as taxonomy-greek-books-action-adventure:

  1. Split around the -s into, say, $slug_parts.
  2. Treat $slug_parts[0] as the overarching $template_type.
  3. Iterate over all possible combinations of the remaining slug parts, grouped in two parts:
    • greek-books-action-adventure
    • greek and books-action-adventure
    • greek-books and action-adventure
    • greek-books-action and adventure
  4. For each of them, check if the first part matches an existing taxonomy, and the second part an existing term within that taxonomy. Break out of the loop if both are true.

Does that make sense? It shouldn't introduce too much overhead in practice, since most slugs won't have that many -s anyway -- and even if they do, there aren't that many combinations to loop over.

Even if the code ends up slightly more complex, I think it's well worth it to avoid having the consumer on the client side do more legwork 🙂

(I have to admit I didn't quite get the part about "aliases for some of them like post_tag->tag", so I might be missing something.)

Copy link
Contributor

@mcsf mcsf left a comment

Choose a reason for hiding this comment

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

Left a little remark, but otherwise LGTM!

I have one parting question, though: why compute the hierarchy on the client before requesting the .../lookup endpoint with { slug, hierarchy }? Why not just request the endpoint with { slug, isCustom, templatePrefix } and let the server do the work?

@ntsekouras ntsekouras force-pushed the add/fallback-template-content-on-creation branch from fc72112 to d1eb0d0 Compare August 3, 2022 06:56
@ntsekouras
Copy link
Contributor Author

-- anything on the client side would have to either fetch the same info from the server via the REST API, or duplicate it via something like templatePrefix. I feel like it'd be better to instead do the heavy lifting on the server and provide template resolution "as a service"

(I have to admit I didn't quite get the part about "aliases for some of them like post_tag->tag", so I might be missing something.)

Why not just request the endpoint with { slug, isCustom, templatePrefix } and let the server do the work?

I moved the logic server side again with the extra args Miguel suggested. All this heavy lifting for slugs, alias, etc.. is already necessary in client side so there is no need to over complicate things in server side to fetch and match post types, taxonomies, etc.. We can revisit in the future of course if the need arises..

Thank you all for the reviews and testing and especially @ockham 😄

Copy link
Contributor

@jameskoster jameskoster left a comment

Choose a reason for hiding this comment

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

I tested a whole bunch of flows and everything is working as expected for me. Very excicted to get this merged 😁

One thing did trip me up, but it's a bit of an edge case: I had an empty category template, so when I created a template for my 'Uncategorized' post category, that was also empty. As a follow-up I wonder if it would be good to skip empty templates?

Copy link
Contributor

@mcsf mcsf left a comment

Choose a reason for hiding this comment

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

Your changes look good, but let me know what your thoughts are on the client vs. server matter.

Comment on lines +311 to +312
*/
function get_template_hierarchy( $slug, $is_custom = false, $template_prefix = '' ) {
Copy link
Contributor

Choose a reason for hiding this comment

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

One concern with moving this logic to the server is accidentally committing to supporting a function forever. What do you think of:

Suggested change
*/
function get_template_hierarchy( $slug, $is_custom = false, $template_prefix = '' ) {
* @access private
* @internal
*/
function get_template_hierarchy( $slug, $is_custom = false, $template_prefix = '' ) {
Suggested change
*/
function get_template_hierarchy( $slug, $is_custom = false, $template_prefix = '' ) {
*/
function _gutenberg_get_template_hierarchy( $slug, $is_custom = false, $template_prefix = '' ) {

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I don't think we should have a gutenberg prefix in core, also the logic in this function would need to change if the template hierarchy logic changes, and I don't imagine this will happen any time soon.

Copy link
Member

Choose a reason for hiding this comment

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

I wish we had something like https://github.com/Brain-WP/Hierarchy in the core.

@ntsekouras ntsekouras merged commit f99819b into trunk Aug 4, 2022
@ntsekouras ntsekouras deleted the add/fallback-template-content-on-creation branch August 4, 2022 05:55
@github-actions github-actions bot added this to the Gutenberg 13.9 milestone Aug 4, 2022
@mtias
Copy link
Member

mtias commented Aug 4, 2022

Thank you all for landing this!

@mtias mtias mentioned this pull request Aug 17, 2022
43 tasks
@femkreations femkreations added the Needs User Documentation Needs new user documentation label Sep 4, 2022
pento pushed a commit to WordPress/wordpress-develop that referenced this pull request Sep 20, 2022
…e content.

This commit improves site editor templates by:

* Adds a post meta `is_wp_suggestion` to templates created from the site editor.

Why? To differentiate the templates created from the post editor in the Template panel in inspector controls and the templates suggested in site editor.

See [WordPress/gutenberg#41387 Gutenberg PR 41387] for more details.

* Expands the template types that can be added to the site editor to include single custom post type and specific posts templates.

See [WordPress/gutenberg#41189 Gutenberg PR 41189] for more details.

* Adds fallback template content on creation in site editor:
   * Introduces `get_template_hierarchy()` to get the template hierarchy for a given template slug to be created.
   * Adds a `lookup` route to `WP_REST_Templates_Controller` to get the fallback template content.

See [WordPress/gutenberg#42520 Gutenberg PR 42520] for more details.

* Fixes a typo in default category template's description within `get_default_block_template_types()`.

See [WordPress/gutenberg#42586 Gutenberg PR 42586] for more details.

* Changes field checks from `in_array()` to `rest_is_field_included()` in `WP_REST_Post_Types_Controller`.
* Adds an `icon` field to `WP_REST_Post_Types_Controller`

Follow-up to [53129], [52331], [52275], [52062], [51962], [43087].

Props ntsekouras, spacedmonkey, mamaduka, mburridge, jameskoster, bernhard-reiter, mcsf, hellofromTonya.
See #56467.

git-svn-id: https://develop.svn.wordpress.org/trunk@54269 602fd350-edb4-49c9-b593-d223f7449a82
markjaquith pushed a commit to markjaquith/WordPress that referenced this pull request Sep 20, 2022
…e content.

This commit improves site editor templates by:

* Adds a post meta `is_wp_suggestion` to templates created from the site editor.

Why? To differentiate the templates created from the post editor in the Template panel in inspector controls and the templates suggested in site editor.

See [WordPress/gutenberg#41387 Gutenberg PR 41387] for more details.

* Expands the template types that can be added to the site editor to include single custom post type and specific posts templates.

See [WordPress/gutenberg#41189 Gutenberg PR 41189] for more details.

* Adds fallback template content on creation in site editor:
   * Introduces `get_template_hierarchy()` to get the template hierarchy for a given template slug to be created.
   * Adds a `lookup` route to `WP_REST_Templates_Controller` to get the fallback template content.

See [WordPress/gutenberg#42520 Gutenberg PR 42520] for more details.

* Fixes a typo in default category template's description within `get_default_block_template_types()`.

See [WordPress/gutenberg#42586 Gutenberg PR 42586] for more details.

* Changes field checks from `in_array()` to `rest_is_field_included()` in `WP_REST_Post_Types_Controller`.
* Adds an `icon` field to `WP_REST_Post_Types_Controller`

Follow-up to [53129], [52331], [52275], [52062], [51962], [43087].

Props ntsekouras, spacedmonkey, mamaduka, mburridge, jameskoster, bernhard-reiter, mcsf, hellofromTonya.
See #56467.
Built from https://develop.svn.wordpress.org/trunk@54269


git-svn-id: http://core.svn.wordpress.org/trunk@53828 1a063a9b-81f0-0310-95a4-ce76da25c4cd
github-actions bot pushed a commit to gilzow/wordpress-performance that referenced this pull request Sep 20, 2022
…e content.

This commit improves site editor templates by:

* Adds a post meta `is_wp_suggestion` to templates created from the site editor.

Why? To differentiate the templates created from the post editor in the Template panel in inspector controls and the templates suggested in site editor.

See [WordPress/gutenberg#41387 Gutenberg PR 41387] for more details.

* Expands the template types that can be added to the site editor to include single custom post type and specific posts templates.

See [WordPress/gutenberg#41189 Gutenberg PR 41189] for more details.

* Adds fallback template content on creation in site editor:
   * Introduces `get_template_hierarchy()` to get the template hierarchy for a given template slug to be created.
   * Adds a `lookup` route to `WP_REST_Templates_Controller` to get the fallback template content.

See [WordPress/gutenberg#42520 Gutenberg PR 42520] for more details.

* Fixes a typo in default category template's description within `get_default_block_template_types()`.

See [WordPress/gutenberg#42586 Gutenberg PR 42586] for more details.

* Changes field checks from `in_array()` to `rest_is_field_included()` in `WP_REST_Post_Types_Controller`.
* Adds an `icon` field to `WP_REST_Post_Types_Controller`

Follow-up to [53129], [52331], [52275], [52062], [51962], [43087].

Props ntsekouras, spacedmonkey, mamaduka, mburridge, jameskoster, bernhard-reiter, mcsf, hellofromTonya.
See #56467.
Built from https://develop.svn.wordpress.org/trunk@54269


git-svn-id: https://core.svn.wordpress.org/trunk@53828 1a063a9b-81f0-0310-95a4-ce76da25c4cd
ootwch pushed a commit to ootwch/wordpress-develop that referenced this pull request Nov 4, 2022
…e content.

This commit improves site editor templates by:

* Adds a post meta `is_wp_suggestion` to templates created from the site editor.

Why? To differentiate the templates created from the post editor in the Template panel in inspector controls and the templates suggested in site editor.

See [WordPress/gutenberg#41387 Gutenberg PR 41387] for more details.

* Expands the template types that can be added to the site editor to include single custom post type and specific posts templates.

See [WordPress/gutenberg#41189 Gutenberg PR 41189] for more details.

* Adds fallback template content on creation in site editor:
   * Introduces `get_template_hierarchy()` to get the template hierarchy for a given template slug to be created.
   * Adds a `lookup` route to `WP_REST_Templates_Controller` to get the fallback template content.

See [WordPress/gutenberg#42520 Gutenberg PR 42520] for more details.

* Fixes a typo in default category template's description within `get_default_block_template_types()`.

See [WordPress/gutenberg#42586 Gutenberg PR 42586] for more details.

* Changes field checks from `in_array()` to `rest_is_field_included()` in `WP_REST_Post_Types_Controller`.
* Adds an `icon` field to `WP_REST_Post_Types_Controller`

Follow-up to [53129], [52331], [52275], [52062], [51962], [43087].

Props ntsekouras, spacedmonkey, mamaduka, mburridge, jameskoster, bernhard-reiter, mcsf, hellofromTonya.
See #56467.

git-svn-id: https://develop.svn.wordpress.org/trunk@54269 602fd350-edb4-49c9-b593-d223f7449a82
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Core REST API Task Task for Core REST API efforts [Feature] Site Editor Related to the overarching Site Editor (formerly "full site editing") Needs User Documentation Needs new user documentation [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Block Template creation is using empty content instead of the appropiate fallback
8 participants