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

Templates: add postTypes and isCustom fields & filters #62075

Open
wants to merge 11 commits into
base: trunk
Choose a base branch
from

Conversation

oandregal
Copy link
Member

@oandregal oandregal commented May 28, 2024

Part of #59659

What?

Adds two new fields to the templates (postTypes & isCustom).

Post types (postTypes field) Type (isCustom field)
Captura de ecrã 2024-05-28, às 17 14 22 Captura de ecrã 2024-05-28, às 17 14 05

Why?

This is a preliminary step to use this to provide a new sidebar filters that include "Posts", "Pages", and "Custom", as per #59659

How?

  • c821e44 Adds isCustom field & filter in the client. Displays it as a badge in the grid layout, and only renders the Custom value.
  • 4cea711 Adds postType field & filter in the client.
  • f7b953e Declares post_types in the templates REST endpoint.
  • 16518e7 Backport changelog.

Testing Instructions

Visit Site Editor > Templates and verify there's two new fields (hidden by default) and filters.

TODO

  • Verify postType logic. The current logic only accounts for templates the theme intended to register for a given post type. However, when switching templates (Post editor > swap templates), the user-created templates are also listed.

Copy link

github-actions bot commented May 28, 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: oandregal <[email protected]>
Co-authored-by: jameskoster <[email protected]>
Co-authored-by: youknowriad <[email protected]>
Co-authored-by: Aljullu <[email protected]>

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

@oandregal oandregal self-assigned this May 28, 2024
@oandregal oandregal added [Type] Enhancement A suggestion for improvement. [Feature] DataViews Work surrounding upgrading and evolving views in the site editor and beyond labels May 28, 2024
Copy link

This pull request has changed or added PHP files. Please confirm whether these changes need to be synced to WordPress Core, and therefore featured in the next release of WordPress.

If so, it is recommended to create a new Trac ticket and submit a pull request to the WordPress Core Github repository soon after this pull request is merged.

If you're unsure, you can always ask for help in the #core-editor channel in WordPress Slack.

Thank you! ❤️

View changed files
❔ lib/compat/wordpress-6.6/rest-api.php

},
},
{
header: __( 'Type' ),
Copy link
Member Author

Choose a reason for hiding this comment

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

I've made the following decisions about how to present the isCustom field to the user:

  • Called it Type. Alternatives: Template type, Is custom?.
  • Displayed it as a badge field in the grid layout, as we do for other boolean-type fields (sync status in patterns).
  • In any layout, it'd only render "Custom" if the template is custom. If it is not, it'll render an empty value. Alternatively, it could say "Default".

This is a concept that requires a certain knowledge of WordPress templates, so I was unsure about how to simplify it further. Happy to hear thoughts.

Copy link
Contributor

Choose a reason for hiding this comment

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

Yeah this is very tricky.

  • I'm not sure about displaying the type as a badge; it might not be obvious what this refers to without the label?
  • 'Type' suggests multiple options... It's odd that the column is either empty or 'custom'. Would it be feasible to add other types? E.g. Archive, Single, Utility? Combined with the post type filter this could potentially work quite well.
  • I'd probably hide this field by default.

Copy link
Member Author

@oandregal oandregal May 29, 2024

Choose a reason for hiding this comment

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

It's odd that the column is either empty or 'custom'. Would it be feasible to add other types? E.g. Archive, Single, Utility? Combined with the post type filter this could potentially work quite well.

To be honest, I'm struggling to see the value of this field/filter in isolation: having the postTypes one enables users to search for templates bound that those post types — which are considered custom already, so this Type is a redundant. Is there any other value to it I'm not seeing?

For adding more types: is there any stablished categorization of templates I can look at? That could be useful, though I wouldn't want to introduce a new concept to templates in this PR.

If this field doesn't provide much value right now, I'd rather start with postTypes only.

Copy link
Contributor

@jameskoster jameskoster May 29, 2024

Choose a reason for hiding this comment

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

I think the main motivator was to provide a way to replicate the 'Custom' section in 6.5's Templates sidebar:

Screenshot 2024-05-29 at 14 49 17

Without this filter it wouldn't be possible to view custom templates easily which could be seen as a regression? Possibly a bad idea, but could the filter be hidden in the UI but still function as part of a 'Custom' view? I think pattern categories work a similar way.


The template hierarchy resolves by page type, essentially; "Archive", "Singular", "Front Page", "Posts Page", "Search Results", "404".

Grouping by "Archive", "Singular", and "Utility" seems reasonable, but I don't think it's defined in the code. Agree it seems late to be adding this complexity.

Copy link
Member Author

Choose a reason for hiding this comment

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

The template hierarchy resolves by page type, essentially; "Archive", "Singular", "Front Page", "Posts Page", "Search Results", "404".

I feel this is the best solution, and I'm also wary to introduce it this close to the beta.

If we agree exposing those types would be best long-term, a plan for 6.6 can be:

  • naming the field "Type", so we can reuse it later
  • its values for now are "Custom" / "Not custom" — we can add more granularity in 6.7 ("Archive", etc.)

Thoughts?

Pushed this approach at 895214a. Made the field hidden by default and not a badge as well.

Copy link
Contributor

Choose a reason for hiding this comment

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

How do you feel about implementing the filter with custom / not custom as values, but hiding it in the UI for 6.6?

We can then use it to add a 'Custom' view, including a description about what custom templates are. This would be similar (I think) to categories in the Patterns page.

Screenshot 2024-05-30 at 12 23 21

This would be dependent on updating the frame titles, but there's a PR for that ready to go.

Copy link

github-actions bot commented May 28, 2024

Size Change: +320 B (+0.02%)

Total Size: 1.74 MB

Filename Size Change
build/block-editor/index.min.js 261 kB +52 B (+0.02%)
build/blocks/index.min.js 51.7 kB -37 B (-0.07%)
build/edit-site/index.min.js 211 kB +277 B (+0.13%)
build/edit-site/style-rtl.css 12 kB +24 B (+0.2%)
build/edit-site/style.css 12 kB +24 B (+0.2%)
build/editor/index.min.js 93.1 kB +11 B (+0.01%)
build/format-library/index.min.js 8.05 kB -31 B (-0.38%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.27 kB
build/api-fetch/index.min.js 2.32 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 578 B
build/block-directory/index.min.js 7.29 kB
build/block-directory/style-rtl.css 1.03 kB
build/block-directory/style.css 1.03 kB
build/block-editor/content-rtl.css 4.58 kB
build/block-editor/content.css 4.57 kB
build/block-editor/default-editor-styles-rtl.css 395 B
build/block-editor/default-editor-styles.css 395 B
build/block-editor/style-rtl.css 15.6 kB
build/block-editor/style.css 15.6 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 90 B
build/block-library/blocks/archives/style.css 90 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 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 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 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/button/editor-rtl.css 307 B
build/block-library/blocks/button/editor.css 307 B
build/block-library/blocks/button/style-rtl.css 539 B
build/block-library/blocks/button/style.css 539 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 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 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 421 B
build/block-library/blocks/columns/style.css 421 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 199 B
build/block-library/blocks/comment-template/style.css 198 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 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 667 B
build/block-library/blocks/cover/editor.css 670 B
build/block-library/blocks/cover/style-rtl.css 1.62 kB
build/block-library/blocks/cover/style.css 1.61 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 312 B
build/block-library/blocks/embed/editor.css 312 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 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 326 B
build/block-library/blocks/file/editor.css 327 B
build/block-library/blocks/file/style-rtl.css 280 B
build/block-library/blocks/file/style.css 281 B
build/block-library/blocks/file/view.min.js 324 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/form-input/editor-rtl.css 227 B
build/block-library/blocks/form-input/editor.css 227 B
build/block-library/blocks/form-input/style-rtl.css 343 B
build/block-library/blocks/form-input/style.css 343 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 340 B
build/block-library/blocks/form-submission-notification/editor.css 340 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 471 B
build/block-library/blocks/freeform/editor-rtl.css 2.61 kB
build/block-library/blocks/freeform/editor.css 2.61 kB
build/block-library/blocks/gallery/editor-rtl.css 962 B
build/block-library/blocks/gallery/editor.css 965 B
build/block-library/blocks/gallery/style-rtl.css 1.72 kB
build/block-library/blocks/gallery/style.css 1.72 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 403 B
build/block-library/blocks/group/editor.css 403 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 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 189 B
build/block-library/blocks/heading/style.css 189 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 891 B
build/block-library/blocks/image/editor.css 891 B
build/block-library/blocks/image/style-rtl.css 1.52 kB
build/block-library/blocks/image/style.css 1.52 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.54 kB
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 205 B
build/block-library/blocks/latest-posts/editor.css 205 B
build/block-library/blocks/latest-posts/style-rtl.css 512 B
build/block-library/blocks/latest-posts/style.css 512 B
build/block-library/blocks/list/style-rtl.css 102 B
build/block-library/blocks/list/style.css 102 B
build/block-library/blocks/media-text/editor-rtl.css 306 B
build/block-library/blocks/media-text/editor.css 305 B
build/block-library/blocks/media-text/style-rtl.css 505 B
build/block-library/blocks/media-text/style.css 503 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 668 B
build/block-library/blocks/navigation-link/editor.css 669 B
build/block-library/blocks/navigation-link/style-rtl.css 193 B
build/block-library/blocks/navigation-link/style.css 192 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/editor-rtl.css 2.26 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.26 kB
build/block-library/blocks/navigation/style.css 2.25 kB
build/block-library/blocks/navigation/view.min.js 1.03 kB
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 377 B
build/block-library/blocks/page-list/editor.css 377 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 235 B
build/block-library/blocks/paragraph/editor.css 235 B
build/block-library/blocks/paragraph/style-rtl.css 341 B
build/block-library/blocks/paragraph/style.css 341 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 508 B
build/block-library/blocks/post-comments-form/style.css 508 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-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 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 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 734 B
build/block-library/blocks/post-featured-image/editor.css 732 B
build/block-library/blocks/post-featured-image/style-rtl.css 342 B
build/block-library/blocks/post-featured-image/style.css 342 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 397 B
build/block-library/blocks/post-template/style.css 396 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 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 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 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 344 B
build/block-library/blocks/pullquote/style.css 343 B
build/block-library/blocks/pullquote/theme-rtl.css 168 B
build/block-library/blocks/pullquote/theme.css 168 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 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 486 B
build/block-library/blocks/query/editor.css 486 B
build/block-library/blocks/query/view.min.js 958 B
build/block-library/blocks/quote/style-rtl.css 237 B
build/block-library/blocks/quote/style.css 237 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 140 B
build/block-library/blocks/read-more/style.css 140 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 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 184 B
build/block-library/blocks/search/editor.css 184 B
build/block-library/blocks/search/style-rtl.css 690 B
build/block-library/blocks/search/style.css 689 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 478 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 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 194 B
build/block-library/blocks/separator/theme.css 194 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 805 B
build/block-library/blocks/site-logo/editor.css 805 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 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 124 B
build/block-library/blocks/site-title/editor.css 124 B
build/block-library/blocks/site-title/style-rtl.css 70 B
build/block-library/blocks/site-title/style.css 70 B
build/block-library/blocks/social-link/editor-rtl.css 335 B
build/block-library/blocks/social-link/editor.css 335 B
build/block-library/blocks/social-links/editor-rtl.css 683 B
build/block-library/blocks/social-links/editor.css 681 B
build/block-library/blocks/social-links/style-rtl.css 1.51 kB
build/block-library/blocks/social-links/style.css 1.51 kB
build/block-library/blocks/spacer/editor-rtl.css 350 B
build/block-library/blocks/spacer/editor.css 350 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 395 B
build/block-library/blocks/table/editor.css 395 B
build/block-library/blocks/table/style-rtl.css 639 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 B
build/block-library/blocks/tag-cloud/style-rtl.css 265 B
build/block-library/blocks/tag-cloud/style.css 266 B
build/block-library/blocks/template-part/editor-rtl.css 393 B
build/block-library/blocks/template-part/editor.css 393 B
build/block-library/blocks/template-part/theme-rtl.css 112 B
build/block-library/blocks/template-part/theme.css 112 B
build/block-library/blocks/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 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 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 185 B
build/block-library/blocks/video/style.css 185 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12 kB
build/block-library/editor.css 12 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 218 kB
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 14.6 kB
build/block-library/style.css 14.6 kB
build/block-library/theme-rtl.css 703 B
build/block-library/theme.css 706 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/commands/index.min.js 15.2 kB
build/commands/style-rtl.css 953 B
build/commands/style.css 951 B
build/components/index.min.js 222 kB
build/components/style-rtl.css 12 kB
build/components/style.css 12 kB
build/compose/index.min.js 12.8 kB
build/core-commands/index.min.js 2.71 kB
build/core-data/index.min.js 72.5 kB
build/customize-widgets/index.min.js 10.9 kB
build/customize-widgets/style-rtl.css 1.36 kB
build/customize-widgets/style.css 1.36 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 9.01 kB
build/date/index.min.js 17.9 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.65 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 578 B
build/edit-post/index.min.js 13.4 kB
build/edit-post/style-rtl.css 2.35 kB
build/edit-post/style.css 2.35 kB
build/edit-widgets/index.min.js 17.5 kB
build/edit-widgets/style-rtl.css 4.21 kB
build/edit-widgets/style.css 4.21 kB
build/editor/style-rtl.css 8.86 kB
build/editor/style.css 8.87 kB
build/element/index.min.js 4.83 kB
build/escape-html/index.min.js 537 B
build/format-library/style-rtl.css 493 B
build/format-library/style.css 492 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/interactivity/debug.min.js 16.5 kB
build/interactivity/file.min.js 447 B
build/interactivity/image.min.js 1.67 kB
build/interactivity/index.min.js 13.3 kB
build/interactivity/navigation.min.js 1.17 kB
build/interactivity/query.min.js 740 B
build/interactivity/router.min.js 2.81 kB
build/interactivity/search.min.js 618 B
build/is-shallow-equal/index.min.js 527 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.14 kB
build/list-reusable-blocks/style-rtl.css 851 B
build/list-reusable-blocks/style.css 851 B
build/media-utils/index.min.js 2.92 kB
build/modules/importmap-polyfill.min.js 12.2 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 1.58 kB
build/nux/style-rtl.css 748 B
build/nux/style.css 744 B
build/patterns/index.min.js 6.51 kB
build/patterns/style-rtl.css 595 B
build/patterns/style.css 595 B
build/plugins/index.min.js 1.81 kB
build/preferences-persistence/index.min.js 2.06 kB
build/preferences/index.min.js 2.9 kB
build/preferences/style-rtl.css 719 B
build/preferences/style.css 721 B
build/primitives/index.min.js 831 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 1 kB
build/react-i18n/index.min.js 629 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.78 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.72 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.97 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 2.02 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.74 kB
build/vendors/react-dom.min.js 42.8 kB
build/vendors/react-jsx-runtime.min.js 554 B
build/vendors/react.min.js 2.65 kB
build/viewport/index.min.js 964 B
build/warning/index.min.js 249 B
build/widgets/index.min.js 7.13 kB
build/widgets/style-rtl.css 1.17 kB
build/widgets/style.css 1.17 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

@jameskoster
Copy link
Contributor

Unsure how it works, but the post type filter turned up some unexpected results for me:

  • post type = page didn't return the page.html template
  • post type = post didn't return single-post.html

When the post types field is visible, it's a little strange that some templates show the field, but others do not, especially in table layout. Should a appear for templates not associated with any particular post type? Similarly should there be an Any value for agnostic templates like Archive.html?

@oandregal
Copy link
Member Author

Unsure how it works, but the post type filter turned up some unexpected results for me:

I need to verify this logic to be the same we use when the user switches templates:

Gravacao.do.ecra.2024-05-28.as.18.00.48.mov

It seems that:

  • All the templates registered via customTemplates in the theme's theme.json (example for TwentyTwentyFour) should be displayed for its corresponding post type.
  • All the templates created by the user should be displayed for both post and page post types.
  • Some extra templates, for example:
    • single and singular for post, if they exist
    • page and singular for page, if they exist

Does that sound good or am I missing something?

@oandregal
Copy link
Member Author

oandregal commented May 28, 2024

Edit: I've updated this comment with the latest I've learned about how the post_type query works.

I'll look into this tomorrow morning, but at the implementation level this is a bit tricky. It seems the next steps are:

  • On the one hand, the post_types field in the endpoint should behave the same as if the endpoint was queried with post_type. This is, only the templates registered through the customTemplates field in theme.json would have post type information. Any other template would return null in postTypes field.

  • At the DataViews level, in addition to the templates with post type information we should add some logic to match other templates that are relevant to the search:

    • The custom templates that don't have post types info attached. These templates are also returned by the endpoint as per this query logic.
    • The "extra" templates that are relevant for the search (single, page, singular). This are not returned by the templates endpoint but they are the "defaults".

elements: [
{ value: 'post', label: POST_TYPES.post },
{ value: 'page', label: POST_TYPES.page },
],
Copy link
Contributor

Choose a reason for hiding this comment

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

Are these the only possible post types?

Copy link
Member Author

Choose a reason for hiding this comment

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

No, they are not. There's a TODO note over there to look at this later, when the custom filtering was addressed.

Copy link
Member Author

Choose a reason for hiding this comment

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

Pushed support for any registered post type that is viewable & declares editor support (as a proxy for template support, otherwise, media post type will be listed as well). 35300bb and 18756b3

@oandregal
Copy link
Member Author

oandregal commented May 29, 2024

I've implemented the logic above and this is how it looks like:

Templates for post Templates for pages
Captura de ecrã 2024-05-29, às 11 19 15 Captura de ecrã 2024-05-29, às 11 21 47

The results make sense to me, though it's a complex topic and I'm not sure the information display helps to make sense of it if you're not familiar with all kind of templates.

  • I think that it'd be better if we don't add the custom field for now, see related conversation.
  • Note that I've made the postType field visible to make it obvious how the filtered value and the rendered value are different. Perhaps this is fine, given the field is hidden by default. I'm posting more thoughts about this as a code review, as it's a bit different from what we've been doing so far (filter<=>display was a 1:1 match).

{
header: __( 'Post types' ),
id: 'postTypes',
getValue: ( { item } ) =>
Copy link
Member Author

@oandregal oandregal May 29, 2024

Choose a reason for hiding this comment

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

This getValue function is used by the filters. Note how the values returned here are different from the values returned by render, which is not what we've been doing so far.

This enables us to implement this logic, in line with the server logic. For example, when querying the templates endpoint with post_type: post the server returns:

  1. Templates whose templates->post_types values contain post.
  2. User templates that are custom but don't have any post type information.

Additionally, there's a few default templates with special meaning that are not returned by the endpoint in that scenario because they're the default and we should probably display here when the user filters by post type:

  1. The single & singular templates, as per the template hierarchy.

Copy link
Member Author

Choose a reason for hiding this comment

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

An alternative to this approach would be allowing the field to provide a custom filter callback. I'm investigating this next, though I wanted to share as early as possible in case anyone has different ideas.

Copy link
Member Author

Choose a reason for hiding this comment

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

I've extracted a getPostTypesFromItem method that centralizes all this logic. I feel better about this now. Still need to review/add support for CPTs to assess whether this is a good enough approach.

@jameskoster
Copy link
Contributor

I've implemented the #62075 (comment) and this is how it looks like:

I think this looks good. But shouldn't the Post types field be visible on each record? IE the 'Pages' template should have "Post type: Page".

For user-generated custom templates, should the post types value be Any as technically these templates could be applied to CPTs too?

We'll need to think about how this works for other template types like archives. E.g. archive-posts.html should have "Post types: Post".

Finally, should templates not associated with any particular post type still show the field but with an n/a value? It's a bit strange to see an empty cell in table layout.

@oandregal
Copy link
Member Author

oandregal commented May 30, 2024

James, I've pushed some changes that implement your suggestions for post types.

So far, only primary and secondary templates are mapped to a post type, the rest will display "n/a". Do we consider support for variable templates (archive-${posttype}, single-${posttype}, etc) required? It adds a bit of complexity, I can revisit it later if it's a requirement.

I'm looking at "Custom" field/filter & CPTs support next.

Gravacao.do.ecra.2024-05-30.as.11.24.42.mov

@jameskoster
Copy link
Contributor

Do we consider support for variable templates (archive-${posttype}, single-${posttype}, etc) required?

For these templates I fear "Post types: n/a" is probably too disingenuous:

Screenshot 2024-05-30 at 11 47 43

It's unclear to users why pages.html and single-post.html declare the correct post type, but these do not.

There's one other quirk we should probably consider here; the home.html template ("Blog Home") will only ever display posts, so it could potentially be hard-coded as "Post types: Post".

@oandregal
Copy link
Member Author

For these templates I fear "Post types: n/a" is probably too disingenuous:

I've done some research and find this is plugin territory and has to do with how they provide template metadata. The gist of the issue is that core & plugins have a different understanding of what post_types and is_custom fields are for. This is what I see:

  • templates come from:

    • the theme, automatically picked up by core
    • plugins that register them by using the get_block_templates hook
    • the user, when they save changes to existing templates or create their own templates
  • $template->is_custom:

  • $template->post_types:

    • themes provide this info via customTemplates in theme.json
    • plugins provide this info via the filter and do not to provide any info (learnpress, sensei, woo).
    • My expectation would be that plugins fill this property with the relevant CPTs their templates are for.

This PR is working as expected for the templates coming from the theme. However, given the different interpretations plugins have for is_custom and post_types the feature is not working as an user would expect (e.g.: give me the templates for the Woo-defined Product CPT) due to how plugins provide metadata.

For me, the next steps here are:

  • Clarify what is_custom is for.
  • Let the plugins know that we're using post_types in more places (dataviews), so they have time to provide data for their templates — or provide a subpar experience in this screen. This means this PR won't be part of 6.6 but we'd land it early in the 6.7 cycle so plugins have time to adapt.

Pinging people that has been involved on this for thoughts and good measure:

@Aljullu
Copy link
Contributor

Aljullu commented Jun 4, 2024

$template->post_types: plugins provide this info via the filter and do not to provide any info (learnpress, sensei, woo).

I'm a bit confused by the Single product template having an empty array as the post_types value, honestly. I think this was an overlook and it should be product instead. My guess is that as we don't allow switching templates for individual products (woocommerce/woocommerce#42393), having it set to an empty array didn't make any difference functionality-wise.

Clarify what is_custom is for.

Thanks for raising this! is_custom is something that has always confused me and I guess other devs as well, seeing several plugins used it in different ways. It's even more confusing considering that a template can have origin = "custom", but that's completely unrelated to the is_custom attribute. 😅

My guess is that most plugins have set is_custom based on the specific needs they had for their templates, instead of adhering to the formal definition. We could investigate setting is_custom to true for WooCommerce templates, but we need to keep an eye on how that value is used across the codebase. Ie, if is_custom is true that means templates can be renamed by users (something we tried to avoid)?

Let the plugins know that we're using post_types in more places (dataviews), so they have time to provide data for their templates — or provide a subpar experience in this screen. This means this PR won't be part of 6.6 but we'd land it early in the 6.7 cycle so plugins have time to adapt.

This would work for us. 👍


Heads-up that we are also working on introducing a template registration API for plugins (#61577), so we have the opportunity to unify how this is handled across different plugins.

@oandregal
Copy link
Member Author

Heads-up that we are also working on introducing a template registration API for plugins (#61577), so we have the opportunity to unify how this is handled across different plugins.

Oh, nice, I'll review that! I'm focused on backports today, so I'll take a look in a day or two.

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.

Thanks for the research into what "custom" and "post types" actually mean in this context!

I suppose that, as far as "custom" is concerned, those two different definitions ("is not a default template" / "lives in the database") overlapped until recently. It was only through the improvement of templating infrastructure (including the get_block_templates hook) that it became gradually easier to produce new realities for "custom" templates.

Anyway, I don't really have an answer for you on that, and I think it'll take a few discussions and competing opinions before we can untangle this.

Comment on lines +120 to +122
if ( null === $template_metadata ) {
return null;
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Super minor, but this check isn't needed before isset.

Suggested change
if ( null === $template_metadata ) {
return null;
}

@@ -256,6 +290,27 @@ export default function PageTemplates() {
} ) );
}, [ records ] );

const getPostTypesFromItem = ( item ) => {
// This logic replicates querying the REST templates endpoint with a post_type parameter.
// https://github.com/WordPress/wordpress-develop/blob/trunk/src/wp-includes/block-template-utils.php#L1077
Copy link
Contributor

Choose a reason for hiding this comment

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

This needs to be a permalink and not just relative to trunk, otherwise it will go (and already has gone) stale.

@@ -256,6 +290,27 @@ export default function PageTemplates() {
} ) );
}, [ records ] );

const getPostTypesFromItem = ( item ) => {
Copy link
Contributor

Choose a reason for hiding this comment

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

This should be a useCallback, no?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] DataViews Work surrounding upgrading and evolving views in the site editor and beyond [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants