From 541953a10ac0cc8e7a5d96aa7e414dc2b7eb196d Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Tue, 17 Oct 2023 02:18:44 +0200 Subject: [PATCH 01/20] Fix comments. --- .../block-library/src/post-excerpt/index.php | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/packages/block-library/src/post-excerpt/index.php b/packages/block-library/src/post-excerpt/index.php index 09d6b6f003d34..ab7c5de87033d 100644 --- a/packages/block-library/src/post-excerpt/index.php +++ b/packages/block-library/src/post-excerpt/index.php @@ -83,13 +83,23 @@ function register_block_core_post_excerpt() { * the excerpt length block setting has no effect. * Returns 100 because 100 is the max length in the setting. */ -if ( is_admin() || - defined( 'REST_REQUEST' ) && REST_REQUEST ) { - add_filter( - 'excerpt_length', - static function () { - return 100; - }, - PHP_INT_MAX - ); -} +add_filter( + /** + * Don't add the filter now, as at this point, REST_REQUEST is not set yet. + * Add it later when REST_REQUEST is initialized. + */ + 'rest_api_init', + static function () { + if ( ! ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ) { + return; + } + add_filter( + 'excerpt_length', + static function () { + return 100; + }, + PHP_INT_MAX + ); + }, + PHP_INT_MAX +); From e2f62e6ef78a0d170a5c30e9cac16410126e0831 Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Tue, 17 Oct 2023 02:21:16 +0200 Subject: [PATCH 02/20] Improve wording. --- packages/block-library/src/post-excerpt/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/block-library/src/post-excerpt/index.php b/packages/block-library/src/post-excerpt/index.php index ab7c5de87033d..bbd8c54a263ae 100644 --- a/packages/block-library/src/post-excerpt/index.php +++ b/packages/block-library/src/post-excerpt/index.php @@ -86,7 +86,7 @@ function register_block_core_post_excerpt() { add_filter( /** * Don't add the filter now, as at this point, REST_REQUEST is not set yet. - * Add it later when REST_REQUEST is initialized. + * Add it later when REST_REQUEST is defined. */ 'rest_api_init', static function () { From cd430a84bfb8ab5b8942fe3aa317d05c39a81f7b Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Wed, 18 Oct 2023 19:07:49 +0200 Subject: [PATCH 03/20] Optimize the filter. Don't use callback inside a callback. --- .../block-library/src/post-excerpt/index.php | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/packages/block-library/src/post-excerpt/index.php b/packages/block-library/src/post-excerpt/index.php index bbd8c54a263ae..e1eeb817d1a8a 100644 --- a/packages/block-library/src/post-excerpt/index.php +++ b/packages/block-library/src/post-excerpt/index.php @@ -84,22 +84,15 @@ function register_block_core_post_excerpt() { * Returns 100 because 100 is the max length in the setting. */ add_filter( - /** - * Don't add the filter now, as at this point, REST_REQUEST is not set yet. - * Add it later when REST_REQUEST is defined. - */ - 'rest_api_init', - static function () { + 'excerpt_length', + static function ( $value ) { + // This check needs to be inside the callback since the REST_REQUEST constant + // is not defined at the time add_filter() is called. if ( ! ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ) { - return; + return $value; } - add_filter( - 'excerpt_length', - static function () { - return 100; - }, - PHP_INT_MAX - ); + + return 100; }, PHP_INT_MAX ); From 6615aee2231f62fdfe455553f9e5e1fdb75967ae Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Tue, 14 Nov 2023 20:43:42 +0100 Subject: [PATCH 04/20] "Do not use an anonymous function for the filter to make it easier to remove the filter. --- .../block-library/src/post-excerpt/index.php | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/block-library/src/post-excerpt/index.php b/packages/block-library/src/post-excerpt/index.php index e1eeb817d1a8a..a60a7e4efe9de 100644 --- a/packages/block-library/src/post-excerpt/index.php +++ b/packages/block-library/src/post-excerpt/index.php @@ -83,16 +83,15 @@ function register_block_core_post_excerpt() { * the excerpt length block setting has no effect. * Returns 100 because 100 is the max length in the setting. */ -add_filter( - 'excerpt_length', - static function ( $value ) { - // This check needs to be inside the callback since the REST_REQUEST constant - // is not defined at the time add_filter() is called. - if ( ! ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ) { - return $value; - } +function register_block_core_post_excerpt_length_filter( $value ) { + // This check needs to be inside the callback since the REST_REQUEST constant + // is not defined at the time add_filter() is called. + if ( ! ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ) { + return $value; + } + + return 100; +} +add_filter( 'excerpt_length', 'register_block_core_post_excerpt_length_filter', PHP_INT_MAX ); + - return 100; - }, - PHP_INT_MAX -); From bbc696c37efcff2239e8a384a6127f67751c5308 Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Tue, 14 Nov 2023 20:47:04 +0100 Subject: [PATCH 05/20] Fix CS. --- packages/block-library/src/post-excerpt/index.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/block-library/src/post-excerpt/index.php b/packages/block-library/src/post-excerpt/index.php index a60a7e4efe9de..a3820a7e88315 100644 --- a/packages/block-library/src/post-excerpt/index.php +++ b/packages/block-library/src/post-excerpt/index.php @@ -82,6 +82,10 @@ function register_block_core_post_excerpt() { * override the filter in the editor, otherwise * the excerpt length block setting has no effect. * Returns 100 because 100 is the max length in the setting. + * + * @param integer $value Excerpt length. + * + * @return integer . */ function register_block_core_post_excerpt_length_filter( $value ) { // This check needs to be inside the callback since the REST_REQUEST constant @@ -93,5 +97,3 @@ function register_block_core_post_excerpt_length_filter( $value ) { return 100; } add_filter( 'excerpt_length', 'register_block_core_post_excerpt_length_filter', PHP_INT_MAX ); - - From 8b810b54bd960379dbb60f643161780cd8a5ecf9 Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Tue, 14 Nov 2023 22:56:33 +0100 Subject: [PATCH 06/20] Fix the doc block. --- packages/block-library/src/post-excerpt/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/block-library/src/post-excerpt/index.php b/packages/block-library/src/post-excerpt/index.php index a3820a7e88315..f23a0456d98eb 100644 --- a/packages/block-library/src/post-excerpt/index.php +++ b/packages/block-library/src/post-excerpt/index.php @@ -85,7 +85,7 @@ function register_block_core_post_excerpt() { * * @param integer $value Excerpt length. * - * @return integer . + * @return integer Filtered excerpt length. */ function register_block_core_post_excerpt_length_filter( $value ) { // This check needs to be inside the callback since the REST_REQUEST constant From 251aed66f7e8ff655ee8945c50477e1695b3e092 Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Wed, 15 Nov 2023 15:56:12 +0100 Subject: [PATCH 07/20] Only replace the value if the current context is "edit". --- packages/block-library/src/post-excerpt/index.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/block-library/src/post-excerpt/index.php b/packages/block-library/src/post-excerpt/index.php index f23a0456d98eb..53bd1b2158cd4 100644 --- a/packages/block-library/src/post-excerpt/index.php +++ b/packages/block-library/src/post-excerpt/index.php @@ -94,6 +94,10 @@ function register_block_core_post_excerpt_length_filter( $value ) { return $value; } + if ( empty( $_REQUEST['context'] ) || ( 'edit' !== $_REQUEST['context'] ) ) { + return $value; + } + return 100; } add_filter( 'excerpt_length', 'register_block_core_post_excerpt_length_filter', PHP_INT_MAX ); From 1764d786ad826ec8e2250c19e449f8690d4c46a6 Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Wed, 15 Nov 2023 17:44:54 +0100 Subject: [PATCH 08/20] Lower the priority as suggested by @azaozz here: https://github.com/WordPress/gutenberg/pull/55400#discussion_r1383207365 --- packages/block-library/src/post-excerpt/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/block-library/src/post-excerpt/index.php b/packages/block-library/src/post-excerpt/index.php index 53bd1b2158cd4..a723c13a4daac 100644 --- a/packages/block-library/src/post-excerpt/index.php +++ b/packages/block-library/src/post-excerpt/index.php @@ -100,4 +100,4 @@ function register_block_core_post_excerpt_length_filter( $value ) { return 100; } -add_filter( 'excerpt_length', 'register_block_core_post_excerpt_length_filter', PHP_INT_MAX ); +add_filter( 'excerpt_length', 'register_block_core_post_excerpt_length_filter', 20 ); From 8e0123779b34d88b6489b0e382c02c93fd751758 Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Thu, 16 Nov 2023 11:45:26 +0100 Subject: [PATCH 09/20] Commit progress. --- ...gisterBlockCorePostExcerptLengthFilter.php | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php diff --git a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php new file mode 100644 index 0000000000000..4c0182eb98a41 --- /dev/null +++ b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php @@ -0,0 +1,51 @@ +assertSame( $expected_excerpt_length, $result ); + } + + public function data_register_block_core_post_excerpt_length_filter() { + return array( + 'rest_api_disabled_non_edit_context' => array( + 10, + 10, + false, + '', + ), + 'rest_api_enabled_non_edit_context' => array( + 10, + 10, + true, + '', + ), + 'rest_api_enabled_edit_context' => array( + 10, + 10, + true, + 'edit' + ), + ); + } +} From 9eb106d8a51334aafcc0baa0c4c9bcbd8078314f Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Thu, 16 Nov 2023 14:25:44 +0100 Subject: [PATCH 10/20] Add the unit test. --- ...gisterBlockCorePostExcerptLengthFilter.php | 72 ++++++++++++------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php index 4c0182eb98a41..d2629f7769728 100644 --- a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php +++ b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php @@ -1,4 +1,5 @@ post->create( array( + 'post_excerpt' => '', + ) + ); + + self::$admin_id = $factory->user->create( + array( + 'role' => 'administrator', + 'user_login' => 'superadmin', + ) + ); + } + /** - * * @dataProvider data_register_block_core_post_excerpt_length_filter - * @param $excerpt_length - * - * @return void */ - public function test_register_block_core_post_excerpt_length_filter( $excerpt_length, $expected_excerpt_length, $rest_api_enabled, $context ) { - $_REQUEST['context'] = $context; - if ( $rest_api_enabled && ! defined( 'REST_REQUEST' ) ) { - define( REST_REQUEST, true ); + public function test_register_block_core_post_excerpt_length_filter( $expected_word_length, $context ) { + wp_set_current_user( self::$admin_id ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/posts/' . self::$post_id ); + if ( '' !== $context ) { + $request->set_param( 'context', $context ); + $_REQUEST['context'] = $context; } - $result = register_block_core_post_excerpt_length_filter( $excerpt_length ); - $this->assertSame( $expected_excerpt_length, $result ); + $request->set_param( '_locale', 'user' ); + $mock = $this->getMockBuilder( stdClass::class ) + ->addMethods( [ 'excerpt_length_callback' ] ) + ->getMock(); + + $mock->expects( $this->atLeast( 1 ) ) + ->method( 'excerpt_length_callback' ) + ->with( $this->equalTo( $expected_word_length ) ) + ->willReturn( $expected_word_length ); + + add_filter('excerpt_length', [$mock, 'excerpt_length_callback'], PHP_INT_MAX ); + rest_get_server()->dispatch( $request ); + remove_filter('excerpt_length', [$mock, 'excerpt_length_callback'], PHP_INT_MAX ); + unset ($_REQUEST['context']); } public function data_register_block_core_post_excerpt_length_filter() { return array( - 'rest_api_disabled_non_edit_context' => array( - 10, - 10, - false, - '', - ), - 'rest_api_enabled_non_edit_context' => array( - 10, - 10, - true, - '', + 'no_edit_context' => array( + 55, + '' ), - 'rest_api_enabled_edit_context' => array( - 10, - 10, - true, + 'edit_context' => array( + 100, 'edit' ), ); From 4ec437f1cb342585cf2303dda00ba634638e8908 Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Thu, 16 Nov 2023 14:28:25 +0100 Subject: [PATCH 11/20] Fix CS. --- .../blocks/registerBlockCorePostExcerptLengthFilter.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php index d2629f7769728..e574b749a5435 100644 --- a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php +++ b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php @@ -45,15 +45,15 @@ public function test_register_block_core_post_excerpt_length_filter( $expected_w ->addMethods( [ 'excerpt_length_callback' ] ) ->getMock(); - $mock->expects( $this->atLeast( 1 ) ) + $mock->expects( $this->atLeastOnce() ) ->method( 'excerpt_length_callback' ) ->with( $this->equalTo( $expected_word_length ) ) ->willReturn( $expected_word_length ); - add_filter('excerpt_length', [$mock, 'excerpt_length_callback'], PHP_INT_MAX ); + add_filter( 'excerpt_length', [ $mock, 'excerpt_length_callback' ], PHP_INT_MAX ); rest_get_server()->dispatch( $request ); - remove_filter('excerpt_length', [$mock, 'excerpt_length_callback'], PHP_INT_MAX ); - unset ($_REQUEST['context']); + remove_filter( 'excerpt_length', [ $mock, 'excerpt_length_callback' ], PHP_INT_MAX ); + unset ( $_REQUEST['context'] ); } public function data_register_block_core_post_excerpt_length_filter() { From bba7f41d749817bc7fb44da8aab5b533851211b4 Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Thu, 16 Nov 2023 15:17:59 +0100 Subject: [PATCH 12/20] Lower the priority as suggested by @azaozz here: https://github.com/WordPress/gutenberg/pull/55400#discussion_r1383207365 --- ...gisterBlockCorePostExcerptLengthFilter.php | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php index e574b749a5435..ffc04f14a1176 100644 --- a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php +++ b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php @@ -1,13 +1,15 @@ expects( $this->atLeastOnce() ) ->method( 'excerpt_length_callback' ) - ->with( $this->equalTo( $expected_word_length ) ) - ->willReturn( $expected_word_length ); + ->with( $this->equalTo( $expeceted_excerpt_length ) ) + ->willReturn( $expeceted_excerpt_length ); add_filter( 'excerpt_length', [ $mock, 'excerpt_length_callback' ], PHP_INT_MAX ); rest_get_server()->dispatch( $request ); @@ -56,6 +63,11 @@ public function test_register_block_core_post_excerpt_length_filter( $expected_w unset ( $_REQUEST['context'] ); } + /** + * Data provider. + * + * @return array + */ public function data_register_block_core_post_excerpt_length_filter() { return array( 'no_edit_context' => array( From 9a437913ca1d3d0bcaf4bb7f8beab63ce253de81 Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Thu, 16 Nov 2023 15:20:42 +0100 Subject: [PATCH 13/20] Fix grammar. --- .../tests/blocks/registerBlockCorePostExcerptLengthFilter.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php index ffc04f14a1176..72c11425fdc53 100644 --- a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php +++ b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php @@ -31,7 +31,7 @@ public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) { } /** - * Unit test for ensuring correct length of the post excerpt in the REST API context. + * Unit test to ensure the correct length of the post excerpt in the REST API context. * * @dataProvider data_register_block_core_post_excerpt_length_filter * @@ -57,6 +57,7 @@ public function test_register_block_core_post_excerpt_length_filter( $expeceted_ ->with( $this->equalTo( $expeceted_excerpt_length ) ) ->willReturn( $expeceted_excerpt_length ); + // Using PHP_INT_MAX for testing purposes only; this should be avoided in production code. add_filter( 'excerpt_length', [ $mock, 'excerpt_length_callback' ], PHP_INT_MAX ); rest_get_server()->dispatch( $request ); remove_filter( 'excerpt_length', [ $mock, 'excerpt_length_callback' ], PHP_INT_MAX ); From 1d347f7ae62e984534d9d02308b78aa56cdb9459 Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Thu, 16 Nov 2023 15:24:05 +0100 Subject: [PATCH 14/20] Add a comment. --- .../tests/blocks/registerBlockCorePostExcerptLengthFilter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php index 72c11425fdc53..726158ae55ae8 100644 --- a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php +++ b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php @@ -72,7 +72,7 @@ public function test_register_block_core_post_excerpt_length_filter( $expeceted_ public function data_register_block_core_post_excerpt_length_filter() { return array( 'no_edit_context' => array( - 55, + 55, // Default filter value. '' ), 'edit_context' => array( From 961dac22b52f584db8502e262b0ea6d7dec9125d Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Thu, 16 Nov 2023 15:28:24 +0100 Subject: [PATCH 15/20] Add response status assertion. --- .../tests/blocks/registerBlockCorePostExcerptLengthFilter.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php index 726158ae55ae8..715b79efdc0ba 100644 --- a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php +++ b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php @@ -59,7 +59,8 @@ public function test_register_block_core_post_excerpt_length_filter( $expeceted_ // Using PHP_INT_MAX for testing purposes only; this should be avoided in production code. add_filter( 'excerpt_length', [ $mock, 'excerpt_length_callback' ], PHP_INT_MAX ); - rest_get_server()->dispatch( $request ); + $response = rest_get_server()->dispatch( $request ); + $this->assertSame( WP_Http::OK, $response->get_status(), 'Expected response status to be ' . WP_Http::OK ); remove_filter( 'excerpt_length', [ $mock, 'excerpt_length_callback' ], PHP_INT_MAX ); unset ( $_REQUEST['context'] ); } From aa5b538bd6e206fcb13d087efcb60f5cbca2de22 Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Thu, 16 Nov 2023 15:35:04 +0100 Subject: [PATCH 16/20] Fix CS. --- ...gisterBlockCorePostExcerptLengthFilter.php | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php index 715b79efdc0ba..01ae8eb343e19 100644 --- a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php +++ b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php @@ -1,5 +1,4 @@ post->create( array( + self::$post_id = $factory->post->create( + array( 'post_excerpt' => '', ) ); @@ -49,20 +49,20 @@ public function test_register_block_core_post_excerpt_length_filter( $expeceted_ $request->set_param( '_locale', 'user' ); $mock = $this->getMockBuilder( stdClass::class ) - ->addMethods( [ 'excerpt_length_callback' ] ) - ->getMock(); + ->addMethods( array( 'excerpt_length_callback' ) ) + ->getMock(); $mock->expects( $this->atLeastOnce() ) - ->method( 'excerpt_length_callback' ) - ->with( $this->equalTo( $expeceted_excerpt_length ) ) - ->willReturn( $expeceted_excerpt_length ); + ->method( 'excerpt_length_callback' ) + ->with( $this->equalTo( $expeceted_excerpt_length ) ) + ->willReturn( $expeceted_excerpt_length ); // Using PHP_INT_MAX for testing purposes only; this should be avoided in production code. - add_filter( 'excerpt_length', [ $mock, 'excerpt_length_callback' ], PHP_INT_MAX ); + add_filter( 'excerpt_length', array( $mock, 'excerpt_length_callback' ), PHP_INT_MAX ); $response = rest_get_server()->dispatch( $request ); $this->assertSame( WP_Http::OK, $response->get_status(), 'Expected response status to be ' . WP_Http::OK ); - remove_filter( 'excerpt_length', [ $mock, 'excerpt_length_callback' ], PHP_INT_MAX ); - unset ( $_REQUEST['context'] ); + remove_filter( 'excerpt_length', array( $mock, 'excerpt_length_callback' ), PHP_INT_MAX ); + unset( $_REQUEST['context'] ); } /** @@ -74,11 +74,11 @@ public function data_register_block_core_post_excerpt_length_filter() { return array( 'no_edit_context' => array( 55, // Default filter value. - '' + '', ), 'edit_context' => array( 100, - 'edit' + 'edit', ), ); } From 1b9efbcaaf0c7982e26831180ed2757d4c2fa223 Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Thu, 16 Nov 2023 15:48:08 +0100 Subject: [PATCH 17/20] Fix PHPDOC block. --- packages/block-library/src/post-excerpt/index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/block-library/src/post-excerpt/index.php b/packages/block-library/src/post-excerpt/index.php index a723c13a4daac..55fe14779997b 100644 --- a/packages/block-library/src/post-excerpt/index.php +++ b/packages/block-library/src/post-excerpt/index.php @@ -83,9 +83,9 @@ function register_block_core_post_excerpt() { * the excerpt length block setting has no effect. * Returns 100 because 100 is the max length in the setting. * - * @param integer $value Excerpt length. + * @param int $value Excerpt length. * - * @return integer Filtered excerpt length. + * @return int Filtered excerpt length. */ function register_block_core_post_excerpt_length_filter( $value ) { // This check needs to be inside the callback since the REST_REQUEST constant From 24cc4f45bafc740d5c7deb34d232b278b8074e47 Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Thu, 16 Nov 2023 19:02:47 +0100 Subject: [PATCH 18/20] Ensure compatibility with the older PHPUnit versions. --- .../registerBlockCorePostExcerptLengthFilter.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php index 01ae8eb343e19..0d7d063f521d8 100644 --- a/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php +++ b/phpunit/tests/blocks/registerBlockCorePostExcerptLengthFilter.php @@ -48,9 +48,14 @@ public function test_register_block_core_post_excerpt_length_filter( $expeceted_ } $request->set_param( '_locale', 'user' ); - $mock = $this->getMockBuilder( stdClass::class ) - ->addMethods( array( 'excerpt_length_callback' ) ) - ->getMock(); + $mock = $this->getMockBuilder( stdClass::class ); + if ( method_exists( $mock, 'addMethods' ) ) { + $mock->addMethods( array( 'excerpt_length_callback' ) ); + } else { + // Ensure compatibility with older PHPUnit versions. + $mock->setMethods( array( 'excerpt_length_callback' ) ); + } + $mock = $mock->getMock(); $mock->expects( $this->atLeastOnce() ) ->method( 'excerpt_length_callback' ) From c5fb5b075d3af8188032d247cc451dd2dd38a564 Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Thu, 16 Nov 2023 21:24:51 +0100 Subject: [PATCH 19/20] Make sure that the code works when using preloading or batch requests. --- .../block-library/src/post-excerpt/index.php | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/packages/block-library/src/post-excerpt/index.php b/packages/block-library/src/post-excerpt/index.php index 55fe14779997b..c3d4c448ff8a0 100644 --- a/packages/block-library/src/post-excerpt/index.php +++ b/packages/block-library/src/post-excerpt/index.php @@ -83,21 +83,22 @@ function register_block_core_post_excerpt() { * the excerpt length block setting has no effect. * Returns 100 because 100 is the max length in the setting. * - * @param int $value Excerpt length. - * * @return int Filtered excerpt length. */ -function register_block_core_post_excerpt_length_filter( $value ) { - // This check needs to be inside the callback since the REST_REQUEST constant - // is not defined at the time add_filter() is called. - if ( ! ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ) { - return $value; - } - - if ( empty( $_REQUEST['context'] ) || ( 'edit' !== $_REQUEST['context'] ) ) { - return $value; - } - +function register_block_core_post_excerpt_length_filter() { return 100; } -add_filter( 'excerpt_length', 'register_block_core_post_excerpt_length_filter', 20 ); + +// This needs to be wrapped in the rest_pre_dispatch hook to ensure +// that the code works when using REST API preloading or batch requests. +add_filter( + 'rest_pre_dispatch', + static function ( $result, $server, $request ) { + if ( 'edit' !== $request['context'] ) { + return; + } + add_filter( 'excerpt_length', 'register_block_core_post_excerpt_length_filter', 20 ); + }, + 10, + 3 +); From f8a88391b0e5f59f6d26bc6fcb730f41b4b2abe8 Mon Sep 17 00:00:00 2001 From: Anton Vlasenko Date: Fri, 17 Nov 2023 23:33:16 +0100 Subject: [PATCH 20/20] Try more restrictive approach and only add callback when the excerpt field is present in the response. --- .../block-library/src/post-excerpt/index.php | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/packages/block-library/src/post-excerpt/index.php b/packages/block-library/src/post-excerpt/index.php index c3d4c448ff8a0..51e92698c9900 100644 --- a/packages/block-library/src/post-excerpt/index.php +++ b/packages/block-library/src/post-excerpt/index.php @@ -89,16 +89,32 @@ function register_block_core_post_excerpt_length_filter() { return 100; } -// This needs to be wrapped in the rest_pre_dispatch hook to ensure +// This needs to be wrapped in the rest_dispatch_request hook to ensure // that the code works when using REST API preloading or batch requests. add_filter( - 'rest_pre_dispatch', - static function ( $result, $server, $request ) { + 'rest_dispatch_request', + static function ( $dispatch_result, $request, $route, $handler ) { if ( 'edit' !== $request['context'] ) { return; } + + if ( empty( $handler['callback'][0] ) || ! is_object( $handler['callback'][0] ) ) { + return; + } + + $controller = $handler['callback'][0]; + + if ( ! is_callable( array( $controller, 'get_fields_for_response' ) ) ) { + return; + } + + $fields = $controller->get_fields_for_response( $request ); + if ( ! rest_is_field_included( 'excerpt', $fields ) ) { + return; + } + add_filter( 'excerpt_length', 'register_block_core_post_excerpt_length_filter', 20 ); }, 10, - 3 + 4 );