diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index fd287370de9a1..347839f09a1e1 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -1009,6 +1009,27 @@ function excerpt_remove_blocks( $content ) { return $output; } +/** + * Parses footnotes markup out of a content string, + * and renders those appropriate for the excerpt. + * + * @since 6.3.0 + * + * @param string $content The content to parse. + * @return string The parsed and filtered content. + */ +function excerpt_remove_footnotes( $content ) { + if ( ! str_contains( $content, 'data-fn=' ) ) { + return $content; + } + + return preg_replace( + '_\s*\d+\s*_', + '', + $content + ); +} + /** * Renders inner blocks from the allowed wrapper blocks * for generating an excerpt. diff --git a/src/wp-includes/formatting.php b/src/wp-includes/formatting.php index a3e35599c0b1e..9ce636edd5b1d 100644 --- a/src/wp-includes/formatting.php +++ b/src/wp-includes/formatting.php @@ -3952,6 +3952,7 @@ function human_time_diff( $from, $to = 0 ) { * * @since 1.5.0 * @since 5.2.0 Added the `$post` parameter. + * @since 6.3.0 Removes footnotes markup from the excerpt content. * * @param string $text Optional. The excerpt. If set to empty, an excerpt is generated. * @param WP_Post|object|int $post Optional. WP_Post instance or Post ID/object. Default null. @@ -3966,6 +3967,7 @@ function wp_trim_excerpt( $text = '', $post = null ) { $text = strip_shortcodes( $text ); $text = excerpt_remove_blocks( $text ); + $text = excerpt_remove_footnotes( $text ); /* * Temporarily unhook wp_filter_content_tags() since any tags @@ -4008,6 +4010,7 @@ function wp_trim_excerpt( $text = '', $post = null ) { */ $excerpt_more = apply_filters( 'excerpt_more', ' ' . '[…]' ); $text = wp_trim_words( $text, $excerpt_length, $excerpt_more ); + } /** diff --git a/tests/phpunit/tests/formatting/excerptRemoveFootnotes.php b/tests/phpunit/tests/formatting/excerptRemoveFootnotes.php new file mode 100644 index 0000000000000..12ea3acb04cbe --- /dev/null +++ b/tests/phpunit/tests/formatting/excerptRemoveFootnotes.php @@ -0,0 +1,48 @@ +assertSame( $expected, excerpt_remove_footnotes( $content ) ); + } + + /** + * Data provider. + * + * @return array + */ + public function data_remove_footnotes() { + return array( + 'no footnote' => array( + 'expected' => '

This is a paragraph1.

', + 'content' => '

This is a paragraph1.

', + ), + 'one footnote' => array( + 'expected' => '

This is a paragraph.

', + 'content' => '

This is a paragraph1.

', + + ), + 'multiple footnotes in block content' => array( + 'expected' => '', + 'content' => '', + ), + 'footnotes around non-latin script' => array( + 'expected' => '

これは見出しです

', + 'content' => '

これは1見出しです2

', + ), + ); + } +}