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

Allow plugins to add new items to the "Add new" menu on the Site Editor #46362

Closed
wants to merge 9 commits into from
3 changes: 3 additions & 0 deletions lib/compat/wordpress-6.1/template-parts-screen.php
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,8 @@ static function( $classes ) {
}
);

$extra_template_types = apply_filters( 'extra_template_types', array() );
albarin marked this conversation as resolved.
Show resolved Hide resolved

$indexed_template_types = array();
foreach ( get_default_block_template_types() as $slug => $template_type ) {
$template_type['slug'] = (string) $slug;
Expand All @@ -114,6 +116,7 @@ static function( $classes ) {
'siteUrl' => site_url(),
'postsPerPage' => get_option( 'posts_per_page' ),
'styles' => get_block_editor_theme_styles(),
'extraTemplateTypes' => $extra_template_types,
'defaultTemplateTypes' => $indexed_template_types,
'defaultTemplatePartAreas' => get_allowed_block_template_part_areas(),
'supportsLayout' => wp_theme_has_theme_json(),
Expand Down
43 changes: 43 additions & 0 deletions lib/compat/wordpress-6.2/template-parts-screen.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

/**
* Initialize the editor for the screen. Most of this is copied from `site-editor.php`.
*
* Note: Parts that need to be ported back should have inline comments.
*
* @return void
*/
function gutenberg_add_custom_settings() {
$extra_template_types = apply_filters( 'extra_template_types', array() );

$indexed_template_types = array();
foreach ( get_default_block_template_types() as $slug => $template_type ) {
$template_type['slug'] = (string) $slug;
$indexed_template_types[] = $template_type;
}

$block_editor_context = new WP_Block_Editor_Context( array( 'name' => 'core/edit-site' ) );
$custom_settings = array(
'siteUrl' => site_url(),
'postsPerPage' => get_option( 'posts_per_page' ),
'styles' => get_block_editor_theme_styles(),
'extraTemplateTypes' => $extra_template_types,
'defaultTemplateTypes' => $indexed_template_types,
'defaultTemplatePartAreas' => get_allowed_block_template_part_areas(),
'supportsLayout' => wp_theme_has_theme_json(),
'supportsTemplatePartsMode' => ! wp_is_block_theme() && current_theme_supports( 'block-template-parts' ),
);

$editor_settings = get_block_editor_settings( $custom_settings, $block_editor_context );

wp_add_inline_script(
'wp-edit-site',
sprintf(
'wp.domReady( function() {
wp.editSite.initializeEditor( "site-editor", %s );
} );',
wp_json_encode( $editor_settings )
)
);
}
add_action( 'admin_enqueue_scripts', 'gutenberg_add_custom_settings' );
1 change: 1 addition & 0 deletions lib/load.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ function gutenberg_is_experiment_enabled( $name ) {
require __DIR__ . '/compat/wordpress-6.2/class-wp-theme-json-6-2.php';
require __DIR__ . '/compat/wordpress-6.2/edit-form-blocks.php';
require __DIR__ . '/compat/wordpress-6.2/site-editor.php';
require __DIR__ . '/compat/wordpress-6.2/template-parts-screen.php';

// Experimental features.
remove_action( 'plugins_loaded', '_wp_theme_json_webfonts_handler' ); // Turns off WP 6.0's stopgap handler for Webfonts API.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import {
usePostTypeMenuItems,
useAuthorMenuItem,
usePostTypeArchiveMenuItems,
useExtraTemplateTypes,
} from './utils';
import AddCustomGenericTemplateModal from './add-custom-generic-template-modal';
import TemplateActionsLoadingScreen from './template-actions-loading-screen';
Expand Down Expand Up @@ -269,12 +270,13 @@ function useMissingTemplates(
) {
const existingTemplates = useExistingTemplates();
const defaultTemplateTypes = useDefaultTemplateTypes();
const extraTemplateTypes = useExtraTemplateTypes();
albarin marked this conversation as resolved.
Show resolved Hide resolved
const existingTemplateSlugs = ( existingTemplates || [] ).map(
( { slug } ) => slug
);
const missingDefaultTemplates = ( defaultTemplateTypes || [] ).filter(
( template ) =>
DEFAULT_TEMPLATE_SLUGS.includes( template.slug ) &&
[ ...DEFAULT_TEMPLATE_SLUGS ].includes( template.slug ) &&
albarin marked this conversation as resolved.
Show resolved Hide resolved
! existingTemplateSlugs.includes( template.slug )
);
const onClickMenuItem = ( _entityForSuggestions ) => {
Expand Down Expand Up @@ -326,6 +328,7 @@ function useMissingTemplates(
...usePostTypeArchiveMenuItems(),
...postTypesMenuItems,
...taxonomiesMenuItems,
...extraTemplateTypes,
];
return missingTemplates;
}
5 changes: 5 additions & 0 deletions packages/edit-site/src/components/add-new-template/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,11 @@ export const useDefaultTemplateTypes = () => {
[]
);
};
export const useExtraTemplateTypes = () => {
return useSelect( ( select ) => {
return select( editorStore ).__experimentalGetExtraTemplateTypes();
}, [] );
};

const usePublicPostTypes = () => {
const postTypes = useSelect(
Expand Down
1 change: 1 addition & 0 deletions packages/edit-site/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ export function reinitializeEditor( target, settings ) {
dispatch( editorStore ).updateEditorSettings( {
defaultTemplateTypes: settings.defaultTemplateTypes,
defaultTemplatePartAreas: settings.defaultTemplatePartAreas,
extraTemplateTypes: settings.extraTemplateTypes,
} );
}

Expand Down
11 changes: 11 additions & 0 deletions packages/editor/src/store/selectors.js
Original file line number Diff line number Diff line change
Expand Up @@ -1549,6 +1549,17 @@ export function __experimentalGetDefaultTemplateTypes( state ) {
return getEditorSettings( state )?.defaultTemplateTypes;
}

/**
* Returns the extra template slugs.
*
* @param {Object} state Global application state.
*
* @return {Array} The template slugs.
*/
export function __experimentalGetExtraTemplateTypes( state ) {
return getEditorSettings( state )?.extraTemplateTypes;
}

/**
* Returns the default template part areas.
*
Expand Down