没有srcset的the_post_thumbnail?


12

WordPress 4.4 srcset使用the_post_thumbnail功能时会添加多个图像尺寸。不使用srcset是否可以仅获得一个图像大小?

我知道可以添加一个过滤器以禁用srcset所有图像,但是我想srcset仅在调用特定缩略图大小时(例如,仅在调用完整图像大小时)禁用它。

Answers:


13

我想仅在调用特定缩略图大小时(例如仅在调用完整图像大小时)禁用srcset。

这里有两个想法(如果我理解正确的话):

方法1

让我们从post_thumbnail_size过滤器中检查尺寸。如果它与相应的大小匹配(例如full),则请确保$image_meta使用wp_calculate_image_srcset_meta过滤器将其清空。这样,我们可以尽早从wp_calculate_image_srcset()函数中解脱出来(比使用max_srcset_image_widthor wp_calculate_image_srcset过滤器禁用它更早):

/**
 * Remove the srcset attribute from post thumbnails 
 * that are called with the 'full' size string: the_post_thumbnail( 'full' )
 *
 * @link http://wordpress.stackexchange.com/a/214071/26350
 */
 add_filter( 'post_thumbnail_size', function( $size )
 {
     if( is_string( $size ) && 'full' === $size )
         add_filter( 
             'wp_calculate_image_srcset_meta',  
              '__return_null_and_remove_current_filter' 
         );   
    return $size;
 } );

// Would be handy, in this example, to have this as a core function ;-)
function __return_null_and_remove_current_filter ( $var )
{
    remove_filter( current_filter(), __FUNCTION__ );
    return null;
}

如果我们有:

the_post_thumbnail( 'full' );

那么生成的<img>标记将不包含该srcset属性。

对于这种情况:

the_post_thumbnail();

我们可以匹配'post-thumbnail'大小字符串。

方法#2

我们还可以使用以下方法手动添加/删除过滤器:

// Add a filter to remove srcset attribute from generated <img> tag
add_filter( 'wp_calculate_image_srcset_meta', '__return_null' );

// Display post thumbnail
the_post_thumbnail();

// Remove that filter again
remove_filter( 'wp_calculate_image_srcset_meta', '__return_null' );

您可能还需要wp_calculate_image_srcset_meta在函数结束后删除过滤器
Mark Kaplun'1

我添加了手动添加/删除过滤器回调的方法。我使用另一种方法中的实例计数来为每个the_post_thumbnail()调用@MarkKaplun仅运行一次
birgire

我简化了代码片段,感谢您让我再考虑一次;-) @MarkKaplun
birgire

1
:)我刚刚找到了一种有效的方式来表明我对过滤器中的匿名函数的不满意:)
Mark Kaplun

1
或应该有一个“运行一次”参数add_filter。这种模式确实很常见。
马克·卡普伦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.