From 5938fa1581a7a9fdeef0fbc5ac90dd554bc9f76f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Grzegorz=20Zi=C3=B3=C5=82kowski?= Date: Wed, 30 Jul 2025 12:06:15 +0200 Subject: [PATCH 1/6] Pullquote: Try adding Block Bindings support --- lib/compat/wordpress-6.9/blocks.php | 51 +++++++++++++++++++ lib/load.php | 1 + .../block-editor/src/utils/block-bindings.js | 1 + packages/block-library/src/pullquote/save.js | 12 +++-- .../src/utils/get-transformed-metadata.js | 1 + packages/patterns/src/constants.js | 1 + 6 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 lib/compat/wordpress-6.9/blocks.php diff --git a/lib/compat/wordpress-6.9/blocks.php b/lib/compat/wordpress-6.9/blocks.php new file mode 100644 index 00000000000000..5f0d50cafe6674 --- /dev/null +++ b/lib/compat/wordpress-6.9/blocks.php @@ -0,0 +1,51 @@ +get_registered( $block_instance->name ); + + while ( $block_reader->next_tag() ) { + $current_tag = $block_reader->get_tag(); + if ( 'P' === $current_tag && ! empty( $bindings['value'] ) ) { + $value_binding_source = get_block_bindings_source( $bindings['value']['source'] ); + $value_args = ! empty( $bindings['value']['args'] ) && is_array( $bindings['value']['args'] ) ? $bindings['value']['args'] : array(); + $block_type->uses_context = array_merge( $block_type->uses_context, $value_binding_source->uses_context ); + $block_instance->refresh_context_dependents(); + $value = $value_binding_source->get_value( $value_args, $block_instance, 'value' ); + $block_reader->set_attribute( 'data-value', $value ); + } else if ( 'CITE' === $current_tag && ! empty( $bindings['citation'] ) ) { + $citation_binding_source = get_block_bindings_source( $bindings['citation']['source'] ); + $citation_args = ! empty( $bindings['citation']['args'] ) && is_array( $bindings['citation']['args'] ) ? $bindings['citation']['args'] : array(); + $citation = $citation_binding_source->get_value( $citation_args, $block_instance, 'citation' ); + $block_type->uses_context = array_merge( $block_type->uses_context, $value_binding_source->uses_context ); + $block_instance->refresh_context_dependents(); + $block_reader->set_attribute( 'data-citation', $citation ); + } + } + + return $block_reader->get_updated_html(); +} + + +add_filter( 'render_block_core/pullquote', 'gutenberg_process_pullquote_bindings', 20, 3 ); diff --git a/lib/load.php b/lib/load.php index 193259a9acbc80..9cdd56ce8d5e73 100644 --- a/lib/load.php +++ b/lib/load.php @@ -85,6 +85,7 @@ function gutenberg_is_experiment_enabled( $name ) { require __DIR__ . '/compat/wordpress-6.8/site-preview.php'; // WordPress 6.9 compat. +require __DIR__ . '/compat/wordpress-6.9/blocks.php'; require __DIR__ . '/compat/wordpress-6.9/customizer-preview-custom-css.php'; require __DIR__ . '/compat/wordpress-6.9/command-palette.php'; require __DIR__ . '/compat/wordpress-6.9/preload.php'; diff --git a/packages/block-editor/src/utils/block-bindings.js b/packages/block-editor/src/utils/block-bindings.js index f7f44e2f599430..41d7f5d4ba5c5c 100644 --- a/packages/block-editor/src/utils/block-bindings.js +++ b/packages/block-editor/src/utils/block-bindings.js @@ -17,6 +17,7 @@ const BLOCK_BINDINGS_ALLOWED_BLOCKS = { 'core/image': [ 'id', 'url', 'title', 'alt', 'caption' ], 'core/button': [ 'url', 'text', 'linkTarget', 'rel' ], 'core/post-date': [ 'datetime' ], + 'core/pullquote': [ 'citation', 'value' ], }; /** diff --git a/packages/block-library/src/pullquote/save.js b/packages/block-library/src/pullquote/save.js index 19fa49a3fa8345..1d1136c00b49e2 100644 --- a/packages/block-library/src/pullquote/save.js +++ b/packages/block-library/src/pullquote/save.js @@ -9,8 +9,10 @@ import clsx from 'clsx'; import { RichText, useBlockProps } from '@wordpress/block-editor'; export default function save( { attributes } ) { - const { textAlign, citation, value } = attributes; - const shouldShowCitation = ! RichText.isEmpty( citation ); + const { textAlign, citation, value, metadata } = attributes; + const hasBoundCitation = !! metadata?.bindings?.citation; + const shouldShowCitation = + hasBoundCitation || ! RichText.isEmpty( citation ); return (
{ shouldShowCitation && ( - + ) }
diff --git a/packages/block-library/src/utils/get-transformed-metadata.js b/packages/block-library/src/utils/get-transformed-metadata.js index 53d79d3c1e42ac..8554866fce5505 100644 --- a/packages/block-library/src/utils/get-transformed-metadata.js +++ b/packages/block-library/src/utils/get-transformed-metadata.js @@ -27,6 +27,7 @@ export function getTransformedMetadata( 'core/heading', 'core/image', 'core/button', + 'core/pullquote', ]; // The metadata properties that should be preserved after the transform. const transformSupportedProps = []; diff --git a/packages/patterns/src/constants.js b/packages/patterns/src/constants.js index 99563a1a16787f..aaeac297126c8a 100644 --- a/packages/patterns/src/constants.js +++ b/packages/patterns/src/constants.js @@ -21,6 +21,7 @@ export const PARTIAL_SYNCING_SUPPORTED_BLOCKS = { 'core/heading': [ 'content' ], 'core/button': [ 'text', 'url', 'linkTarget', 'rel' ], 'core/image': [ 'id', 'url', 'title', 'alt' ], + 'core/pullquote': [ 'citation', 'value' ], }; export const PATTERN_OVERRIDES_BINDING_SOURCE = 'core/pattern-overrides'; From 570f5a8ea918e6c94493d6b69bd05ea54ec6576e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Grzegorz=20Zi=C3=B3=C5=82kowski?= Date: Wed, 17 Sep 2025 07:01:20 +0200 Subject: [PATCH 2/6] Use the Block Bindings polyfill --- lib/compat/wordpress-6.9/block-bindings.php | 17 ++++++- lib/compat/wordpress-6.9/blocks.php | 51 --------------------- lib/load.php | 1 - 3 files changed, 15 insertions(+), 54 deletions(-) delete mode 100644 lib/compat/wordpress-6.9/blocks.php diff --git a/lib/compat/wordpress-6.9/block-bindings.php b/lib/compat/wordpress-6.9/block-bindings.php index f46a2dce398ce6..5cf7bb0d338580 100644 --- a/lib/compat/wordpress-6.9/block-bindings.php +++ b/lib/compat/wordpress-6.9/block-bindings.php @@ -7,8 +7,7 @@ * @subpackage Block Bindings */ - -// The following filter can be removed once the minimum required WordPress version is 6.9 or newer. +// The following filters can be removed once the minimum required WordPress version is 6.9 or newer. add_filter( 'block_bindings_supported_attributes', function ( $attributes, $block_type ) { @@ -23,6 +22,20 @@ function ( $attributes, $block_type ) { 10, 2 ); +add_filter( + 'block_bindings_supported_attributes_core/pullquote', + function ( $attributes ) { + if ( ! in_array( 'value', $attributes, true ) ) { + $attributes[] = 'value'; + } + if ( ! in_array( 'citation', $attributes, true ) ) { + $attributes[] = 'citation'; + } + return $attributes; + }, + 10, + 3 +); /** * Callback function for the render_block filter. diff --git a/lib/compat/wordpress-6.9/blocks.php b/lib/compat/wordpress-6.9/blocks.php deleted file mode 100644 index 5f0d50cafe6674..00000000000000 --- a/lib/compat/wordpress-6.9/blocks.php +++ /dev/null @@ -1,51 +0,0 @@ -get_registered( $block_instance->name ); - - while ( $block_reader->next_tag() ) { - $current_tag = $block_reader->get_tag(); - if ( 'P' === $current_tag && ! empty( $bindings['value'] ) ) { - $value_binding_source = get_block_bindings_source( $bindings['value']['source'] ); - $value_args = ! empty( $bindings['value']['args'] ) && is_array( $bindings['value']['args'] ) ? $bindings['value']['args'] : array(); - $block_type->uses_context = array_merge( $block_type->uses_context, $value_binding_source->uses_context ); - $block_instance->refresh_context_dependents(); - $value = $value_binding_source->get_value( $value_args, $block_instance, 'value' ); - $block_reader->set_attribute( 'data-value', $value ); - } else if ( 'CITE' === $current_tag && ! empty( $bindings['citation'] ) ) { - $citation_binding_source = get_block_bindings_source( $bindings['citation']['source'] ); - $citation_args = ! empty( $bindings['citation']['args'] ) && is_array( $bindings['citation']['args'] ) ? $bindings['citation']['args'] : array(); - $citation = $citation_binding_source->get_value( $citation_args, $block_instance, 'citation' ); - $block_type->uses_context = array_merge( $block_type->uses_context, $value_binding_source->uses_context ); - $block_instance->refresh_context_dependents(); - $block_reader->set_attribute( 'data-citation', $citation ); - } - } - - return $block_reader->get_updated_html(); -} - - -add_filter( 'render_block_core/pullquote', 'gutenberg_process_pullquote_bindings', 20, 3 ); diff --git a/lib/load.php b/lib/load.php index 9cdd56ce8d5e73..193259a9acbc80 100644 --- a/lib/load.php +++ b/lib/load.php @@ -85,7 +85,6 @@ function gutenberg_is_experiment_enabled( $name ) { require __DIR__ . '/compat/wordpress-6.8/site-preview.php'; // WordPress 6.9 compat. -require __DIR__ . '/compat/wordpress-6.9/blocks.php'; require __DIR__ . '/compat/wordpress-6.9/customizer-preview-custom-css.php'; require __DIR__ . '/compat/wordpress-6.9/command-palette.php'; require __DIR__ . '/compat/wordpress-6.9/preload.php'; From 8f1d461a3b5cada1dd768cca4c1dcbd40847119c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Grzegorz=20Zi=C3=B3=C5=82kowski?= Date: Wed, 17 Sep 2025 07:02:49 +0200 Subject: [PATCH 3/6] Clean up the save method --- packages/block-library/src/pullquote/save.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/block-library/src/pullquote/save.js b/packages/block-library/src/pullquote/save.js index 1d1136c00b49e2..9514d6ba98b6f4 100644 --- a/packages/block-library/src/pullquote/save.js +++ b/packages/block-library/src/pullquote/save.js @@ -10,9 +10,8 @@ import { RichText, useBlockProps } from '@wordpress/block-editor'; export default function save( { attributes } ) { const { textAlign, citation, value, metadata } = attributes; - const hasBoundCitation = !! metadata?.bindings?.citation; const shouldShowCitation = - hasBoundCitation || ! RichText.isEmpty( citation ); + !! metadata?.bindings?.citation || ! RichText.isEmpty( citation ); return (
{ shouldShowCitation && ( - + ) }
From ed7805f20ee90278dfa675bd9e4380a6be7d7f4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Grzegorz=20Zi=C3=B3=C5=82kowski?= Date: Fri, 19 Sep 2025 15:23:34 +0200 Subject: [PATCH 4/6] Refactor integration logic --- backport-changelog/6.9/9702.md | 3 ++- lib/compat/wordpress-6.9/block-bindings.php | 22 +++++++------------ packages/block-library/src/pullquote/save.js | 15 +++++++++---- ...e__pullquote__citation-block-bindings.html | 7 ++++++ ...e__pullquote__citation-block-bindings.json | 21 ++++++++++++++++++ ...quote__citation-block-bindings.parsed.json | 22 +++++++++++++++++++ ...e__citation-block-bindings.serialized.html | 3 +++ 7 files changed, 74 insertions(+), 19 deletions(-) create mode 100644 test/integration/fixtures/blocks/core__pullquote__citation-block-bindings.html create mode 100644 test/integration/fixtures/blocks/core__pullquote__citation-block-bindings.json create mode 100644 test/integration/fixtures/blocks/core__pullquote__citation-block-bindings.parsed.json create mode 100644 test/integration/fixtures/blocks/core__pullquote__citation-block-bindings.serialized.html diff --git a/backport-changelog/6.9/9702.md b/backport-changelog/6.9/9702.md index 310cbe927f68a1..2e242836968642 100644 --- a/backport-changelog/6.9/9702.md +++ b/backport-changelog/6.9/9702.md @@ -1,3 +1,4 @@ https://github.com/WordPress/wordpress-develop/pull/9702 -* https://github.com/WordPress/gutenberg/pull/71483 \ No newline at end of file +- https://github.com/WordPress/gutenberg/pull/70975 +- https://github.com/WordPress/gutenberg/pull/71483 diff --git a/lib/compat/wordpress-6.9/block-bindings.php b/lib/compat/wordpress-6.9/block-bindings.php index 5cf7bb0d338580..f8f7cc54aedbc6 100644 --- a/lib/compat/wordpress-6.9/block-bindings.php +++ b/lib/compat/wordpress-6.9/block-bindings.php @@ -17,24 +17,18 @@ function ( $attributes, $block_type ) { if ( 'core/post-date' === $block_type && ! in_array( 'datetime', $attributes, true ) ) { $attributes[] = 'datetime'; } - return $attributes; - }, - 10, - 2 -); -add_filter( - 'block_bindings_supported_attributes_core/pullquote', - function ( $attributes ) { - if ( ! in_array( 'value', $attributes, true ) ) { - $attributes[] = 'value'; - } - if ( ! in_array( 'citation', $attributes, true ) ) { - $attributes[] = 'citation'; + if ( 'core/pullquote' === $block_type ) { + if ( ! in_array( 'value', $attributes, true ) ) { + $attributes[] = 'value'; + } + if ( ! in_array( 'citation', $attributes, true ) ) { + $attributes[] = 'citation'; + } } return $attributes; }, 10, - 3 + 2 ); /** diff --git a/packages/block-library/src/pullquote/save.js b/packages/block-library/src/pullquote/save.js index 9514d6ba98b6f4..843e0be23b8714 100644 --- a/packages/block-library/src/pullquote/save.js +++ b/packages/block-library/src/pullquote/save.js @@ -9,9 +9,16 @@ import clsx from 'clsx'; import { RichText, useBlockProps } from '@wordpress/block-editor'; export default function save( { attributes } ) { - const { textAlign, citation, value, metadata } = attributes; - const shouldShowCitation = - !! metadata?.bindings?.citation || ! RichText.isEmpty( citation ); + const { + textAlign, + citation, + value, + metadata: { bindings = {} } = {}, + } = attributes; + const displayCitation = + ! RichText.isEmpty( citation ) || + !! bindings.citation || + bindings.__default?.source === 'core/pattern-overrides'; return (
- { shouldShowCitation && ( + { displayCitation && ( ) }
diff --git a/test/integration/fixtures/blocks/core__pullquote__citation-block-bindings.html b/test/integration/fixtures/blocks/core__pullquote__citation-block-bindings.html new file mode 100644 index 00000000000000..f7efe093ad12bc --- /dev/null +++ b/test/integration/fixtures/blocks/core__pullquote__citation-block-bindings.html @@ -0,0 +1,7 @@ + +
+
+

Testing pullquote block...

+
+
+ diff --git a/test/integration/fixtures/blocks/core__pullquote__citation-block-bindings.json b/test/integration/fixtures/blocks/core__pullquote__citation-block-bindings.json new file mode 100644 index 00000000000000..860e15758dbc48 --- /dev/null +++ b/test/integration/fixtures/blocks/core__pullquote__citation-block-bindings.json @@ -0,0 +1,21 @@ +[ + { + "name": "core/pullquote", + "isValid": true, + "attributes": { + "value": "Testing pullquote block...", + "citation": "", + "metadata": { + "bindings": { + "citation": { + "source": "core/post-data", + "args": { + "key": "date" + } + } + } + } + }, + "innerBlocks": [] + } +] diff --git a/test/integration/fixtures/blocks/core__pullquote__citation-block-bindings.parsed.json b/test/integration/fixtures/blocks/core__pullquote__citation-block-bindings.parsed.json new file mode 100644 index 00000000000000..e3ddefa17143f1 --- /dev/null +++ b/test/integration/fixtures/blocks/core__pullquote__citation-block-bindings.parsed.json @@ -0,0 +1,22 @@ +[ + { + "blockName": "core/pullquote", + "attrs": { + "metadata": { + "bindings": { + "citation": { + "source": "core/post-data", + "args": { + "key": "date" + } + } + } + } + }, + "innerBlocks": [], + "innerHTML": "\n
\n
\n

Testing pullquote block...

\n
\n
\n", + "innerContent": [ + "\n
\n
\n

Testing pullquote block...

\n
\n
\n" + ] + } +] diff --git a/test/integration/fixtures/blocks/core__pullquote__citation-block-bindings.serialized.html b/test/integration/fixtures/blocks/core__pullquote__citation-block-bindings.serialized.html new file mode 100644 index 00000000000000..33e6d1ee29f9d2 --- /dev/null +++ b/test/integration/fixtures/blocks/core__pullquote__citation-block-bindings.serialized.html @@ -0,0 +1,3 @@ + +

Testing pullquote block...

+ From b27d92f2ed5f41d1f749e27dd2aedff7cc8be118 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Grzegorz=20Zi=C3=B3=C5=82kowski?= Date: Mon, 22 Sep 2025 10:17:30 +0200 Subject: [PATCH 5/6] Update backport information --- backport-changelog/6.9/9702.md | 3 +-- backport-changelog/6.9/9990.md | 3 +++ lib/compat/wordpress-6.9/block-bindings.php | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 backport-changelog/6.9/9990.md diff --git a/backport-changelog/6.9/9702.md b/backport-changelog/6.9/9702.md index 2e242836968642..ef70aadbc09def 100644 --- a/backport-changelog/6.9/9702.md +++ b/backport-changelog/6.9/9702.md @@ -1,4 +1,3 @@ https://github.com/WordPress/wordpress-develop/pull/9702 -- https://github.com/WordPress/gutenberg/pull/70975 -- https://github.com/WordPress/gutenberg/pull/71483 +* https://github.com/WordPress/gutenberg/pull/71483 diff --git a/backport-changelog/6.9/9990.md b/backport-changelog/6.9/9990.md new file mode 100644 index 00000000000000..1c376034c372f4 --- /dev/null +++ b/backport-changelog/6.9/9990.md @@ -0,0 +1,3 @@ +https://github.com/WordPress/wordpress-develop/pull/9990 + +* https://github.com/WordPress/gutenberg/pull/70975 diff --git a/lib/compat/wordpress-6.9/block-bindings.php b/lib/compat/wordpress-6.9/block-bindings.php index f8f7cc54aedbc6..f65a8937ad6158 100644 --- a/lib/compat/wordpress-6.9/block-bindings.php +++ b/lib/compat/wordpress-6.9/block-bindings.php @@ -7,7 +7,7 @@ * @subpackage Block Bindings */ -// The following filters can be removed once the minimum required WordPress version is 6.9 or newer. +// The following filter can be removed once the minimum required WordPress version is 6.9 or newer. add_filter( 'block_bindings_supported_attributes', function ( $attributes, $block_type ) { From 76105c84fc85b61335dbefc38d340267366ba165 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Grzegorz=20Zi=C3=B3=C5=82kowski?= Date: Mon, 22 Sep 2025 10:25:26 +0200 Subject: [PATCH 6/6] Sync the list of partially synced blocks with block bindings --- packages/patterns/src/constants.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/patterns/src/constants.js b/packages/patterns/src/constants.js index aaeac297126c8a..ac3f5ad9a8f72c 100644 --- a/packages/patterns/src/constants.js +++ b/packages/patterns/src/constants.js @@ -19,8 +19,9 @@ export const PATTERN_SYNC_TYPES = { export const PARTIAL_SYNCING_SUPPORTED_BLOCKS = { 'core/paragraph': [ 'content' ], 'core/heading': [ 'content' ], - 'core/button': [ 'text', 'url', 'linkTarget', 'rel' ], - 'core/image': [ 'id', 'url', 'title', 'alt' ], + 'core/image': [ 'id', 'url', 'title', 'alt', 'caption' ], + 'core/button': [ 'url', 'text', 'linkTarget', 'rel' ], + 'core/post-date': [ 'datetime' ], 'core/pullquote': [ 'citation', 'value' ], };