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
This commit is contained in:
Felix Arntz 2022-03-29 23:56:18 +00:00
parent 86ed0d2e57
commit 0514150026
2 changed files with 22 additions and 0 deletions

View File

@ -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 );
}

View File

@ -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