From 05141500261c845fb4dca2da28c967dc94c5e551 Mon Sep 17 00:00:00 2001 From: Felix Arntz Date: Tue, 29 Mar 2022 23:56:18 +0000 Subject: [PATCH] Media: Introduce `wp_content_img_tag` filter. This filter allows modifying individual `img` tags within a blob of content that are by default processed by the `wp_filter_content_tags()` function. The addition of this filter facilitates plugins that tweak images to accomplish this goal without re-implementing duplicate content image parser logic, which furthermore can have a negative performance impact due to additional regular expressions. In addition to the filterable `img` tag, the filter receives the context (typically the function or filter in which the content is parsed) and the attachment ID. The latter may be 0, in case the image is not an attachment (for example when it is an external image URL). Props adamsilverstein, flixos90, pbearne, peterwilsoncc. Fixes #55347. git-svn-id: https://develop.svn.wordpress.org/trunk@53028 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/media.php | 11 +++++++++++ tests/phpunit/tests/media.php | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/wp-includes/media.php b/src/wp-includes/media.php index a0e7ef9c6c..260db26cac 100644 --- a/src/wp-includes/media.php +++ b/src/wp-includes/media.php @@ -1843,6 +1843,17 @@ function wp_filter_content_tags( $content, $context = null ) { $filtered_image = wp_img_tag_add_loading_attr( $filtered_image, $context ); } + /** + * Filters an img tag within the content for a given context. + * + * @since 6.0.0 + * + * @param string $filtered_image Full img tag with attributes that will replace the source img tag. + * @param string $context Additional context, like the current filter name or the function name from where this was called. + * @param int $attachment_id The image attachment ID. May be 0 in case the image is not an attachment. + */ + $filtered_image = apply_filters( 'wp_content_img_tag', $filtered_image, $context, $attachment_id ); + if ( $filtered_image !== $match[0] ) { $content = str_replace( $match[0], $filtered_image, $content ); } diff --git a/tests/phpunit/tests/media.php b/tests/phpunit/tests/media.php index 5d92d9718b..88a402e298 100644 --- a/tests/phpunit/tests/media.php +++ b/tests/phpunit/tests/media.php @@ -2293,6 +2293,17 @@ EOF; $this->assertSame( $img, wp_filter_content_tags( $img ) ); } + /** + * @ticket 55347 + */ + public function test_wp_filter_content_tags_has_filter() { + $filter = new MockAction(); + add_filter( 'wp_content_img_tag', array( &$filter, 'filter' ) ); + $img_tag_1 = get_image_tag( self::$large_id, '', '', '', 'medium' ); + + wp_filter_content_tags( $img_tag_1 ); + $this->assertSame( 1, $filter->get_call_count() ); + } /** * @ticket 33641 * @ticket 34528