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

Try/saving to theme files #40385

Closed
wants to merge 9 commits into from
Closed

Try/saving to theme files #40385

wants to merge 9 commits into from

Conversation

draganescu
Copy link
Contributor

@draganescu draganescu commented Apr 15, 2022

What?

Closes #39194

Why?

To allow the site editor to behave like a traditional visual builder. A theme can be exported, but when developing from scratch a better devx is to update your theme's files with the changes made via the site editor.

How?

The following updates are needed:

  • added a theme update button (one commit adds it to the more menu, one to the header)
  • added a new endpoint to save to theme files the customized templates and template parts
  • added a new block editor setting themeDevMode based on a new wp-config.php constant THEME_DEV_MODE

Testing Instructions

  1. Switch to this PR
  2. Add define( 'ENABLE_THEME_SAVING', true ); to your wp-config.php
  3. Make sure you are on a block theme
  4. Make sure WordPress can write to your theme files
  5. Go edit a template or template part
  6. Save the edit
  7. You should see an update theme button. Click it.
  8. The updates should be reflected in the files of your current theme

Screenshots or screencast

More menu

update-theme-more-menu.mp4

Editor header

update-theme-header.mp4

Work in progress, known problems

  • check for file writing permissions when adding the editor "theme dev" mode setting
  • what happens if the theme files are updated after the customisations are made? Should we make a backup, just in case?
  • [bug?] I have not fixed the fact that once the customisations are cleared following a theme save, the editor wants to save the clearing of customisations itself.
  • [bug] when switching editors, the update theme button only appears once an edit has been done and saved
  • Think about what happens when someone tries to update a directory theme that has had saved customization.

Based heavily on the create-block-theme plugin's implementation of this similar concept by @pbking

@draganescu draganescu force-pushed the try/saving-to-theme-files branch from ca0cc07 to 33fdb62 Compare April 15, 2022 18:37
@github-actions
Copy link

github-actions bot commented Apr 15, 2022

Size Change: +36 B (0%)

Total Size: 1.23 MB

Filename Size Change
build/block-editor/index.min.js 151 kB -94 B (0%)
build/block-editor/style-rtl.css 15 kB +11 B (0%)
build/block-editor/style.css 15 kB +11 B (0%)
build/block-library/blocks/comments-query-loop/editor-rtl.css 0 B -95 B (removed) 🏆
build/block-library/blocks/comments-query-loop/editor.css 0 B -95 B (removed) 🏆
build/block-library/blocks/navigation/style-rtl.css 1.95 kB +14 B (+1%)
build/block-library/blocks/navigation/style.css 1.94 kB +14 B (+1%)
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB +133 B (+5%) 🔍
build/block-library/editor-rtl.css 10.2 kB -2 B (0%)
build/block-library/editor.css 10.3 kB -2 B (0%)
build/block-library/index.min.js 177 kB -320 B (0%)
build/block-library/style-rtl.css 11.5 kB +16 B (0%)
build/block-library/style.css 11.5 kB +14 B (0%)
build/components/index.min.js 222 kB +98 B (0%)
build/components/style-rtl.css 15 kB +41 B (0%)
build/components/style.css 15 kB +42 B (0%)
build/core-data/index.min.js 14.5 kB -44 B (0%)
build/edit-post/index.min.js 30.1 kB -39 B (0%)
build/edit-site/index.min.js 47.8 kB +343 B (+1%)
build/edit-widgets/index.min.js 16.3 kB -42 B (0%)
build/editor/index.min.js 38.4 kB +32 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.77 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.51 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-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 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/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 59 B
build/block-library/blocks/avatar/style.css 59 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 445 B
build/block-library/blocks/button/editor.css 445 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 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 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 95 B
build/block-library/blocks/comments/editor.css 95 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.53 kB
build/block-library/blocks/cover/style.css 1.53 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 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 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 961 B
build/block-library/blocks/gallery/editor.css 964 B
build/block-library/blocks/gallery/style-rtl.css 1.51 kB
build/block-library/blocks/gallery/style.css 1.51 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 333 B
build/block-library/blocks/group/editor.css 333 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 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 529 B
build/block-library/blocks/image/style.css 535 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 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 463 B
build/block-library/blocks/latest-posts/style.css 462 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 708 B
build/block-library/blocks/navigation-link/editor.css 706 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-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 kB
build/block-library/blocks/navigation/view.min.js 395 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 363 B
build/block-library/blocks/page-list/editor.css 363 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 260 B
build/block-library/blocks/paragraph/style.css 260 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 69 B
build/block-library/blocks/post-comments-form/editor.css 69 B
build/block-library/blocks/post-comments-form/style-rtl.css 521 B
build/block-library/blocks/post-comments-form/style.css 521 B
build/block-library/blocks/post-comments/editor-rtl.css 77 B
build/block-library/blocks/post-comments/editor.css 77 B
build/block-library/blocks/post-comments/style-rtl.css 527 B
build/block-library/blocks/post-comments/style.css 527 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 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 323 B
build/block-library/blocks/post-template/style.css 323 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 370 B
build/block-library/blocks/pullquote/style.css 370 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 369 B
build/block-library/blocks/query/editor.css 369 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 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 140 B
build/block-library/blocks/separator/editor.css 140 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 759 B
build/block-library/blocks/site-logo/editor.css 759 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 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 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 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 504 B
build/block-library/blocks/table/editor.css 504 B
build/block-library/blocks/table/style-rtl.css 625 B
build/block-library/blocks/table/style.css 625 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 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 149 B
build/block-library/blocks/template-part/editor.css 149 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 993 B
build/block-library/common.css 990 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 689 B
build/block-library/theme.css 694 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 47 kB
build/compose/index.min.js 11.3 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.39 kB
build/customize-widgets/style.css 1.39 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 7.66 kB
build/date/index.min.js 32 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.58 kB
build/edit-navigation/index.min.js 15.8 kB
build/edit-navigation/style-rtl.css 4.05 kB
build/edit-navigation/style.css 4.05 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/style-rtl.css 7.02 kB
build/edit-post/style.css 7.02 kB
build/edit-site/style-rtl.css 7.95 kB
build/edit-site/style.css 7.93 kB
build/edit-widgets/style-rtl.css 4.41 kB
build/edit-widgets/style.css 4.4 kB
build/editor/style-rtl.css 3.67 kB
build/editor/style.css 3.67 kB
build/element/index.min.js 4.3 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 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.83 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 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.94 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.1 kB
build/nux/style-rtl.css 751 B
build/nux/style.css 749 B
build/plugins/index.min.js 1.98 kB
build/preferences-persistence/index.min.js 2.16 kB
build/preferences/index.min.js 1.32 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 628 B
build/react-i18n/index.min.js 704 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.69 kB
build/reusable-blocks/index.min.js 2.24 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.2 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.99 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.21 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

Copy link
Contributor Author

@draganescu draganescu left a comment

Choose a reason for hiding this comment

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

Pull request authors can't request changes to their own pull request, but I want to request myself all these changes. Why would this be a problem ...

@draganescu draganescu force-pushed the try/saving-to-theme-files branch from 33fdb62 to dc33b3d Compare April 26, 2022 08:02
@draganescu draganescu force-pushed the try/saving-to-theme-files branch 4 times, most recently from c6f1562 to bd72aed Compare April 29, 2022 17:33
@draganescu
Copy link
Contributor Author

draganescu commented Apr 29, 2022

Simplified the API code as I don't have a good grasp of how child themes would need to be handled here, but this can be added once this is not a draft anymore. For now to not be a draft I need to:

  • check for writing permissions before writing
  • only clear customizations if writing was a success
  • remove the need for an extra save, after reverting the saved custom templates and parts
  • return errors, if any
  • add a test for the whole flow
  • remove the extra REST call and reset options via a query

@draganescu draganescu force-pushed the try/saving-to-theme-files branch from bd72aed to 66f25aa Compare May 2, 2022 08:29
@scruffian
Copy link
Contributor

Add define( 'THEME_DEV_MODE', true ); to your wp-config.php

Is it better to use this than the standard WP_DEBUG const?

return $filename;
}

function gutenberg_export_theme_json() {
Copy link
Contributor

Choose a reason for hiding this comment

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

should we move this to a different file?

@@ -172,6 +173,7 @@ export default function Header( {

<div className="edit-site-header_end">
<div className="edit-site-header__actions">
<ThemeUpdater />
Copy link
Contributor

Choose a reason for hiding this comment

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

I think this was better in the sidebar, like you had it before

return $template;
}

function clear_user_customizations() {
Copy link
Contributor

Choose a reason for hiding this comment

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

I wonder if we already have something that does this.

Copy link
Contributor

Choose a reason for hiding this comment

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

Can we use this?

export const useGlobalStylesReset = () => {

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Not right now as it returns a buggy canReset which is always true. You can see that the reset menu item in the global styles panel is always active. But I'll see.

@scruffian
Copy link
Contributor

Should we add some tests?

@scruffian
Copy link
Contributor

When I save to theme files I see this message more than once:
Screenshot 2022-05-03 at 14 13 17

@scruffian
Copy link
Contributor

scruffian commented May 3, 2022

The workflow when editing is slightly cumbersome:

  1. I make changes to the theme files
  2. I save the changes to the database
  3. Then I am able to save the changes back to the theme files and we revert the database changes.

Would it be possible to give users the option to save changes directly to files without needing the intermediary step?

Maybe we could add the button to the save sidebar panel?
Screenshot 2022-05-03 at 14 18 04

@draganescu
Copy link
Contributor Author

@scruffian I've been thinking about either one of these paths:

image

But I am not sure which way to go. Either way, I could enable the header button even if the theme templates and parts are none dirty and so the intermediary step could be gone.

@scruffian
Copy link
Contributor

@mtias it would be good to get some design input here. Are you able to help or suggest someone who could?

@carlomanf
Copy link

Add define( 'THEME_DEV_MODE', true ); to your wp-config.php

Is it better to use this than the standard WP_DEBUG const?

Yes, definitely. I usually like to have WP_DEBUG turned on for offline sites but it doesn't mean I want this feature turned on.

$global_styles_controller->update_item( $update_request );

// delete global styles transients
delete_transient( 'global_styles' );
Copy link
Contributor

Choose a reason for hiding this comment

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

I think this is obsolete.

// delete global styles transients
delete_transient( 'global_styles' );
delete_transient( 'global_styles_' . get_stylesheet() );
delete_transient( 'gutenberg_global_styles' );
Copy link
Contributor

Choose a reason for hiding this comment

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

I think this is obsolete.

const customTemplates = filter( templates, customSourceFilter );
const customTemplateParts = filter( templateParts, customSourceFilter );

const unModifiedTheme =
Copy link
Contributor

Choose a reason for hiding this comment

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

This condition also needs to check for changes to Global Styles.

}

foreach ( $user_customisations['template_parts'] as $template_part ) {
$fileToUpdate = get_template_directory() . '/parts/' .
Copy link
Contributor

Choose a reason for hiding this comment

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

In older themes this is called block-template-parts. I don't think we necessarily need to account for that, but it is a limitation.

$user_customisations = $this->get_user_customisations();

foreach ( $user_customisations['templates'] as $template ) {
$fileToUpdate = get_template_directory() . '/templates/' .
Copy link
Contributor

Choose a reason for hiding this comment

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

In older themes this is called block-templates. I don't think we necessarily need to account for that, but it is a limitation.

// the result in an HTML comment".
// This reverses that escaping for saving back to files.
// @see `wp-includes/blocks.php`
$template->content = str_replace( '\\u002d\\u002d', '--', $template->content );
Copy link
Contributor

Choose a reason for hiding this comment

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

We took the decision not to do this when exporting the theme. If we're happy doing it here then I think we should also do the same for export.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Indeed from #39576 looks like we should leave these encodings in place.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Hmm the devex of working with code like this

 {"bottom":"var(\u002d\u002dwp\u002d\u002dcustom\u002d\u002dspacing\u002d\u002dsmall, 1.25rem)"}}}}

is awful so we need to not do it.

Copy link
Contributor

Choose a reason for hiding this comment

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

I agree, but if that's what we think we should make the same change in the export.

…folder path, checks edit_themes cap, refactoring, batch check for file and folder permissions
@nextgenthemes
Copy link

@draganescu Can you tell me how I can use/test this with wp-env? The "Update Theme" button shows up in TT2, but I have no permissions to edit theme files. So I press the button and it gives me the error that the file permissions are not set correctly.

And btw, for a manually added theme (skatepark) via config it actually does not give an error, it says "theme files exported" or something like that, and then it immediately resets to the original state so that does not seem to work.

This is my modded config.

{
        "core": "WordPress/WordPress",
        "plugins": [ "." ],
        "themes": [ "./test/emptytheme", "/home/user/websites/s.com/web/app/themes/skatepark" ],
        "config": { "ENABLE_THEME_SAVING": true },
        "env": {
                "tests": {
                        "mappings": {
                                "wp-content/plugins/gutenberg": ".",
                                "wp-content/mu-plugins": "./packages/e2e-tests/mu-plugins",
                                "wp-content/plugins/gutenberg-test-plugins": "./packages/e2e-tests/plugins",
                                "wp-content/themes/gutenberg-test-themes": "./packages/e2e-tests/themes"
                        }
                }
        }
}

@nextgenthemes
Copy link

I figured out the reset messup, it actually DOES work for the manually provided theme folder it is just that the theme uses the block-templates folder to read the templates and then saves them to templates so this messes things up and causes a reset.

@draganescu
Copy link
Contributor Author

@nextgenthemes for wpenv the only way is to use an outside linked theme, like you did with skatepark.

And btw, for a manually added theme (skatepark) via config it actually does not give an error, it says "theme files exported" or something like that, and then it immediately resets to the original state so that does not seem to work.

That actually looks like it is working :) To test have skatepark active, make a easily visible change, click update theme then open the template or part in a text editor and see if it did really change.

@draganescu
Copy link
Contributor Author

I will close this in accordance with the details here #39194 (comment)

@draganescu draganescu closed this May 26, 2022
@scruffian scruffian deleted the try/saving-to-theme-files branch May 26, 2022 08:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Save theme edits from the site editor to the theme files
5 participants