Add template revision button
What?
Adds a button to templates and template parts to get to the revision compare screen
Why?
Closes #44503
How?
This adds a button to the site editor for Templates and Template Parts that links to the revision viewer for that template.
It adds 2 new fields to the REST response for /wp/v2/template/{theme}//{part} and /wp/v2/template-part/{theme}//{part} routes: 'revision_count' and latest_revision_id. The Posts REST controller uses the _links section to expose these and links to routes for the Revisions REST controller. I chose to add these to the body because the Revisions REST routes assume numeric IDs with /revisions at the end, and the existing template routes receive everything in their namespace. Adding /revisions routes for templates and template-parts would require complex RegExes that could potentially lead to a DoS attack. However if someone can get the routes on the Revisions REST controller to work with Template IDs, I would be happy to add them.
Testing Instructions
- Open the Site Editor
- Edit a Template or Template Part
- Save to create a custom template
- Make another change and save again, to create a second custom template
- Confirm that the revision button appears in the Template sidebar and links to the revision viewer
Screenshots or screencast
https://user-images.githubusercontent.com/128240/197264906-70610dbc-ffbb-466e-982e-8f7d16ff49fa.mov
Size Change: +600 B (0%)
Total Size: 1.32 MB
| Filename | Size | Change |
|---|---|---|
build/edit-site/index.min.js |
64.8 kB | +585 B (+1%) |
build/edit-site/style-rtl.css |
9.7 kB | +7 B (0%) |
build/edit-site/style.css |
9.7 kB | +8 B (0%) |
âšī¸ View Unchanged
| Filename | Size |
|---|---|
build/a11y/index.min.js |
993 B |
build/annotations/index.min.js |
2.78 kB |
build/api-fetch/index.min.js |
2.27 kB |
build/autop/index.min.js |
2.15 kB |
build/blob/index.min.js |
483 B |
build/block-directory/index.min.js |
7.2 kB |
build/block-directory/style-rtl.css |
1.04 kB |
build/block-directory/style.css |
1.04 kB |
build/block-editor/content-rtl.css |
4.11 kB |
build/block-editor/content.css |
4.1 kB |
build/block-editor/default-editor-styles-rtl.css |
403 B |
build/block-editor/default-editor-styles.css |
403 B |
build/block-editor/index.min.js |
192 kB |
build/block-editor/style-rtl.css |
14.4 kB |
build/block-editor/style.css |
14.4 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 |
138 B |
build/block-library/blocks/audio/theme.css |
138 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 |
91 B |
build/block-library/blocks/avatar/style.css |
91 B |
build/block-library/blocks/block/editor-rtl.css |
305 B |
build/block-library/blocks/block/editor.css |
305 B |
build/block-library/blocks/button/editor-rtl.css |
587 B |
build/block-library/blocks/button/editor.css |
587 B |
build/block-library/blocks/button/style-rtl.css |
628 B |
build/block-library/blocks/button/style.css |
627 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 |
84 B |
build/block-library/blocks/categories/editor.css |
83 B |
build/block-library/blocks/categories/style-rtl.css |
100 B |
build/block-library/blocks/categories/style.css |
100 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 |
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 |
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 |
612 B |
build/block-library/blocks/cover/editor.css |
613 B |
build/block-library/blocks/cover/style-rtl.css |
1.57 kB |
build/block-library/blocks/cover/style.css |
1.56 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 |
138 B |
build/block-library/blocks/embed/theme.css |
138 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 |
265 B |
build/block-library/blocks/file/style.css |
265 B |
build/block-library/blocks/file/view.min.js |
353 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 |
984 B |
build/block-library/blocks/gallery/editor.css |
988 B |
build/block-library/blocks/gallery/style-rtl.css |
1.55 kB |
build/block-library/blocks/gallery/style.css |
1.55 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 |
654 B |
build/block-library/blocks/group/editor.css |
654 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 |
332 B |
build/block-library/blocks/html/editor.css |
333 B |
build/block-library/blocks/image/editor-rtl.css |
830 B |
build/block-library/blocks/image/editor.css |
829 B |
build/block-library/blocks/image/style-rtl.css |
652 B |
build/block-library/blocks/image/style.css |
652 B |
build/block-library/blocks/image/theme-rtl.css |
137 B |
build/block-library/blocks/image/theme.css |
137 B |
build/block-library/blocks/latest-comments/style-rtl.css |
298 B |
build/block-library/blocks/latest-comments/style.css |
298 B |
build/block-library/blocks/latest-posts/editor-rtl.css |
213 B |
build/block-library/blocks/latest-posts/editor.css |
212 B |
build/block-library/blocks/latest-posts/style-rtl.css |
478 B |
build/block-library/blocks/latest-posts/style.css |
478 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 |
507 B |
build/block-library/blocks/media-text/style.css |
505 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 |
716 B |
build/block-library/blocks/navigation-link/editor.css |
715 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 |
299 B |
build/block-library/blocks/navigation-submenu/editor.css |
299 B |
build/block-library/blocks/navigation/editor-rtl.css |
2.13 kB |
build/block-library/blocks/navigation/editor.css |
2.14 kB |
build/block-library/blocks/navigation/style-rtl.css |
2.22 kB |
build/block-library/blocks/navigation/style.css |
2.2 kB |
build/block-library/blocks/navigation/view-modal.min.js |
2.81 kB |
build/block-library/blocks/navigation/view.min.js |
447 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 |
376 B |
build/block-library/blocks/page-list/editor.css |
376 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 |
174 B |
build/block-library/blocks/paragraph/editor.css |
174 B |
build/block-library/blocks/paragraph/style-rtl.css |
279 B |
build/block-library/blocks/paragraph/style.css |
281 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 |
501 B |
build/block-library/blocks/post-comments-form/style.css |
501 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 |
73 B |
build/block-library/blocks/post-excerpt/editor.css |
73 B |
build/block-library/blocks/post-excerpt/style-rtl.css |
134 B |
build/block-library/blocks/post-excerpt/style.css |
134 B |
build/block-library/blocks/post-featured-image/editor-rtl.css |
586 B |
build/block-library/blocks/post-featured-image/editor.css |
584 B |
build/block-library/blocks/post-featured-image/style-rtl.css |
318 B |
build/block-library/blocks/post-featured-image/style.css |
318 B |
build/block-library/blocks/post-navigation-link/style-rtl.css |
153 B |
build/block-library/blocks/post-navigation-link/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 |
96 B |
build/block-library/blocks/post-terms/style.css |
96 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 |
103 B |
build/block-library/blocks/preformatted/style.css |
103 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 |
326 B |
build/block-library/blocks/pullquote/style.css |
325 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 |
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 |
458 B |
build/block-library/blocks/query/editor.css |
457 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 |
149 B |
build/block-library/blocks/rss/editor.css |
149 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 |
409 B |
build/block-library/blocks/search/style.css |
406 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 |
234 B |
build/block-library/blocks/separator/style.css |
234 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 |
474 B |
build/block-library/blocks/shortcode/editor.css |
474 B |
build/block-library/blocks/site-logo/editor-rtl.css |
490 B |
build/block-library/blocks/site-logo/editor.css |
490 B |
build/block-library/blocks/site-logo/style-rtl.css |
203 B |
build/block-library/blocks/site-logo/style.css |
203 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 |
116 B |
build/block-library/blocks/site-title/editor.css |
116 B |
build/block-library/blocks/site-title/style-rtl.css |
57 B |
build/block-library/blocks/site-title/style.css |
57 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.4 kB |
build/block-library/blocks/social-links/style.css |
1.39 kB |
build/block-library/blocks/spacer/editor-rtl.css |
332 B |
build/block-library/blocks/spacer/editor.css |
332 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 |
433 B |
build/block-library/blocks/table/editor.css |
433 B |
build/block-library/blocks/table/style-rtl.css |
651 B |
build/block-library/blocks/table/style.css |
650 B |
build/block-library/blocks/table/theme-rtl.css |
157 B |
build/block-library/blocks/table/theme.css |
157 B |
build/block-library/blocks/tag-cloud/style-rtl.css |
251 B |
build/block-library/blocks/tag-cloud/style.css |
253 B |
build/block-library/blocks/template-part/editor-rtl.css |
404 B |
build/block-library/blocks/template-part/editor.css |
404 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 |
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 |
179 B |
build/block-library/blocks/video/style.css |
179 B |
build/block-library/blocks/video/theme-rtl.css |
139 B |
build/block-library/blocks/video/theme.css |
139 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 |
11.6 kB |
build/block-library/editor.css |
11.6 kB |
build/block-library/elements-rtl.css |
54 B |
build/block-library/elements.css |
54 B |
build/block-library/index.min.js |
199 kB |
build/block-library/reset-rtl.css |
478 B |
build/block-library/reset.css |
478 B |
build/block-library/style-rtl.css |
12.6 kB |
build/block-library/style.css |
12.6 kB |
build/block-library/theme-rtl.css |
698 B |
build/block-library/theme.css |
703 B |
build/block-serialization-default-parser/index.min.js |
1.13 kB |
build/block-serialization-spec-parser/index.min.js |
2.83 kB |
build/blocks/index.min.js |
51 kB |
build/components/index.min.js |
204 kB |
build/components/style-rtl.css |
11.6 kB |
build/components/style.css |
11.7 kB |
build/compose/index.min.js |
12.3 kB |
build/core-data/index.min.js |
15.9 kB |
build/customize-widgets/index.min.js |
11.8 kB |
build/customize-widgets/style-rtl.css |
1.41 kB |
build/customize-widgets/style.css |
1.41 kB |
build/data-controls/index.min.js |
663 B |
build/data/index.min.js |
8.57 kB |
build/date/index.min.js |
32.1 kB |
build/deprecated/index.min.js |
518 B |
build/dom-ready/index.min.js |
336 B |
build/dom/index.min.js |
4.71 kB |
build/edit-post/classic-rtl.css |
571 B |
build/edit-post/classic.css |
571 B |
build/edit-post/index.min.js |
34.5 kB |
build/edit-post/style-rtl.css |
7.5 kB |
build/edit-post/style.css |
7.5 kB |
build/edit-widgets/index.min.js |
16.9 kB |
build/edit-widgets/style-rtl.css |
4.52 kB |
build/edit-widgets/style.css |
4.52 kB |
build/editor/index.min.js |
45.4 kB |
build/editor/style-rtl.css |
3.54 kB |
build/editor/style.css |
3.53 kB |
build/element/index.min.js |
4.93 kB |
build/escape-html/index.min.js |
548 B |
build/experiments/index.min.js |
938 B |
build/format-library/index.min.js |
7.26 kB |
build/format-library/style-rtl.css |
557 B |
build/format-library/style.css |
556 B |
build/hooks/index.min.js |
1.66 kB |
build/html-entities/index.min.js |
454 B |
build/i18n/index.min.js |
3.79 kB |
build/is-shallow-equal/index.min.js |
535 B |
build/keyboard-shortcuts/index.min.js |
1.79 kB |
build/keycodes/index.min.js |
1.92 kB |
build/list-reusable-blocks/index.min.js |
2.14 kB |
build/list-reusable-blocks/style-rtl.css |
865 B |
build/list-reusable-blocks/style.css |
865 B |
build/media-utils/index.min.js |
2.99 kB |
build/notices/index.min.js |
977 B |
build/plugins/index.min.js |
1.95 kB |
build/preferences-persistence/index.min.js |
2.23 kB |
build/preferences/index.min.js |
1.35 kB |
build/primitives/index.min.js |
960 B |
build/priority-queue/index.min.js |
1.52 kB |
build/react-i18n/index.min.js |
702 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.75 kB |
build/reusable-blocks/index.min.js |
2.26 kB |
build/reusable-blocks/style-rtl.css |
265 B |
build/reusable-blocks/style.css |
265 B |
build/rich-text/index.min.js |
10.8 kB |
build/server-side-render/index.min.js |
2.09 kB |
build/shortcode/index.min.js |
1.52 kB |
build/style-engine/index.min.js |
1.53 kB |
build/token-list/index.min.js |
650 B |
build/url/index.min.js |
3.69 kB |
build/vendors/inert-polyfill.min.js |
2.48 kB |
build/vendors/react-dom.min.js |
41.8 kB |
build/vendors/react.min.js |
4.02 kB |
build/viewport/index.min.js |
1.09 kB |
build/warning/index.min.js |
280 B |
build/widgets/index.min.js |
7.31 kB |
build/widgets/style-rtl.css |
1.18 kB |
build/widgets/style.css |
1.18 kB |
build/wordcount/index.min.js |
1.06 kB |
Thinking more about the REST routes in this, I think I can use the revisions REST controller, but only add the links when there are 2 or more custom versions of a template.
As a follow-up it would also be good to let the revision viewer load theme templates from the filesystem as a kind of revision 0
This button could probably use some design help too:

Thinking more about the REST routes in this, I think I can use the revisions REST controller, but only add the links when there are 2 or more custom versions of a template.
No, it won't work with the routes as they are currently set up. I've learned this twice now so I'm writing it down here for the next time I attempt this.
WP_REST_Templates_Controller registers a route for
// The route.
sprintf(
'/%s/(?P<id>%s%s)',
$this->rest_base,
// Matches theme's directory: `/themes/<subdirectory>/<theme>/` or `/themes/<theme>/`.
// Excludes invalid directory name characters: `/:<>*?"|`.
'([^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)',
// Matches the template name.
'[\/\w-]+'
)
which expands to something like /wp/v2/templates/twentytwentytwo//footer
WP_REST_Revisions_Controller registers a route for every post type that supports revisions for
// $this->rest_base = 'revisions'
'/' . $this->parent_base . '/(?P<parent>[\d]+)/' . $this->rest_base;
// ... and ....
'/' . $this->parent_base . '/(?P<parent>[\d]+)/' . $this->rest_base . '/(?P<id>[\d]+)',
which expands to something like /wp/v2/templates/123/revisions and /wp/v2/templates/123/revisions/456
Excluding routes that end in /revisions[/\d]* is difficult and has the potential to introduce a ReDoS vulnerability. Still, if someone has suggestions on how to make the routes on both of those classes compatible, I would love to use the same response format as posts.
Working on the revisions, thanks for the review @spacedmonkey. Also I opened #45290 as a possible follow-up to make template revisions clearer
Does this PR provide an alternative to https://github.com/WordPress/wordpress-develop/pull/3476, or does it depend on it?
Does this PR provide an alternative to WordPress/wordpress-develop#3476, or does it depend on it?
@priethor That was an earlier attempt on adding to the REST API and this is a better place for that change. I'll close that and we can merge the changes to core using the usual Gutenberg merge process.
Thinking more about the REST routes in this, I think I can use the revisions REST controller, but only add the links when there are 2 or more custom versions of a template.
No, it won't work with the routes as they are currently set up. I've learned this twice now so I'm writing it down here for the next time I attempt this.
WP_REST_Templates_Controllerregisters a route for// The route. sprintf( '/%s/(?P<id>%s%s)', $this->rest_base, // Matches theme's directory: `/themes/<subdirectory>/<theme>/` or `/themes/<theme>/`. // Excludes invalid directory name characters: `/:<>*?"|`. '([^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)', // Matches the template name. '[\/\w-]+' )which expands to something like
/wp/v2/templates/twentytwentytwo//footer
WP_REST_Revisions_Controllerregisters a route for every post type that supports revisions for// $this->rest_base = 'revisions' '/' . $this->parent_base . '/(?P<parent>[\d]+)/' . $this->rest_base; // ... and .... '/' . $this->parent_base . '/(?P<parent>[\d]+)/' . $this->rest_base . '/(?P<id>[\d]+)',which expands to something like
/wp/v2/templates/123/revisionsand/wp/v2/templates/123/revisions/456Excluding routes that end in
/revisions[/\d]*is difficult and has the potential to introduce a ReDoS vulnerability. Still, if someone has suggestions on how to make the routes on both of those classes compatible, I would love to use the same response format as posts.
I have reported this issue upstream here - https://core.trac.wordpress.org/ticket/56922. It will hopefully be fixed in WordPress 6.2.
I have reported this issue upstream here - https://core.trac.wordpress.org/ticket/56922. It will hopefully be fixed in WordPress 6.2.
Thanks @spacedmonkey - I'll get this PR ready for when that gets fixed and hopefully we can backport the fix to this as well.
@georgeh I have pushed some changes to this PR, with a fix. Let me know what you think.
@spacedmonkey thanks, that's about what I was coming up with so it lgtm. How do we feel about merging this when the _links section points to URLs that don't work yet?
@spacedmonkey thanks, that's about what I was coming up with so it lgtm. How do we feel about merging this when the
_linkssection points to URLs that don't work yet?
We can fix the issue in core or guternberg PR.
This is looking good. Let's ensure that unit tests / linting are passing. Then we can merge.
@spacedmonkey I'd like to merge this with the version information in _links but without the hrefs until the core ticket is resolved. I don't know what @TimothyBJacobs availability is to look at that ticket.
{
"id": "twentytwentythree//home",
"theme": "twentytwentythree",
...
"_links": {
...
"version-history": [
{
"count": 1,
}
],
"predecessor-version": [
{
"id": 17,
}
],
...
}
}
This would put the revision data we need in the same place as other post types, but would not advertise URLs that don't work. Once the REST routes are added, we can add the hrefs to the response.
That would allow us to get this feature to users without incurring technical debt for the placement of the data.
After trying this out without the hrefs, it seems that WP_REST_Server::get_response_links() really wants those hrefs. I re-added them and cleaned up the warnings. Once we get tests passing can I get a đđģ to merge?
@spacedmonkey All green, can I get a đđģ to merge?
@spacedmonkey I'm going to go ahead and merge tomorrow if I don't hear anything else, my read of your last comment is that we're good to go now that the tests are passing.
I've rebased this.
Flaky tests detected in a0ab799ae2039febb271cd856ced8364b5ab4464. Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.
đ Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/4123834366 đ Reported issues:
- #47640 in
specs/editor/various/block-hierarchy-navigation.test.js
I noticed that the required fix for the core has no milestone. So we might have to punt this feature for 6.3.
Let's ship this, as it's a much needed feature. Thank you George đ
However, let's follow up shortly thereafter with a couple of visual improvements. This is what it looks like at the moment:
That's the cursor hovering over the panel.
The use of a panel component to wrap the button may not have been the best idea, since it appears this panel is nested inside the description. Either the panel should be placed similar to other panels in the document sidebar, go edge to edge and line up with margins and paddings, or it could be a much simpler link, like this:
@spacedmonkey, can we merge this feature without https://core.trac.wordpress.org/ticket/56922?
@jasmussen, I agree that Revisions are a needed feature for the Site Editor. However, if the required APIs aren't working correctly, introducing UI doesn't make much sense.
However, if the required APIs aren't working correctly, introducing UI doesn't make much sense.
Oh I'll refer to you and others for the call here, I was commenting purely on the placement/feature side of things.
I think reasonable people can disagree about this, but I'm fine with merging this as is. The PR doesn't make our existing bug in #56922 materially worse in my opinion.
Excellent, I'll do the two updates mentioned above and merge!
@jasmussen I've updated the PR description with the visual update to get it closer to your suggestion.
@draganescu, @georgeh, this will require PHP backport. Since this is an enhancement, I believe it must be discussed with the rest of the release squad to get "blessed" status.
Can you create a new ticket on Trac, so we can start the process?
@draganescu, @georgeh, this will require PHP backport. Since this is an enhancement, I believe it must be discussed with the rest of the release squad to get "blessed" status.
Can you create a new ticket on Trac, so we can start the process?
đ any news on creating a trac ticket for this one?
FYI: I'll temporarily remove the back port label and re add it to use the cherry-pick script.
@Mamaduka @ntsekouras for now I created Add revisions to the links of the template and template part REST endpoint
I am unclear if the bug in Template / Template parts revision / autosave REST API are broken has a mergeable solution in @spacedmonkey 's PR or if we should port over the controller decoration here as a fix for this problem - which we could revert later if the bug is fixed in a more general way (cc @TimothyBJacobs)
This cannot be in 6.2 because once we land in the revision UI the links to take us back don't work and fixing that is not trivial.