更多地控制源集(不是每次都包含所有大小)

时间:2018-10-16 作者:francois

如果不是全部的话,我想对我网站上某些重要图片的srcset有更多的控制权。

默认情况下,srcset包含wordpress为所有图像创建的所有大小。我希望能够在wordpress创建的所有不同尺寸中选择要采用的尺寸。

这里有一个很清楚的例子:-我在一个页面上有很多缩略图图像,列出了我所有的文章。-这个缩略图的最大宽度:250px,考虑到所有不同的屏幕和分辨率,我上传缩略图的分辨率远远高于需要的分辨率,比如说2000px宽。在我的例子中,生成了10幅大小如下的图像:

thumbnail (150x150)
medium (600x600)
medium_large (700x700)
large (800x800)
featured-blog (719x1020)
featured-blog-mobile-3x (1350x1915)
pleine-largeur (910x910)
colonne (460x460)
encart (340x240)
mini-size (300x300)
thumbnail-blog (246x180)
thumbnail-blog-mobile-3x (500x365)

In mobile 3x (pixel density) The image used is much too heavy : 
250px 3=750px。因此,它加载了这个“大(800x800)”我想避免使用如此大的图像,因为我在页面上有70幅这样的图像。页面重量为30MO。太多太多了!

因此,我需要在srcset中提供的不同大小中定义我想要包含的大小,并排除我不想要的大小。

已经谢谢了,如果你能在这件事上帮助我,我会非常感激的

弗朗索瓦

2 个回复
SO网友:Jacob Peattie

有一个过滤器max_srcset_image_width 允许您限制srcset 属性为小于给定最大宽度的那些。

此代码将使其仅适用于大小<;srcset中将使用500像素宽:

/**
 * @param int   $max_width  The maximum image width to be included in the \'srcset\'. Default \'1600\'.
 * @param array $size_array Array of width and height values in pixels (in that order).
 */
function wpse_316853_srcset_maximum_width( $max_srcset_image_width, $sizes_array ) {
    return 500;
}
add_filters( \'max_srcset_image_width\', \'wpse_316853_srcset_maximum_width\', 10, 2 );
但在您的情况下,您可能只希望在原始图像是250px宽的缩略图时应用此限制。$sizes_array 包含当前图像的大小,因此您可以使用它来检查:

/**
 * @param int   $max_width  The maximum image width to be included in the \'srcset\'. Default \'1600\'.
 * @param array $size_array Array of width and height values in pixels (in that order).
 */
function wpse_316853_srcset_maximum_width( $max_srcset_image_width, $sizes_array ) {
    if ( $sizes_array[0] === 250 ) {
        $max_srcset_image_width = 500;
    }

    return $max_srcset_image_width;
}
add_filters( \'max_srcset_image_width\', \'wpse_316853_srcset_maximum_width\' );
或者,您可以动态地执行此操作,以便srcset只包含宽度为原始图像2倍的图像:

/**
 * @param int   $max_width  The maximum image width to be included in the \'srcset\'. Default \'1600\'.
 * @param array $size_array Array of width and height values in pixels (in that order).
 */
function wpse_316853_srcset_maximum_width( $max_srcset_image_width, $sizes_array ) {
    return $sizes_array[0] * 2;
}
add_filters( \'max_srcset_image_width\', \'wpse_316853_srcset_maximum_width\' );

SO网友:francois

谢谢Jabob,很抱歉回答得太晚。我花了一点时间来理解和测试。我缺乏wordpress和php知识。这篇短文帮助了我,也帮助了我使用了ACF(高级自定义字段):https://awesomeacf.com/responsive-images-wordpress-acf/

I could completly manage the srcset and sizes of the main image of my articles (single.php). But not the thumbnails of each articles in my blog page (taxonomy.php)

我做了一些与您在第二个和第三个代码中编写的内容非常接近的事情,并且成功了。alt属性只能在我不理解的情况下不起作用。以下是我所做的:

在功能中。php:

function responsive_feature_image($image_id,$image_size,$max_width){

    function remove_max_srcset_image_width( $max_width ) {
        $max_width = 1350;
        return $max_width;
    }
    add_filter( \'max_srcset_image_width\', \'remove_max_srcset_image_width\' );
    // check the image ID is not blank
    if($image_id != \'\') {

        // set the default src image size
        $image_src = wp_get_attachment_image_url( $image_id, $image_size );

        // set the srcset with various image sizes
        $image_srcset = wp_get_attachment_image_srcset( $image_id, $image_size );

        // generate the markup for the responsive image
        echo \'src="\'.$image_src.\'" srcset="\'.$image_srcset.\'" sizes="(max-width: 449px) 120vw, (max-width: 767px) 576px, (max-width: 1365px) calc( 100vw - 60px - 55% ), \'.$max_width.\'"\';

    }
}
单件。php:

<?php $img = get_field(\'image_principale\'); ?>
        <div class="feature-image">
             <?php if( $img  ): ?>
                 <img <?php responsive_feature_image($img,\'featured-blog\',\'719px\'); ?>  alt="<?php echo $img[\'alt\']; ?>" />
            <?php else: ?>
                <img src="<?php echo get_template_directory_uri() ?>/dist/images/article/feature-image-default.jpg" alt="Illustration de l\'article">
            <?php endif; ?>
        </div>
不幸的是,我无法找到如何在文件分类法中为我的博客页面的缩略图图像实现同样的效果。php。缩略图通过过滤器菜单按类别排序。这说明代码要复杂得多。以防万一你能再帮我一些。

下面是在分类法中如何调用缩略图。php:

    <?php $displayCurrentCat = get_field(\'display_articles-in-page_by_category\', $term); ?>

    <?php if(!$displayCurrentCat && $children): ?>

        <nav class="filter_by_category">
            <ul>
                <?php if( $children ): ?>
                    <li>Filtrer les articles </li>
                    <li data-filter="all" class="actif">
                        <a href="#">Toutes les catégories</a>
                    </li>
                    <?php foreach( $children as $child ): ?>
                        <?php $child_term = get_term($child) ?>
                        <li data-filter="<?php echo $child_term->term_id; ?>" >
                            <a href="#"><?php echo $child_term->name; ?></a>
                        </li>
                    <?php endforeach; ?>
                <?php endif; ?>
            </ul>
        </nav>

    <?php endif; ?> 

    <div class="all_the_articles tdm__posts <?php if(!$displayCurrentCat){ echo\'filtr-container\'; } ?>">
        <?php if($displayCurrentCat): ?>
            <div class="tdm__grid tdm__grid--5">
                <?php render_term_thumbnails($term); ?>
            </div>
        <?php else: ?>
            <?php if( $children ): ?>
                <?php foreach( $children as $child ): ?>
                    <?php $child_term = get_term($child) ?>
                    <div class="filtr-item" data-category="<?php echo $child_term->term_id; ?>" data-sort="value">
                        <div class="nom_categorie tdm__posts__cat" >
                            <h2><?php echo $child_term->name; ?></h2>
                        </div>
                        <div class="tdm__grid tdm__grid--5">
                            <?php render_term_thumbnails($child); ?>
                        </div>
                    </div>
                <?php endforeach; ?>
            <?php endif; ?>
        <?php endif; ?>
    </div>

</div>
下面是函数中的内容。php:

function render_content_thumbnail($id){
    $img = get_the_img(get_field("thumbnail", $id), "thumbnail-blog");
    if(!$img){
        $img = \'<img src="\'.get_template_directory_uri() . \'/dist/images/default_thumb.png" class="attachment-thumbnail-blog size-thumbnail-blog" alt="default \'.get_the_title($id).\'">\';
    }
    $title = get_field(\'titre_court\', $id) ? get_field(\'titre_court\', $id) : get_the_title($id);
    echo \'
        <article class="reveal tdm__post tdm__post--\'.$id.\' \'.get_field(\'couleur\', $id).\'">
            <a class="tdm__post__link" href="\'.get_permalink($id).\'">
                <span class="tdm__post__thumbnail">\'.$img.\'</span>
                <span class="tdm__post__title">\'.$title.\'</span>
            </a>
        </article>\';
}

function render_term_thumbnails($term){
    $t = get_term($term);
    $args = array(
        \'post_type\' => \'article\',
        \'orderby\' => \'menu_order\',
        \'order\' => \'ASC\',
        \'tax_query\' => array(
            array(
                \'taxonomy\' => \'categorie\',
                \'field\'    => \'slug\',
                \'terms\'    => $t->slug
            ),
        ),
    );
    $tdmQuery = new WP_Query( $args );
    while ( $tdmQuery->have_posts() ) : $tdmQuery->the_post();
        render_content_thumbnail( get_the_id() );
    endwhile;
    wp_reset_postdata();
}

function render_term_menu($term){
    $t = get_term($term);
    $args = array(
        \'post_type\' => \'article\',
        \'orderby\' => \'menu_order\',
        \'order\' => \'ASC\',
        \'tax_query\' => array(
            array(
                \'taxonomy\' => \'categorie\',
                \'field\'    => \'slug\',
                \'terms\'    => $t->slug
            ),
        ),
    );
    $tdmQuery = new WP_Query( $args );
    while ( $tdmQuery->have_posts() ) : $tdmQuery->the_post();
        render_content_menu( get_the_id() );
    endwhile;
    wp_reset_postdata();
}
function get_the_img($att_id, $size, $diapo = false){

    if( $att_id  ){
        $imgSrc = wp_get_attachment_image_src($att_id, $size);
        $srcset = wp_get_attachment_image_srcset($att_id, $size);
        $sizes = wp_get_attachment_image_sizes($att_id, $size);
        if(function_exists( \'get_rocket_option\' ) && get_rocket_option( \'lazyload\' ) && !is_user_logged_in() ){
            $i = \'<img width="\'.$imgSrc[1].\'" class="-is-lazy" height="\'.$imgSrc[2].\'" data-lazy-src="\'.$imgSrc[0].\'" alt="\'.$imgSrc[3].\'" data-lazy-srcset="\'.$srcset.\'" sizes="\'.$sizes.\'">\';
        }else {
            $i = \'<img width="\'.$imgSrc[1].\'" height="\'.$imgSrc[2].\'" src="\'.$imgSrc[0].\'" alt="\'.$imgSrc[3].\'" srcset="\'.$srcset.\'" sizes="\'.$sizes.\'">\';
        }

        $legend = wp_get_attachment_caption($att_id);

        $credit = get_field(\'credit\', $att_id);

        $i = $diapo ? sprintf( \'<div class="effet_photo">%1$s</div>\', $i ) : $i;

        $i = $legend || $diapo || $credit ? sprintf( \'%1$s<p class="description_photo">%2$s<span>%3$s</span></p>\', $i, $legend, $credit ) : $i;

        return $i;
    }
}

结束

相关推荐

Div-Wrap with Functions.php in ChildTheme Using Shorcode!

我只想为一个简单样式的DIV包装器创建一个短代码。在WordPress的网站上,我想添加如下内容:[quotehead]Headline text[/quotehead] ...a normal blockquote from wordpress... 输出应为:<div class=\"block_header\">Headline text</div> 我的内部功能functions.php (在childtheme中)包含以下内容:/**