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

Add Theme's base global styles endpoint #35985

Merged
merged 2 commits into from
Nov 2, 2021

Conversation

youknowriad
Copy link
Contributor

Builds on top of #35801

This PR adds a wp/v2/theme/{mytheme}/global-styles endpoint to avoid the need for the __experimentalGlobalStylesBaseConfig config we pass to bootstrap the site editor.

See related discussion in #35801 and #35141

@youknowriad youknowriad added Core REST API Task Task for Core REST API efforts [Type] Code Quality Issues or PRs that relate to code quality labels Oct 27, 2021
@youknowriad youknowriad self-assigned this Oct 27, 2021
* @return WP_REST_Response $data
*/
function gutenberg_get_themes_global_styles( WP_REST_Request $request ) {
if ( wp_get_theme()->get_stylesheet() !== $request['stylesheet'] ) {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

@oandregal our low level APIs (WP_Theme_JSON_Resolver_Gutenberg) doesn't allow us to easily retrieve the base global styles for any theme (if it's not the active theme). So right now I've limited this endpoint to the active theme only but I don't like this limitation, I think the lower level APIs should be more flexible.

Copy link
Member

Choose a reason for hiding this comment

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

Nice, I can help adding that if we want it.

The current proposal for the endpoint makes me wonder in which cases we want the data coming from a theme other than the active one. Given there're no other use cases than the active theme yet, would it be reasonable to design the endpoint to not ask for that info to consumers? I'd like to understand if this is a limitation of the REST API (perhaps knowing the active theme requires bootstrapping parts of WordPress that aren't bootstrapped in a REST request)? Or perhaps the design vision for the REST API is targeted towards being session-agnostic?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Given there're no other use cases than the active theme yet, would it be reasonable to design the endpoint to not ask for that info to consumers?

The same question could be asked about the "themes" endpoint. The design of this endpoint map how it works in the themes endpoint, you can retrieve the theme's data even for inactive themes. It's true that there's no use-cases for non active themes at the moment though.

Or perhaps the design vision for the REST API is targeted towards being session-agnostic?

I think this is the case yes, not a limitation. @TimothyBJacobs might speak about this. Potentially we could add a similar "link" to the theme's base styles (like we do for the user ones)

Copy link
Member

Choose a reason for hiding this comment

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

Yeah, the REST API should be as stateless as possible. And ideally we'd be able to retrieve details about the non-active theme's styles. However, there are some things about themes, like add_theme_support that aren't added in a declarative manner so that we could return them for non-active themes.

So it is fine for now to just include the details about the non-active theme, but I agree with @youknowriad that long term, our low-level APIs should be flexible enough to be able to query that information. Once that is completed, adding that info to the non-active theme endpoints would be great.

Copy link
Member

Choose a reason for hiding this comment

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

Got it, thanks for the thoughts.

);
}

$theme = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( array(), 'theme' );
Copy link
Contributor Author

Choose a reason for hiding this comment

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

@oandregal In trunk we pass the $settings object that comes from the block_editor_settings filter here while in this PR I'm passing an empty array. I think this highlights the issues we discussed about the separation between producer and consumer of the global styles. For instance this is the endpoint that retrieves the base global styles for a theme, I don't think the block_editor_settings should apply here. Potentially we could have a lower level filter (base_theme_settings or similar) if we want this to be filterable but for now, I'm removing the filter support.

Copy link
Member

Choose a reason for hiding this comment

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

Yeah, this is problematic in my view, as we're taking theme supports data directly from the theme and not after having run the filter to which 3rd parties could have hooked into (some hosts actually do). The potentially filterable data is only existing theme supports and less than a dozen of them https://developer.wordpress.org/block-editor/how-to-guides/themes/theme-json/#backward-compatibility-with-add_theme_support

I don't see it as a big issue given that this is only for the site editor so far. It'll be a backward-incompatible change if we wanted to do it for the post editor, though.

Copy link
Member

Choose a reason for hiding this comment

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

This is also "solved" by introducing dedicated filters for global styles. Do you think the introduction of these endpoints is a good place/moment for adding the filters?

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 it's that problematic because global styles only works for themes with theme.json. Meaning themes that don't use theme supports (ideally).

Introducing a new filter is definitely on the table but it won't solve backward compatibility anyway, I think if there are plugins that are using block_editor_settings to alter theme settings, they're doing it wrong because that clearly says "editor settings" and not some agnostic "theme settings".

Copy link
Member

Choose a reason for hiding this comment

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

We may need to remove the filtered settings anyway. Found a bug while testing Jorge's PR to add the new color UI component with the 3 origins and the fix is not using the filtered settings for presets #36054

@github-actions
Copy link

github-actions bot commented Oct 27, 2021

Size Change: +140 B (0%)

Total Size: 1.08 MB

Filename Size Change
build/core-data/index.min.js 12.7 kB +148 B (+1%)
build/edit-site/index.min.js 30.8 kB +4 B (0%)
build/editor/index.min.js 37.8 kB -12 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 931 B
build/admin-manifest/index.min.js 1.09 kB
build/annotations/index.min.js 2.7 kB
build/api-fetch/index.min.js 2.17 kB
build/autop/index.min.js 2.08 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.2 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
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 136 kB
build/block-editor/style-rtl.css 14.1 kB
build/block-editor/style.css 14.1 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 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 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 470 B
build/block-library/blocks/button/editor.css 470 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 309 B
build/block-library/blocks/buttons/editor.css 309 B
build/block-library/blocks/buttons/style-rtl.css 317 B
build/block-library/blocks/buttons/style.css 317 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 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 206 B
build/block-library/blocks/columns/editor.css 205 B
build/block-library/blocks/columns/style-rtl.css 497 B
build/block-library/blocks/columns/style.css 496 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.17 kB
build/block-library/blocks/cover/style.css 1.17 kB
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 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 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 322 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 977 B
build/block-library/blocks/gallery/editor.css 982 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.59 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 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 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 502 B
build/block-library/blocks/image/style.css 505 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 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 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 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 642 B
build/block-library/blocks/navigation-link/editor.css 642 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/style-rtl.css 195 B
build/block-library/blocks/navigation-submenu/style.css 195 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.83 kB
build/block-library/blocks/navigation/editor.css 1.84 kB
build/block-library/blocks/navigation/style-rtl.css 1.72 kB
build/block-library/blocks/navigation/style.css 1.7 kB
build/block-library/blocks/navigation/view.min.js 2.74 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 198 B
build/block-library/blocks/page-list/style.css 198 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 273 B
build/block-library/blocks/paragraph/style.css 273 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/style-rtl.css 347 B
build/block-library/blocks/post-comments-form/style.css 347 B
build/block-library/blocks/post-comments/style-rtl.css 492 B
build/block-library/blocks/post-comments/style.css 493 B
build/block-library/blocks/post-content/style-rtl.css 56 B
build/block-library/blocks/post-content/style.css 56 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 396 B
build/block-library/blocks/post-featured-image/editor.css 397 B
build/block-library/blocks/post-featured-image/style-rtl.css 156 B
build/block-library/blocks/post-featured-image/style.css 156 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 391 B
build/block-library/blocks/post-template/style.css 392 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 60 B
build/block-library/blocks/post-title/style.css 60 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 378 B
build/block-library/blocks/pullquote/style.css 378 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 262 B
build/block-library/blocks/query-pagination/editor.css 255 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 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 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 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 250 B
build/block-library/blocks/separator/style.css 250 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 770 B
build/block-library/blocks/site-logo/editor.css 770 B
build/block-library/blocks/site-logo/style-rtl.css 165 B
build/block-library/blocks/site-logo/style.css 165 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 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 824 B
build/block-library/blocks/social-links/editor.css 823 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB
build/block-library/blocks/social-links/style.css 1.32 kB
build/block-library/blocks/spacer/editor-rtl.css 307 B
build/block-library/blocks/spacer/editor.css 307 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 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 560 B
build/block-library/blocks/template-part/editor.css 559 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 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 815 B
build/block-library/common.css 812 B
build/block-library/editor-rtl.css 9.8 kB
build/block-library/editor.css 9.8 kB
build/block-library/index.min.js 157 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 10.5 kB
build/block-library/style.css 10.6 kB
build/block-library/theme-rtl.css 668 B
build/block-library/theme.css 673 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 46 kB
build/components/index.min.js 212 kB
build/components/style-rtl.css 15.4 kB
build/components/style.css 15.4 kB
build/compose/index.min.js 10.9 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 614 B
build/data/index.min.js 7.15 kB
build/date/index.min.js 31.5 kB
build/deprecated/index.min.js 428 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.44 kB
build/edit-navigation/index.min.js 15.9 kB
build/edit-navigation/style-rtl.css 3.76 kB
build/edit-navigation/style.css 3.76 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 29.4 kB
build/edit-post/style-rtl.css 7.12 kB
build/edit-post/style.css 7.12 kB
build/edit-site/style-rtl.css 5.79 kB
build/edit-site/style.css 5.78 kB
build/edit-widgets/index.min.js 16.4 kB
build/edit-widgets/style-rtl.css 4.17 kB
build/edit-widgets/style.css 4.18 kB
build/editor/style-rtl.css 3.78 kB
build/editor/style.css 3.77 kB
build/element/index.min.js 3.21 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 6.34 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.6 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.72 kB
build/keycodes/index.min.js 1.3 kB
build/list-reusable-blocks/index.min.js 1.85 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 845 B
build/nux/index.min.js 2.03 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.83 kB
build/primitives/index.min.js 921 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/redux-routine/index.min.js 2.63 kB
build/reusable-blocks/index.min.js 2.19 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.7 kB
build/server-side-render/index.min.js 1.52 kB
build/shortcode/index.min.js 1.48 kB
build/token-list/index.min.js 562 B
build/url/index.min.js 1.82 kB
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.11 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

Base automatically changed from add/bootstrap-global-styles-endpoint to trunk October 28, 2021 09:36
@youknowriad youknowriad force-pushed the add/base-global-styles-theme-endpoint branch from 2fdb49b to 5cbf0ab Compare October 28, 2021 09:38
@youknowriad youknowriad marked this pull request as ready for review October 28, 2021 09:38
Copy link
Member

@jorgefilipecosta jorgefilipecosta left a comment

Choose a reason for hiding this comment

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

I'm not being able to test the PR because the request being made returns 404:
http://yah.local/wp-json/wp/v2/themes/theme-experiments/tt1-blocks/global-styles?_locale=user

This is the path. Maybe we need a regex updated because the stylesheet is theme-experiments/tt1-blocks?

@youknowriad
Copy link
Contributor Author

@jorgefilipecosta I've tried to align the stylesheet with how the theme's endpoint work, I wonder if theme endpoint is broken or if it expects some kind of normalize stylesheet? cc @TimothyBJacobs

@youknowriad
Copy link
Contributor Author

@jorgefilipecosta in the meantime, you can test with any theme that is not installed on a subfolder

);
}

$theme = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( array(), 'theme' );
Copy link
Member

Choose a reason for hiding this comment

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

What this is returning is not the theme styles but the result of the merge of the theme styles with core. Should we have a separate endpoint for core?

The shape returned by this endpoint does not match the shape returned by the user endpoint. Here we return the presets by origin, on the user endpoint we just return the array of presets (the origin is obviously the user). I guess the shape should be the same?

That would mean we would need an endpoint for core, or make a static HTTP request to the core theme.json file.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

What this is returning is not the theme styles but the result of the merge of the theme styles with core. Should we have a separate endpoint for core?

For me that's what represents "theme styles", core ones are just default values. (For presets we can merge using the subkeys if needed, which is probably already done)

Copy link
Member

Choose a reason for hiding this comment

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

In that case we still have the issue of the shape returned by the themes endpoint being different from the shape returned the the user endpoint: {settings: {color: palette: {core:[...], theme: [] } } } vs {settings: {color: palette: [] } }. If both return theme.json structures should the structured be the same?

Copy link
Member

@jorgefilipecosta jorgefilipecosta Oct 28, 2021

Choose a reason for hiding this comment

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

I think the core is not a default core is a source of styles and settings in its own right. I guess the solution would be for the theme endpoint to just return the theme.json settings without merging with the core and request the core settings separately.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

In that case we still have the issue of the shape returned by the themes endpoint being different from the shape returned the the user endpoint: {settings: {color: palette: {core:[...], theme: [] } } } vs {settings: {color: palette: [] } }. If both return theme.json structures should the structured be the same?

I think the core is not a default core is a source of styles and settings in its own right. I guess the solution would be for the theme endpoint to just return the theme.json settings without merging with the core and request the core settings separately.

Both of these can make sense, that said, theme.json are actually really defaults for everything but presets so it makes me think, maybe the first option is better.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Thinking a bit more here, if we add the "user" subkey to the user's endpoint, it might suggest that you could alter "theme" and "core" palettes as well which is not good. On the other hand, everything in core's theme.json is defaults aside for the presets.

So I think having a /core endpoint somehow to fetch the "core presets" essentially (we don't care about everything else) could be a good solution but I don't fee like removing the defaults from "theme" endpoint is a good thing to do.

Anyway I'm a bit lost here to be honest and uncertain what's best. I'm thinking we should land things as they are (simple) for the alpha at least and see how to improve things before beta.

@jorgefilipecosta
Copy link
Member

@jorgefilipecosta I've tried to align the stylesheet with how the theme's endpoint work, I wonder if theme endpoint is broken or if it expects some kind of normalize stylesheet? cc @TimothyBJacobs

For the template endpoints, the requests are made as "theme-experiments//tt1-blocks" (using a double "/").

@TimothyBJacobs
Copy link
Member

Yeah it looks like it isn't properly handling themes that are in subfolders. Introduced in https://core.trac.wordpress.org/ticket/50152, cc: @spacedmonkey.

Copy link
Member

@jorgefilipecosta jorgefilipecosta left a comment

Choose a reason for hiding this comment

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

We are adding a link on the rest endpoint for the user styles. Should we also add one for the theme styles?

Copy link
Member

@jorgefilipecosta jorgefilipecosta left a comment

Choose a reason for hiding this comment

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

Everything is working well on my tests, I think we can merge the PR and then iterate as needed 👍

@youknowriad
Copy link
Contributor Author

I'd love a solution for the "themes in folders" here if possible before merge 🤔

@youknowriad
Copy link
Contributor Author

@spacedmonkey how do you think we should deal with this issue #35985 (review) Do you think we can just update the regex for the argument somehow? How can we defined the regex for /themes/{theme}/global-styles where theme can contain a "slash"

@spacedmonkey
Copy link
Member

@spacedmonkey how do you think we should deal with this issue #35985 (review) Do you think we can just update the regex for the argument somehow? How can we defined the regex for /themes/{theme}/global-styles where theme can contain a "slash"

I think we should focus on #36076. Playing with my implementation, it feels more core ready.

@youknowriad
Copy link
Contributor Author

@spacedmonkey this PR and #36076 are about two different endpoints though :)

@TimothyBJacobs
Copy link
Member

@youknowriad I've opened, https://core.trac.wordpress.org/ticket/54349, to fix the issue in the Core theme's controller.

@TimothyBJacobs
Copy link
Member

@youknowriad A PR is available that will fix the issue with the themes controller, WordPress/wordpress-develop#1793. You can use the Regex from that PR in this endpoint, however, similar to the templates controller, AFAICT we'd need to make the requests be wp/v2/themes/my-theme//global-styles to accommodate the optionality of the slashes. Otherwise wp/v2/themes/my-theme/global-styles will be interpreted as a request for the theme called global-styles in the my-theme directory.

I think this double slashing is more awkward here than in the templates controller because the global-styles is pretty clearly another resource off of the theme, whereas in the templates controller, the whole subdir/theme//template/name is the template identifier.

So I think we have a couple of options. Listed in order of my preference.

  1. Similar to an earlier proposal, introduce a wp/v2/global-styles/themes/{theme-stylesheet} that would return the theme's global styles. As discussed earlier in this issue, this could only work for the active theme for now due to our lower-level APIs not supporting querying other themes, but in the future this would allow for querying all themes.
  2. Introduce something like wp/v2/global-styles/current that would return the active theme's styles.
  3. Stick with the double slash.

My preference is with the first option. I think it is the most RESTful and gives us the most room to grow. But @youknowriad I'm happy with any of the three options you think make the most sense for the client.

@youknowriad
Copy link
Contributor Author

Thanks for the fix and for your thoughts.

The first option works for me as well. I'll give a try a bit later here and see how far I can go.

@youknowriad
Copy link
Contributor Author

I pushed an update here to implement the first suggestion in #35985 (comment)

I think things are working properly.

@spacedmonkey
Copy link
Member

Introduce something like wp/v2/global-styles/current that would return the active theme's styles.

The themes endpoint does this. /wp/v2/themes?status=active. Using a param like this seems to work sense to me.

@youknowriad youknowriad force-pushed the add/base-global-styles-theme-endpoint branch from 43b608c to 5fa90d1 Compare November 2, 2021 10:00
Copy link
Member

@jorgefilipecosta jorgefilipecosta left a comment

Choose a reason for hiding this comment

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

LGTM 👍 Everything seems to work well even themes on subfolders.

In the future, we need to consider if it makes sense to have core and theme styles merged instead of just theme ones. And if the difference in shape between user and theme styles is something ok.

@youknowriad youknowriad merged commit 88d2956 into trunk Nov 2, 2021
@youknowriad youknowriad deleted the add/base-global-styles-theme-endpoint branch November 2, 2021 11:23
@github-actions github-actions bot added this to the Gutenberg 11.9 milestone Nov 2, 2021
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 [Type] Code Quality Issues or PRs that relate to code quality
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants