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

Feature: Set editor rendering mode by post type #62304

Merged
Merged
Show file tree
Hide file tree
Changes from 59 commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
ab4b075
Add Post_Types_Controller compat class. Add rendering_mode parameter …
TylerB24890 Jun 4, 2024
ca0de5d
Add the rendering_mode property to the post type object properties
TylerB24890 Jun 4, 2024
3beef1e
Check that the rendering_mode property exists before attempting to ac…
TylerB24890 Jun 4, 2024
9b276d2
Fix PHP filters from overriding one another. Implement the defaultRen…
TylerB24890 Jun 4, 2024
a26a583
Remove unnecessary optional chain inside conditional
TylerB24890 Jun 4, 2024
b538ae6
Dont override the rendering_mode value if set during post type regist…
TylerB24890 Jun 4, 2024
e3912d4
Move all code to a new 6.7 compat directory. Update the post type pro…
TylerB24890 Jun 5, 2024
702a5be
Update rendering_mode filters to always be prefixed with post_type_
TylerB24890 Jun 6, 2024
964a148
Remove the editor mode props from the individual editors (site + post…
TylerB24890 Jun 6, 2024
aabbca8
Merge latest trunk and resolve conflicts.
TylerB24890 Jun 6, 2024
c9f2274
Merge latest trunk and resolve conflicts
TylerB24890 Jun 10, 2024
298c858
Prevent rendering editor until mode constant is defined.
TylerB24890 Jun 10, 2024
d85f56c
Add validation for rendering modes passed to post types.
TylerB24890 Jun 10, 2024
9c631fe
Merge branch 'trunk' into feature/post-type-rendering-mode-58038
TylerB24890 Jun 11, 2024
de00c45
Use a single useSelect() hook
TylerB24890 Jun 11, 2024
bf3fbca
Set default rendering mode for pages to template-locked
TylerB24890 Jun 11, 2024
5c98bf6
Merge branch 'trunk' into feature/post-type-rendering-mode-58038
TylerB24890 Jun 12, 2024
40c2fa3
Use post.type as hook dependency instead of full post object
TylerB24890 Jun 12, 2024
c2b1f92
Merge branch 'trunk' into feature/post-type-rendering-mode-58038
TylerB24890 Jun 13, 2024
1f7ff09
Fix since documentation. Fix array standard.
TylerB24890 Jun 13, 2024
40ce652
Update rendering_modes function name to be prefixed with post_type_
TylerB24890 Jun 13, 2024
b361cd5
Merge branch 'trunk' into feature/post-type-rendering-mode-58038
TylerB24890 Jun 28, 2024
24118c7
Merge latest trunk & resolve conflicts
TylerB24890 Jul 18, 2024
a0a766c
Create new setRenderingMode playwright utility to reset the rendering…
TylerB24890 Jul 18, 2024
882f69c
evaluate the page before attempting to access global variables
TylerB24890 Jul 18, 2024
a2ac4b3
Merge branch 'trunk' into feature/post-type-rendering-mode-58038
TylerB24890 Jul 18, 2024
3496d55
Add rendering mode parameter to the setRenderingMode utility
TylerB24890 Jul 18, 2024
65c264b
check if active theme is block theme
Sidsector9 Jul 30, 2024
a27c07e
fix broken test
Sidsector9 Jul 30, 2024
ac9556d
Merge pull request #1 from Sidsector9/pr-62304-fixes
Sidsector9 Jul 30, 2024
148837e
Merge branch 'trunk' into feature/post-type-rendering-mode-58038
TylerB24890 Aug 2, 2024
3619aed
Add core backport changelog entry
TylerB24890 Aug 2, 2024
b080013
Adjust order of rendering_mode filters
TylerB24890 Aug 2, 2024
c07a005
Merge branch 'trunk' into feature/post-type-rendering-mode-58038
TylerB24890 Aug 5, 2024
42bbbae
Merge latest trunk & resolve conflicts
TylerB24890 Aug 16, 2024
f38b926
Merge branch 'trunk' into feature/post-type-rendering-mode-58038
TylerB24890 Aug 20, 2024
5d9a3f4
Set the editor rendering mode when a page is created for the performa…
TylerB24890 Aug 20, 2024
4967bf0
write setEditorRenderingMode method for playwright performance tests
TylerB24890 Aug 20, 2024
e44556d
Merge branch 'trunk' into feature/post-type-rendering-mode-58038
TylerB24890 Aug 20, 2024
7e72459
Fix the rendering mode switcher for performance tests
TylerB24890 Aug 21, 2024
1b18340
Merge branch 'trunk' into feature/post-type-rendering-mode-58038
fabiankaegy Nov 14, 2024
a55cd68
fix move files to 6.8 compat folder
fabiankaegy Nov 14, 2024
429b338
fix move to 6.8 folder
fabiankaegy Nov 14, 2024
d523598
fix reset test overrides
fabiankaegy Nov 14, 2024
41601ec
fix reset whitespace changes
fabiankaegy Nov 14, 2024
05abd41
fix reset whitespace changes
fabiankaegy Nov 14, 2024
4904b5a
fix reset whitespace
fabiankaegy Nov 14, 2024
40d7324
fix reset change of if condition
fabiankaegy Nov 14, 2024
c2d58a9
fix ensure post type object has loaded before editor renders
fabiankaegy Nov 14, 2024
9e8e08c
fix remove template-lock rendering mode
fabiankaegy Nov 14, 2024
b94e309
Fix root post loading
youknowriad Nov 15, 2024
a742e4a
fix only apply default rendering mode on load
fabiankaegy Nov 15, 2024
fcb1449
fix: Expose rendering mode to mobile editor
dcalhoun Nov 15, 2024
ec543c5
test: Mobile editor mocks getPostType resolution
dcalhoun Nov 15, 2024
2aa288d
attempt to fix performance tests by forcing `post-only` rendering mod…
fabiankaegy Nov 15, 2024
f0c680f
Merge branch 'trunk' into feature/post-type-rendering-mode-58038
fabiankaegy Nov 19, 2024
557ec18
fix remove unused passed argument from useSpecificEditorSettings call
fabiankaegy Nov 19, 2024
9068ab1
fix clean up performance tests by moving rendering mode change into i…
fabiankaegy Nov 19, 2024
4512fce
simplify performance tests for rendering mode
fabiankaegy Nov 19, 2024
f282a47
fix move backport file to correct folder
fabiankaegy Nov 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions backport-changelog/6.7/7129.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
https://github.com/WordPress/wordpress-develop/pull/7129

* https://github.com/WordPress/gutenberg/pull/62304
fabiankaegy marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php
/**
* REST API: Gutenberg_REST_Post_Types_Controller_6_8 class
*
* @package gutenberg
*/

/**
* Gutenberg_REST_Post_Types_Controller_6_8 class
*
* Add Block Editor default rendering mode to the post type response
* to allow enabling/disabling at the post type level.
*/
class Gutenberg_REST_Post_Types_Controller_6_8 extends WP_REST_Post_Types_Controller {
/**
* Add Block Editor default rendering mode setting to the response.
*
* @param WP_Post_Type $item Post type object.
* @param WP_REST_Request $request Request object.
* @return WP_REST_Response Response object.
*/
public function prepare_item_for_response( $item, $request ) {
$response = parent::prepare_item_for_response( $item, $request );
$context = ! empty( $request['context'] ) ? $request['context'] : 'view';

// Property will only exist if the post type supports the block editor.
if ( 'edit' === $context && property_exists( $item, 'default_rendering_mode' ) ) {
/**
* Filters the block editor rendering mode for a post type.
*
* @since 6.8.0
* @param string $default_rendering_mode Default rendering mode for the post type.
* @param WP_Post_Type $post_type Post type name.
* @return string Default rendering mode for the post type.
*/
$rendering_mode = apply_filters( 'post_type_default_rendering_mode', $item->default_rendering_mode, $item );

/**
* Filters the block editor rendering mode for a specific post type.
* Applied after the generic `post_type_default_rendering_mode` filter.
*
* The dynamic portion of the hook name, `$item->name`, refers to the post type slug.
*
* @since 6.8.0
* @param string $default_rendering_mode Default rendering mode for the post type.
* @param WP_Post_Type $post_type Post type object.
* @return string Default rendering mode for the post type.
*/
$rendering_mode = apply_filters( "post_type_{$item->name}_default_rendering_mode", $rendering_mode, $item );

// Validate the filtered rendering mode.
if ( ! in_array( $rendering_mode, gutenberg_post_type_rendering_modes(), true ) ) {
$rendering_mode = 'post-only';
}

$response->data['default_rendering_mode'] = $rendering_mode;
}

return rest_ensure_response( $response );
}
}
57 changes: 57 additions & 0 deletions lib/compat/wordpress-6.8/post.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?php
/**
* Temporary compatibility shims for block APIs present in Gutenberg.
*
* @package gutenberg
*/

/**
* Get the available rendering modes for the Block Editor.
*
* post-only: This mode extracts the post blocks from the template and renders only those.
* The idea is to allow the user to edit the post/page in isolation without the wrapping template.
*
* template-locked: This mode renders both the template and the post blocks
* but the template blocks are locked and can't be edited. The post blocks are editable.
*
* @return array Array of available rendering modes.
*/
function gutenberg_post_type_rendering_modes() {
return array(
'post-only',
'template-locked',
);
}

/**
* Add the default_rendering_mode property to the WP_Post_Type object.
* This property can be overwritten by using the post_type_default_rendering_mode filter.
*
* @param array $args Array of post type arguments.
* @param string $post_type Post type key.
* @return array Updated array of post type arguments.
*/
function gutenberg_post_type_default_rendering_mode( $args, $post_type ) {
$rendering_mode = 'page' === $post_type ? 'template-locked' : 'post-only';
$rendering_modes = gutenberg_post_type_rendering_modes();

// Make sure the post type supports the block editor.
if (
wp_is_block_theme() &&
( isset( $args['show_in_rest'] ) && $args['show_in_rest'] ) &&
( isset( $args['supports'] ) && in_array( 'editor', $args['supports'], true ) )
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 causing a crash when the supports arg to register_post_type is false:

Fatal error: Uncaught TypeError: in_array(): Argument #2 ($haystack) must be of type array, bool given in /var/www/html/wp-content/plugins/gutenberg/lib/compat/wordpress-6.8/post.php:42
Stack trace:
#0 /var/www/html/wp-content/plugins/gutenberg/lib/compat/wordpress-6.8/post.php(42): in_array('editor', false, true)
#1 /var/www/html/wp-includes/class-wp-hook.php(324): gutenberg_post_type_default_rendering_mode(Array, 'product_variati...')
#2 /var/www/html/wp-includes/plugin.php(205): WP_Hook->apply_filters(Array, Array)
#3 /var/www/html/wp-includes/class-wp-post-type.php(491): apply_filters('register_post_t...', Array, 'product_variati...')
#4 /var/www/html/wp-includes/class-wp-post-type.php(467): WP_Post_Type->set_props(Array)
#5 /var/www/html/wp-includes/post.php(1805): WP_Post_Type->__construct('product_variati...', Array)
#6 /var/www/html/wp-content/plugins/woocommerce/includes/class-wc-post-types.php(442): register_post_type('product_variati...', Array)

WooCommerce registers its product_variation post type with supports => false. It's a supported and documented value for supports, whose type is array|false.

Copy link
Member

Choose a reason for hiding this comment

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

Fixing in #67225.

) {
// Validate the supplied rendering mode.
if (
isset( $args['default_rendering_mode'] ) &&
in_array( $args['default_rendering_mode'], $rendering_modes, true )
) {
$rendering_mode = $args['default_rendering_mode'];
}

$args['default_rendering_mode'] = $rendering_mode;
Copy link
Member

Choose a reason for hiding this comment

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

Surprised that we even allow adding custom args... We should have added an allowlist.

}

return $args;
}
add_filter( 'register_post_type_args', 'gutenberg_post_type_default_rendering_mode', 10, 2 );
22 changes: 22 additions & 0 deletions lib/compat/wordpress-6.8/rest-api.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php
/**
* PHP and WordPress configuration compatibility functions for the Gutenberg
* editor plugin changes related to REST API.
*
* @package gutenberg
*/

if ( ! defined( 'ABSPATH' ) ) {
die( 'Silence is golden.' );
}

if ( ! function_exists( 'gutenberg_add_post_type_rendering_mode' ) ) {
/**
* Add Block Editor default rendering mode to the post type response.
*/
function gutenberg_add_post_type_rendering_mode() {
$controller = new Gutenberg_REST_Post_Types_Controller_6_8();
$controller->register_routes();
}
}
add_action( 'rest_api_init', 'gutenberg_add_post_type_rendering_mode' );
3 changes: 3 additions & 0 deletions lib/load.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ function gutenberg_is_experiment_enabled( $name ) {
// WordPress 6.8 compat.
require __DIR__ . '/compat/wordpress-6.8/block-comments.php';
require __DIR__ . '/compat/wordpress-6.8/class-gutenberg-rest-comment-controller-6-8.php';
require __DIR__ . '/compat/wordpress-6.8/class-gutenberg-rest-post-types-controller-6-8.php';
require __DIR__ . '/compat/wordpress-6.8/rest-api.php';

// Plugin specific code.
require_once __DIR__ . '/class-wp-rest-global-styles-controller-gutenberg.php';
Expand Down Expand Up @@ -120,6 +122,7 @@ function gutenberg_is_experiment_enabled( $name ) {
require __DIR__ . '/compat/wordpress-6.8/preload.php';
require __DIR__ . '/compat/wordpress-6.8/blocks.php';
require __DIR__ . '/compat/wordpress-6.8/functions.php';
require __DIR__ . '/compat/wordpress-6.8/post.php';

// Experimental features.
require __DIR__ . '/experimental/block-editor-settings-mobile.php';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,7 @@ function useNavigateToPreviousEntityRecord() {
return goBack;
}

export function useSpecificEditorSettings(
shouldUseTemplateAsDefaultRenderingMode
) {
export function useSpecificEditorSettings() {
fabiankaegy marked this conversation as resolved.
Show resolved Hide resolved
const { params } = useLocation();
const { canvas = 'view' } = params;
const onNavigateToEntityRecord = useNavigateToEntityRecord();
Expand All @@ -49,11 +47,6 @@ export function useSpecificEditorSettings(
};
}, [] );

// TODO: The `shouldUseTemplateAsDefaultRenderingMode` check should be removed when the default rendering mode per post type is merged.
// @see https://github.com/WordPress/gutenberg/pull/62304/
const defaultRenderingMode = shouldUseTemplateAsDefaultRenderingMode
? 'template-locked'
: 'post-only';
const onNavigateToPreviousEntityRecord =
useNavigateToPreviousEntityRecord();
const defaultEditorSettings = useMemo( () => {
Expand All @@ -63,15 +56,13 @@ export function useSpecificEditorSettings(
richEditingEnabled: true,
supportsTemplateMode: true,
focusMode: canvas !== 'view',
defaultRenderingMode,
onNavigateToEntityRecord,
onNavigateToPreviousEntityRecord,
isPreviewMode: canvas === 'view',
};
}, [
settings,
canvas,
defaultRenderingMode,
onNavigateToEntityRecord,
onNavigateToPreviousEntityRecord,
] );
Expand Down
4 changes: 1 addition & 3 deletions packages/edit-site/src/components/editor/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,7 @@ export default function EditSiteEditor( { isPostsList = false } ) {
'edit-site-editor__loading-progress'
);

const settings = useSpecificEditorSettings(
!! context?.postId && context?.postType !== 'post'
);
const settings = useSpecificEditorSettings();
const styles = useMemo(
() => [
...settings.styles,
Expand Down
83 changes: 54 additions & 29 deletions packages/editor/src/components/provider/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,7 @@ const NON_CONTEXTUAL_POST_TYPES = [
* @return {Array} Block editor props.
*/
function useBlockEditorProps( post, template, mode ) {
const rootLevelPost =
mode === 'post-only' || ! template ? 'post' : 'template';
const rootLevelPost = mode === 'template-locked' ? 'template' : 'post';
const [ postBlocks, onInput, onChange ] = useEntityBlockEditor(
'postType',
post.type,
Expand Down Expand Up @@ -164,30 +163,48 @@ export const ExperimentalEditorProvider = withRegistryProvider(
BlockEditorProviderComponent = ExperimentalBlockEditorProvider,
__unstableTemplate: template,
} ) => {
const { editorSettings, selection, isReady, mode, postTypeEntities } =
useSelect(
( select ) => {
const {
getEditorSettings,
getEditorSelection,
getRenderingMode,
__unstableIsEditorReady,
} = select( editorStore );
const { getEntitiesConfig } = select( coreStore );
const {
editorSettings,
selection,
isReady,
mode,
defaultMode,
postTypeEntities,
hasLoadedPostObject,
} = useSelect(
( select ) => {
const {
getEditorSettings,
getEditorSelection,
getRenderingMode,
__unstableIsEditorReady,
} = select( editorStore );
const { getEntitiesConfig } = select( coreStore );

const postTypeObject = select( coreStore ).getPostType(
post.type
);

const _hasLoadedPostObject = select(
coreStore
).hasFinishedResolution( 'getPostType', [ post.type ] );

return {
editorSettings: getEditorSettings(),
isReady: __unstableIsEditorReady(),
mode: getRenderingMode(),
selection: getEditorSelection(),
postTypeEntities:
post.type === 'wp_template'
? getEntitiesConfig( 'postType' )
: null,
};
},
[ post.type ]
);
return {
hasLoadedPostObject: _hasLoadedPostObject,
editorSettings: getEditorSettings(),
isReady: __unstableIsEditorReady(),
mode: getRenderingMode(),
defaultMode:
postTypeObject?.default_rendering_mode ?? 'post-only',
selection: getEditorSelection(),
postTypeEntities:
post.type === 'wp_template'
? getEntitiesConfig( 'postType' )
: null,
};
},
[ post.type ]
);
const shouldRenderTemplate = !! template && mode !== 'post-only';
const rootLevelPost = shouldRenderTemplate ? template : post;
const defaultBlockContext = useMemo( () => {
Expand Down Expand Up @@ -282,7 +299,15 @@ export const ExperimentalEditorProvider = withRegistryProvider(
}
);
}
}, [] );
}, [
createWarningNotice,
initialEdits,
settings,
post,
recovery,
setupEditor,
updatePostLock,
] );

// Synchronizes the active post with the state
useEffect( () => {
Expand All @@ -301,15 +326,15 @@ export const ExperimentalEditorProvider = withRegistryProvider(

// Sets the right rendering mode when loading the editor.
useEffect( () => {
fabiankaegy marked this conversation as resolved.
Show resolved Hide resolved
setRenderingMode( settings.defaultRenderingMode ?? 'post-only' );
}, [ settings.defaultRenderingMode, setRenderingMode ] );
setRenderingMode( defaultMode );
}, [ defaultMode, setRenderingMode ] );
Copy link
Contributor

Choose a reason for hiding this comment

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

This change is one that I'm not entirely sure about. I think the default rendering mode should only be enforced when the "edited entity" changes. In practice though, this seems to have the same effect.

Anyway, not a big deal for now.


useHideBlocksFromInserter( post.type, mode );

// Register the editor commands.
useCommands();

if ( ! isReady ) {
if ( ! isReady || ! mode || ! hasLoadedPostObject ) {
return null;
}

Expand Down
2 changes: 2 additions & 0 deletions packages/editor/src/store/reducer.native.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { combineReducers } from '@wordpress/data';
import {
postId,
postType,
renderingMode,
saving,
postLock,
postSavingLock,
Expand Down Expand Up @@ -82,6 +83,7 @@ export default combineReducers( {
postId,
postType,
postTitle,
renderingMode,
saving,
postLock,
postSavingLock,
Expand Down
17 changes: 17 additions & 0 deletions test/native/integration-test-helpers/initialize-editor.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import { v4 as uuid } from 'uuid';
import { createElement, cloneElement } from '@wordpress/element';
// eslint-disable-next-line no-restricted-imports
import { initializeEditor as internalInitializeEditor } from '@wordpress/edit-post';
import { store as coreStore } from '@wordpress/core-data';
import { select } from '@wordpress/data';

/**
* Internal dependencies
Expand All @@ -28,6 +30,21 @@ import { getGlobalStyles } from './get-global-styles';
* @return {import('@testing-library/react-native').RenderAPI} A Testing Library screen.
*/
export async function initializeEditor( props, { component } = {} ) {
const resolutionSpy = jest.spyOn(
select( coreStore ),
'hasFinishedResolution'
);
const actualResolution = resolutionSpy.getMockImplementation();
resolutionSpy.mockImplementation( ( selectorName, args ) => {
// The mobile editor only supports the `post-only` rendering mode, so we
// presume a resolved `getPostType` selector to unblock editor rendering.
if ( 'getPostType' === selectorName ) {
return true;
}

return actualResolution( selectorName, args );
} );

const uniqueId = uuid();
const postId = `post-id-${ uniqueId }`;
const postType = 'post';
Expand Down
Loading
Loading