From d5df8027bce298c7184f79656b7c4e6c02441f16 Mon Sep 17 00:00:00 2001 From: ella Date: Fri, 24 Oct 2025 18:27:13 +0200 Subject: [PATCH 1/4] Template activation: remove fake post type for registered templates --- ...nberg-rest-static-templates-controller.php | 8 ++-- lib/compat/wordpress-6.9/preload.php | 2 - .../wordpress-6.9/template-activate.php | 9 ++--- packages/core-data/src/entities.js | 9 +++++ packages/core-data/src/private-selectors.ts | 39 ++++--------------- packages/core-data/src/resolvers.js | 6 +-- .../edit-post/src/components/layout/index.js | 1 - .../src/components/page-templates/fields.js | 5 +-- .../src/components/page-templates/index.js | 6 +-- .../content.js | 8 +--- .../editor/src/components/provider/index.js | 5 +-- packages/editor/src/store/actions.js | 5 ++- .../fields/src/actions/duplicate-post.tsx | 10 ++--- 13 files changed, 38 insertions(+), 75 deletions(-) diff --git a/lib/compat/wordpress-6.9/class-gutenberg-rest-static-templates-controller.php b/lib/compat/wordpress-6.9/class-gutenberg-rest-static-templates-controller.php index 6c6dc7397a8bef..e6f9dd20a417cb 100644 --- a/lib/compat/wordpress-6.9/class-gutenberg-rest-static-templates-controller.php +++ b/lib/compat/wordpress-6.9/class-gutenberg-rest-static-templates-controller.php @@ -1,6 +1,11 @@ rest_base = 'wp_registered_template'; + $this->namespace = 'wp/v2'; + } + public function register_routes() { // Lists all templates. register_rest_route( @@ -82,7 +87,6 @@ public function get_items( $request ) { $templates = array(); foreach ( $query_result as $template ) { $item = $this->prepare_item_for_response( $template, $request ); - $item->data['type'] = 'wp_registered_template'; $templates[] = $this->prepare_response_for_collection( $item ); } @@ -97,8 +101,6 @@ public function get_item( $request ) { } $item = $this->prepare_item_for_response( $template, $request ); - // adjust the template type here instead - $item->data['type'] = 'wp_registered_template'; return rest_ensure_response( $item ); } } diff --git a/lib/compat/wordpress-6.9/preload.php b/lib/compat/wordpress-6.9/preload.php index 6f478b7d82e973..0a046c52376ebd 100644 --- a/lib/compat/wordpress-6.9/preload.php +++ b/lib/compat/wordpress-6.9/preload.php @@ -21,8 +21,6 @@ static function ( $path ) { } ); } - - $paths[] = '/wp/v2/wp_registered_template?context=edit'; } return $paths; diff --git a/lib/compat/wordpress-6.9/template-activate.php b/lib/compat/wordpress-6.9/template-activate.php index 9ffe41d2b6a786..7f32b215a4ec65 100644 --- a/lib/compat/wordpress-6.9/template-activate.php +++ b/lib/compat/wordpress-6.9/template-activate.php @@ -35,6 +35,9 @@ function gutenberg_maintain_templates_routes() { $wp_post_types['wp_template']->rest_base = 'wp_template'; $controller->register_routes(); + $registered_template_controller = new Gutenberg_REST_Static_Templates_Controller(); + $registered_template_controller->register_routes(); + // Add the same field as wp_registered_template. register_rest_field( 'wp_template', @@ -79,12 +82,6 @@ function gutenberg_maintain_templates_routes() { * @global array $wp_post_types List of post types. */ function gutenberg_setup_static_template() { - global $wp_post_types; - $wp_post_types['wp_registered_template'] = clone $wp_post_types['wp_template']; - $wp_post_types['wp_registered_template']->name = 'wp_registered_template'; - $wp_post_types['wp_registered_template']->rest_base = 'wp_registered_template'; - $wp_post_types['wp_registered_template']->rest_controller_class = 'Gutenberg_REST_Static_Templates_Controller'; - register_setting( 'reading', 'active_templates', diff --git a/packages/core-data/src/entities.js b/packages/core-data/src/entities.js index d7b7e421656481..8bd6733296e85e 100644 --- a/packages/core-data/src/entities.js +++ b/packages/core-data/src/entities.js @@ -202,6 +202,15 @@ export const rootEntitiesConfig = [ plural: 'statuses', key: 'slug', }, + { + label: __( 'Registered Templates' ), + name: 'registeredTemplate', + kind: 'root', + baseURL: '/wp/v2/wp_registered_template', + baseURLParams: { context: 'edit' }, + plural: 'registeredTemplates', + key: 'id', + }, ]; export const deprecatedEntities = { diff --git a/packages/core-data/src/private-selectors.ts b/packages/core-data/src/private-selectors.ts index eb121b170e03a1..742dbdaa28dbb9 100644 --- a/packages/core-data/src/private-selectors.ts +++ b/packages/core-data/src/private-selectors.ts @@ -240,38 +240,13 @@ export const getTemplateId = createRegistrySelector( // First see if the post/page has an assigned template and fetch it. const currentTemplateSlug = editedEntity.template; if ( currentTemplateSlug ) { - const userTemplates = select( STORE_NAME ).getEntityRecords( - 'postType', - 'wp_template', - { per_page: -1 } - ); - if ( ! userTemplates ) { - return; - } - const userTemplateWithSlug = userTemplates.find( - ( { slug } ) => slug === currentTemplateSlug - ); - - if ( userTemplateWithSlug ) { - return userTemplateWithSlug.id; - } - - const registeredTemplates = select( STORE_NAME ).getEntityRecords( - 'postType', - 'wp_registered_template', - { per_page: -1 } - ); - - if ( ! registeredTemplates ) { - return; - } - - const registeredTemplateWithSlug = registeredTemplates.find( - ( { slug } ) => slug === currentTemplateSlug - ); - - if ( registeredTemplateWithSlug ) { - return registeredTemplateWithSlug.id; + const currentTemplate = select( STORE_NAME ) + .getEntityRecords( 'postType', 'wp_template', { + per_page: -1, + } ) + ?.find( ( { slug } ) => slug === currentTemplateSlug ); + if ( currentTemplate ) { + return currentTemplate.id; } } // If no template is assigned, use the default template. diff --git a/packages/core-data/src/resolvers.js b/packages/core-data/src/resolvers.js index 1f6420ccb1345f..e1c67deefcfc5c 100644 --- a/packages/core-data/src/resolvers.js +++ b/packages/core-data/src/resolvers.js @@ -329,7 +329,7 @@ export const getEntityRecords = // the registered templates and rewrites IDs in the form of // `theme-slug/template-slug`. When turned off, we only fetch // database templates (posts). To fetch registered templates without - // edits applied, use the `wp_registered_template` entity. + // edits applied, use the `registeredTemplate` entity. const { combinedTemplates = true } = query; if ( @@ -899,10 +899,6 @@ export const getDefaultTemplateId = // Endpoint may return an empty object if no template is found. if ( id ) { template.id = id; - template.type = - typeof id === 'string' - ? 'wp_registered_template' - : 'wp_template'; registry.batch( () => { dispatch.receiveDefaultTemplateId( query, id ); dispatch.receiveEntityRecords( 'postType', template.type, [ diff --git a/packages/edit-post/src/components/layout/index.js b/packages/edit-post/src/components/layout/index.js index 6bf2b2349d240f..40d157fae217f3 100644 --- a/packages/edit-post/src/components/layout/index.js +++ b/packages/edit-post/src/components/layout/index.js @@ -81,7 +81,6 @@ const DESIGN_POST_TYPES = [ 'wp_template_part', 'wp_block', 'wp_navigation', - 'wp_registered_template', ]; function useEditorStyles( ...additionalStyles ) { diff --git a/packages/edit-site/src/components/page-templates/fields.js b/packages/edit-site/src/components/page-templates/fields.js index 2a57552a3647f3..64529ad87fb451 100644 --- a/packages/edit-site/src/components/page-templates/fields.js +++ b/packages/edit-site/src/components/page-templates/fields.js @@ -38,9 +38,8 @@ const { useEntityRecordsWithPermissions } = unlock( corePrivateApis ); function useAllDefaultTemplateTypes() { const defaultTemplateTypes = useDefaultTemplateTypes(); const { records: staticRecords } = useEntityRecordsWithPermissions( - 'postType', - 'wp_registered_template', - { per_page: -1 } + 'root', + 'registeredTemplate' ); return [ ...defaultTemplateTypes, diff --git a/packages/edit-site/src/components/page-templates/index.js b/packages/edit-site/src/components/page-templates/index.js index 6466a3e0437771..75a80a5866002a 100644 --- a/packages/edit-site/src/components/page-templates/index.js +++ b/packages/edit-site/src/components/page-templates/index.js @@ -93,9 +93,7 @@ export default function PageTemplates() { combinedTemplates: false, } ); const { records: staticRecords, isResolving: isLoadingStaticData } = - useEntityRecordsWithPermissions( 'postType', 'wp_registered_template', { - per_page: -1, - } ); + useEntityRecordsWithPermissions( 'root', 'registeredTemplate' ); const activeTemplates = useMemo( () => { const _active = [ ...staticRecords ].filter( @@ -325,7 +323,7 @@ export default function PageTemplates() { onChangeSelection={ onChangeSelection } isItemClickable={ () => true } onClickItem={ ( item ) => { - if ( item.type === 'wp_registered_template' ) { + if ( typeof item.id === 'string' ) { setSelectedRegisteredTemplate( item ); } else { history.navigate( diff --git a/packages/edit-site/src/components/sidebar-navigation-screen-templates-browse/content.js b/packages/edit-site/src/components/sidebar-navigation-screen-templates-browse/content.js index f05fc19395e7a5..28b7c0ee3e25ad 100644 --- a/packages/edit-site/src/components/sidebar-navigation-screen-templates-browse/content.js +++ b/packages/edit-site/src/components/sidebar-navigation-screen-templates-browse/content.js @@ -38,13 +38,7 @@ export default function DataviewsTemplatesSidebarContent() { const { query: { activeView = 'active' }, } = useLocation(); - const { records } = useEntityRecords( - 'postType', - 'wp_registered_template', - { - per_page: -1, - } - ); + const { records } = useEntityRecords( 'root', 'registeredTemplate' ); const firstItemPerAuthorText = useMemo( () => { const firstItemPerAuthor = records?.reduce( ( acc, template ) => { const author = template.author_text; diff --git a/packages/editor/src/components/provider/index.js b/packages/editor/src/components/provider/index.js index 38c7bed482c68e..911b0e74139481 100644 --- a/packages/editor/src/components/provider/index.js +++ b/packages/editor/src/components/provider/index.js @@ -219,10 +219,7 @@ export const ExperimentalEditorProvider = withRegistryProvider( const defaultBlockContext = useMemo( () => { const postContext = {}; // If it is a template, try to inherit the post type from the name. - if ( - post.type === 'wp_template' || - post.type === 'wp_registered_template' - ) { + if ( post.type === 'wp_template' ) { if ( post.slug === 'page' ) { postContext.postType = 'page'; } else if ( post.slug === 'single' ) { diff --git a/packages/editor/src/store/actions.js b/packages/editor/src/store/actions.js index 6cea1db476af4b..3eda2950e411cf 100644 --- a/packages/editor/src/store/actions.js +++ b/packages/editor/src/store/actions.js @@ -734,7 +734,10 @@ export function updateEditorSettings( settings ) { export const setRenderingMode = ( mode ) => ( { dispatch, registry, select } ) => { - if ( select.__unstableIsEditorReady() ) { + if ( + select.__unstableIsEditorReady() && + ! select.getEditorSettings().isPreviewMode + ) { // We clear the block selection but we also need to clear the selection from the core store. registry.dispatch( blockEditorStore ).clearSelectedBlock(); dispatch.editPost( { selection: undefined }, { undoIgnore: true } ); diff --git a/packages/fields/src/actions/duplicate-post.tsx b/packages/fields/src/actions/duplicate-post.tsx index 7af2131f9eee35..2bd1c9b68ea573 100644 --- a/packages/fields/src/actions/duplicate-post.tsx +++ b/packages/fields/src/actions/duplicate-post.tsx @@ -62,9 +62,7 @@ const duplicatePost: Action< BasePost > = { return; } - const isTemplate = - item.type === 'wp_template' || - item.type === 'wp_registered_template'; + const isTemplate = item.type === 'wp_template'; const newItemObject = { status: isTemplate ? 'publish' : 'draft', @@ -108,9 +106,7 @@ const duplicatePost: Action< BasePost > = { try { const newItem = await saveEntityRecord( 'postType', - item.type === 'wp_registered_template' - ? 'wp_template' - : item.type, + item.type, newItemObject, { throwOnError: true } ); @@ -149,7 +145,7 @@ const duplicatePost: Action< BasePost > = { return (
- { item.type === 'wp_registered_template' && ( + { typeof item.id === 'string' && (
{ __( 'You are about to duplicate a bundled template. Changes will not be live until you activate the new template.' From d5ab4c29a60eb5d1d0b2d8608605b27e9b925f52 Mon Sep 17 00:00:00 2001 From: ella Date: Fri, 24 Oct 2025 18:59:24 +0200 Subject: [PATCH 2/4] lint and fix preload fixture --- .../class-gutenberg-rest-static-templates-controller.php | 4 ++-- test/e2e/specs/site-editor/preload.spec.js | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/compat/wordpress-6.9/class-gutenberg-rest-static-templates-controller.php b/lib/compat/wordpress-6.9/class-gutenberg-rest-static-templates-controller.php index e6f9dd20a417cb..0d156bf9161a35 100644 --- a/lib/compat/wordpress-6.9/class-gutenberg-rest-static-templates-controller.php +++ b/lib/compat/wordpress-6.9/class-gutenberg-rest-static-templates-controller.php @@ -86,8 +86,8 @@ public function get_items( $request ) { $query_result = gutenberg_get_registered_block_templates( $query ); $templates = array(); foreach ( $query_result as $template ) { - $item = $this->prepare_item_for_response( $template, $request ); - $templates[] = $this->prepare_response_for_collection( $item ); + $item = $this->prepare_item_for_response( $template, $request ); + $templates[] = $this->prepare_response_for_collection( $item ); } return rest_ensure_response( $templates ); diff --git a/test/e2e/specs/site-editor/preload.spec.js b/test/e2e/specs/site-editor/preload.spec.js index a214746a2847de..1047a6370aaf6e 100644 --- a/test/e2e/specs/site-editor/preload.spec.js +++ b/test/e2e/specs/site-editor/preload.spec.js @@ -46,7 +46,6 @@ test.describe( 'Preload', () => { // To do: these should all be removed or preloaded. expect( requests ).toEqual( [ - '/wp/v2/templates/emptytheme//index?context=edit', // Seems to be coming from `enableComplementaryArea`. '/wp/v2/users/me', // There are two separate settings OPTIONS requests. We should fix From 286e7028effe6918cbb3f1fd0f6346c53b1bbd16 Mon Sep 17 00:00:00 2001 From: ella Date: Fri, 24 Oct 2025 19:19:56 +0200 Subject: [PATCH 3/4] backport log --- backport-changelog/6.9/8063.md | 1 + 1 file changed, 1 insertion(+) diff --git a/backport-changelog/6.9/8063.md b/backport-changelog/6.9/8063.md index 40fa73b8841818..d6afd5977c9722 100644 --- a/backport-changelog/6.9/8063.md +++ b/backport-changelog/6.9/8063.md @@ -11,3 +11,4 @@ https://github.com/WordPress/wordpress-develop/pull/8063 * https://github.com/WordPress/gutenberg/pull/72141 * https://github.com/WordPress/gutenberg/pull/72223 * https://github.com/WordPress/gutenberg/pull/72285 +* https://github.com/WordPress/gutenberg/pull/72674 From 70bd465f1ab999d51d93e5440e13243643d7b0fd Mon Sep 17 00:00:00 2001 From: ella Date: Fri, 24 Oct 2025 21:01:10 +0200 Subject: [PATCH 4/4] Remove useless config keys --- packages/core-data/src/entities.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/core-data/src/entities.js b/packages/core-data/src/entities.js index 8bd6733296e85e..d56f37b5d30091 100644 --- a/packages/core-data/src/entities.js +++ b/packages/core-data/src/entities.js @@ -207,8 +207,6 @@ export const rootEntitiesConfig = [ name: 'registeredTemplate', kind: 'root', baseURL: '/wp/v2/wp_registered_template', - baseURLParams: { context: 'edit' }, - plural: 'registeredTemplates', key: 'id', }, ];