向每页上显示的所有图像插入宽度和高度属性

时间:2016-08-18 作者:Ethan O\'Sullivan

使用WordPressthe_content 标记,我正在运行一个自定义函数来搜索所有没有widthheight 属性设置并插入适当的维度。功能如下:

add_filter( \'the_content\', \'add_img_dimensions\' );

function add_img_dimensions( $image_no_dimensions ) { // Insert width & height to images missing dimensions
    if ( preg_match_all( \'/<img [^>]+width=[^>]+height=>/i\', $image_no_dimensions, $result ) ) {
        // Do nothing...
    }
    else {
        preg_match_all( \'/(alt|title|src)=("[^"]*")/i\', $image_no_dimensions, $img );
        list( $width, $height, $type, $attr ) = getimagesize( str_replace( "\\"", "" , ( $img[2][0] ) ) );
        $imgname = str_replace( "\\"", "" , ( $img[2][0] ) );
    }

    return sprintf( \'<img src="%s" width="%dpx" height="%dpx" />\', str_replace("\\"", "" , ( $img[2][0] ) ), $width, $height );
}
例如,如果我的一个页面上有一个图像,其外观如下所示:

<img src="https://link.to/sum/img.jpg" alt="Image Title" />
然后将插入widthheight 实际图像的:

<img width="150" height="50" src="https://link.to/sum/img.jpg" alt="Image Title" />
该功能按预期工作。但是,页面的所有内容都将替换为它找到的第一个未设置维度的图像。

我怎么能return 所有内容,但只更改没有维度的图像?

Before and afterenter image description here

2 个回复
最合适的回答,由SO网友:Nate Allen 整理而成

测试并确认此功能:

add_filter( \'the_content\', \'add_image_dimensions\' );

function add_image_dimensions( $content ) {

    preg_match_all( \'/<img[^>]+>/i\', $content, $images);

    if (count($images) < 1)
        return $content;

    foreach ($images[0] as $image) {
        preg_match_all( \'/(alt|title|src|width|class|id|height)=("[^"]*")/i\', $image, $img );

        if ( !in_array( \'src\', $img[1] ) )
            continue;

        if ( !in_array( \'width\', $img[1] ) || !in_array( \'height\', $img[1] ) ) {
            $src = $img[2][ array_search(\'src\', $img[1]) ];
            $alt = in_array( \'alt\', $img[1] ) ? \' alt=\' . $img[2][ array_search(\'alt\', $img[1]) ] : \'\';
            $title = in_array( \'title\', $img[1] ) ? \' title=\' . $img[2][ array_search(\'title\', $img[1]) ] : \'\';
            $class = in_array( \'class\', $img[1] ) ? \' class=\' . $img[2][ array_search(\'class\', $img[1]) ] : \'\';
            $id = in_array( \'id\', $img[1] ) ? \' id=\' . $img[2][ array_search(\'id\', $img[1]) ] : \'\';
            list( $width, $height, $type, $attr ) = getimagesize( str_replace( "\\"", "" , $src ) );

            $image_tag = sprintf( \'<img src=%s%s%s%s%s width="%d" height="%d" />\', $src, $alt, $title, $class, $id, $width, $height );
            $content = str_replace($image, $image_tag, $content);
        }
    }

    return $content;
}

SO网友:majick

使用时始终需要返回完整内容the_content 滤器但是你的代码无论如何都不能处理多个图像。。。这样做可能会更好,首先提取所有图像标记,然后循环为每个标记添加宽度/高度,并替换原始标记:

add_filter( \'the_content\', \'add_img_dimensions\' );

function add_img_dimensions( $content ) { 

    preg_match_all( \'/<img[^>]+>/i\', $content, $images);
    if (count($images) < 1) {return $content;}

    foreach ($images as $image) {
        preg_match_all( \'/(alt|title|src|width|height)=("[^"]*")/i\', $image[0], $img );
        // Insert width & height to image if no width specified
        if (!isset($img[3])) {
            $imgalt = str_replace( "\\"", "" , ( $img[0][0] ) );                                 
            $imgtitle = str_replace( "\\"", "" , ( $img[1][0] ) );
            $imgname = str_replace( "\\"", "" , ( $img[2][0] ) );                
            list( $width, $height, $type, $attr ) = getimagesize( $imgname );
            $newimagetag = sprintf( \'<img src="%s" alt="%s" title="%s" width="%dpx" height="%dpx" />\', $imgname, $imgalt, $imgtitle, $width, $height );
            $content = str_replace($image, $newimagetag, $content);
        }
    }

    return $content;
}
注意:未测试,我不确定索引引用是否正确。。。此外,这样会丢失任何内联样式或其他属性(如边框),因此需要进一步保存这些属性。