diff --git a/lib/compat/wordpress-6.5/block-bindings/pattern-overrides.php b/lib/compat/wordpress-6.6/block-bindings/pattern-overrides.php similarity index 100% rename from lib/compat/wordpress-6.5/block-bindings/pattern-overrides.php rename to lib/compat/wordpress-6.6/block-bindings/pattern-overrides.php diff --git a/lib/load.php b/lib/load.php index 454bc3325f612..f0cb03473cb28 100644 --- a/lib/load.php +++ b/lib/load.php @@ -122,9 +122,13 @@ function gutenberg_is_experiment_enabled( $name ) { } require __DIR__ . '/compat/wordpress-6.5/block-bindings/block-bindings.php'; require __DIR__ . '/compat/wordpress-6.5/block-bindings/post-meta.php'; -require __DIR__ . '/compat/wordpress-6.5/block-bindings/pattern-overrides.php'; require __DIR__ . '/compat/wordpress-6.5/script-loader.php'; +// Not to be included in WordPress 6.5. +if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) { + require __DIR__ . '/compat/wordpress-6.6/block-bindings/pattern-overrides.php'; +} + // Experimental features. require __DIR__ . '/experimental/block-editor-settings-mobile.php'; require __DIR__ . '/experimental/blocks.php'; diff --git a/packages/block-library/src/block/edit.js b/packages/block-library/src/block/edit.js index ddacc47dbd039..6e6379571cc9e 100644 --- a/packages/block-library/src/block/edit.js +++ b/packages/block-library/src/block/edit.js @@ -28,7 +28,7 @@ import { BlockControls, } from '@wordpress/block-editor'; import { privateApis as patternsPrivateApis } from '@wordpress/patterns'; -import { parse, cloneBlock } from '@wordpress/blocks'; +import { parse, cloneBlock, store as blocksStore } from '@wordpress/blocks'; import { RichTextData } from '@wordpress/rich-text'; /** @@ -265,6 +265,7 @@ export default function ReusableBlockEdit( { getBlockEditingMode, onNavigateToEntityRecord, editingMode, + hasPatternOverridesSource, } = useSelect( ( select ) => { const { canUser } = select( coreStore ); @@ -273,6 +274,7 @@ export default function ReusableBlockEdit( { getSettings, getBlockEditingMode: _getBlockEditingMode, } = select( blockEditorStore ); + const { getBlockBindingsSource } = unlock( select( blocksStore ) ); const blocks = getBlocks( patternClientId ); const canEdit = canUser( 'update', 'blocks', ref ); @@ -284,6 +286,9 @@ export default function ReusableBlockEdit( { onNavigateToEntityRecord: getSettings().onNavigateToEntityRecord, editingMode: _getBlockEditingMode( patternClientId ), + hasPatternOverridesSource: !! getBlockBindingsSource( + 'core/pattern-overrides' + ), }; }, [ patternClientId, ref ] @@ -295,13 +300,20 @@ export default function ReusableBlockEdit( { setBlockEditingMode, innerBlocks, // Disable editing if the pattern itself is disabled. - editingMode === 'disabled' ? 'disabled' : undefined + editingMode === 'disabled' || ! hasPatternOverridesSource + ? 'disabled' + : undefined ); - }, [ editingMode, innerBlocks, setBlockEditingMode ] ); + }, [ + editingMode, + innerBlocks, + setBlockEditingMode, + hasPatternOverridesSource, + ] ); const canOverrideBlocks = useMemo( - () => hasOverridableBlocks( innerBlocks ), - [ innerBlocks ] + () => hasPatternOverridesSource && hasOverridableBlocks( innerBlocks ), + [ hasPatternOverridesSource, innerBlocks ] ); const initialBlocks = useMemo( @@ -329,19 +341,21 @@ export default function ReusableBlockEdit( { registry.batch( () => { setBlockEditingMode( patternClientId, 'default' ); syncDerivedUpdates( () => { - replaceInnerBlocks( - patternClientId, - applyInitialContentValuesToInnerBlocks( - initialBlocks, - initialContent.current, - defaultContent.current, - legacyIdMap.current - ) - ); + const blocks = hasPatternOverridesSource + ? applyInitialContentValuesToInnerBlocks( + initialBlocks, + initialContent.current, + defaultContent.current, + legacyIdMap.current + ) + : initialBlocks; + + replaceInnerBlocks( patternClientId, blocks ); } ); setBlockEditingMode( patternClientId, originalEditingMode ); } ); }, [ + hasPatternOverridesSource, __unstableMarkNextChangeAsNotPersistent, patternClientId, initialBlocks, @@ -377,6 +391,9 @@ export default function ReusableBlockEdit( { // Sync the `content` attribute from the updated blocks to the pattern block. // `syncDerivedUpdates` is used here to avoid creating an additional undo level. useEffect( () => { + if ( ! hasPatternOverridesSource ) { + return; + } const { getBlocks } = registry.select( blockEditorStore ); let prevBlocks = getBlocks( patternClientId ); return registry.subscribe( () => { @@ -394,7 +411,13 @@ export default function ReusableBlockEdit( { } ); } }, blockEditorStore ); - }, [ syncDerivedUpdates, patternClientId, registry, setAttributes ] ); + }, [ + hasPatternOverridesSource, + syncDerivedUpdates, + patternClientId, + registry, + setAttributes, + ] ); const handleEditOriginal = () => { onNavigateToEntityRecord( { diff --git a/packages/editor/src/bindings/index.js b/packages/editor/src/bindings/index.js index 1977f9980b067..ce77b87ebc7a5 100644 --- a/packages/editor/src/bindings/index.js +++ b/packages/editor/src/bindings/index.js @@ -11,5 +11,8 @@ import patternOverrides from './pattern-overrides'; import postMeta from './post-meta'; const { registerBlockBindingsSource } = unlock( dispatch( blocksStore ) ); -registerBlockBindingsSource( patternOverrides ); registerBlockBindingsSource( postMeta ); + +if ( process.env.IS_GUTENBERG_PLUGIN ) { + registerBlockBindingsSource( patternOverrides ); +} diff --git a/packages/patterns/src/components/use-set-pattern-bindings.js b/packages/patterns/src/components/use-set-pattern-bindings.js index df16d2b2b0591..261187a91088c 100644 --- a/packages/patterns/src/components/use-set-pattern-bindings.js +++ b/packages/patterns/src/components/use-set-pattern-bindings.js @@ -2,13 +2,17 @@ * WordPress dependencies */ import { usePrevious } from '@wordpress/compose'; +import { store as blocksStore } from '@wordpress/blocks'; import { useEffect } from '@wordpress/element'; +import { useSelect } from '@wordpress/data'; /** * Internal dependencies */ import { PARTIAL_SYNCING_SUPPORTED_BLOCKS } from '../constants'; +import { unlock } from '../lock-unlock'; + function removeBindings( bindings, syncedAttributes ) { let updatedBindings = {}; for ( const attributeName of syncedAttributes ) { @@ -42,6 +46,13 @@ export default function useSetPatternBindings( { name, attributes, setAttributes }, currentPostType ) { + const hasPatternOverridesSource = useSelect( ( select ) => { + const { getBlockBindingsSource } = unlock( select( blocksStore ) ); + + // For editing link to the site editor if the theme and user permissions support it. + return !! getBlockBindingsSource( 'core/pattern-overrides' ); + }, [] ); + const metadataName = attributes?.metadata?.name ?? ''; const prevMetadataName = usePrevious( metadataName ) ?? ''; const bindings = attributes?.metadata?.bindings; @@ -49,7 +60,9 @@ export default function useSetPatternBindings( useEffect( () => { // Bindings should only be created when editing a wp_block post type, // and also when there's a change to the user-given name for the block. + // Also check that the pattern overrides source is registered. if ( + ! hasPatternOverridesSource || currentPostType !== 'wp_block' || metadataName === prevMetadataName ) { @@ -95,6 +108,7 @@ export default function useSetPatternBindings( } ); } }, [ + hasPatternOverridesSource, bindings, prevMetadataName, metadataName,