From 8f8114fb0627b3ee03eb9da01602281dee46c97b Mon Sep 17 00:00:00 2001 From: Felix Arntz Date: Tue, 23 May 2023 18:25:19 +0000 Subject: [PATCH] Media: Fix lazy-loading bug by avoiding to modify content images when creating an excerpt. The `wp_filter_content_tags()` function, which modifies image tags for example to optimize performance, is hooked into the `the_content` filter by default. When rendering an excerpt for a post that doesn't have a manually provided excerpt, the post content is used to generate the excerpt, handled by the `wp_trim_excerpt()` function. Prior to this changeset, this led to `wp_filter_content_tags()` being called on the content when generating the excerpt, which is wasteful as all tags are stripped from the excerpt, and it furthermore could result in a lazy-loading bug when the post content contained images, as those images were being counted even though they would never be rendered as part of the excerpt. This changeset fixes the bug and slightly improves performance for generating an excerpt by temporarily unhooking the `wp_filter_content_tags()` function from the `the_content` filter when using it to generate the excerpt. Props costdev, flixos90, joemcgill, mukesh27, salvoaranzulla, spacedmonkey, thekt12, westonruter. Fixes #56588. Built from https://develop.svn.wordpress.org/trunk@55850 git-svn-id: http://core.svn.wordpress.org/trunk@55362 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/formatting.php | 16 ++++++++++++++++ wp-includes/version.php | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/wp-includes/formatting.php b/wp-includes/formatting.php index 38b6bbf72b..d71ab2d6c1 100644 --- a/wp-includes/formatting.php +++ b/wp-includes/formatting.php @@ -3937,10 +3937,26 @@ function wp_trim_excerpt( $text = '', $post = null ) { $text = strip_shortcodes( $text ); $text = excerpt_remove_blocks( $text ); + /* + * Temporarily unhook wp_filter_content_tags() since any tags + * within the excerpt are stripped out. Modifying the tags here + * is wasteful and can lead to bugs in the image counting logic. + */ + $filter_removed = remove_filter( 'the_content', 'wp_filter_content_tags' ); + /** This filter is documented in wp-includes/post-template.php */ $text = apply_filters( 'the_content', $text ); $text = str_replace( ']]>', ']]>', $text ); + /** + * Only restore the filter callback if it was removed above. The logic + * to unhook and restore only applies on the default priority of 10, + * which is generally used for the filter callback in WordPress core. + */ + if ( $filter_removed ) { + add_filter( 'the_content', 'wp_filter_content_tags' ); + } + /* translators: Maximum number of words used in a post excerpt. */ $excerpt_length = (int) _x( '55', 'excerpt_length' ); diff --git a/wp-includes/version.php b/wp-includes/version.php index 5c7e5d56d8..485ddcbdba 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.3-alpha-55849'; +$wp_version = '6.3-alpha-55850'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.