使用WordPressthe_content
标记,我正在运行一个自定义函数来搜索所有没有width
和height
属性设置并插入适当的维度。功能如下:
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" />
然后将插入
width
和
height
实际图像的:
<img width="150" height="50" src="https://link.to/sum/img.jpg" alt="Image Title" />
该功能按预期工作。但是,页面的所有内容都将替换为它找到的第一个未设置维度的图像。
我怎么能return
所有内容,但只更改没有维度的图像?
Before and after
最合适的回答,由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;
}
注意:未测试,我不确定索引引用是否正确。。。此外,这样会丢失任何内联样式或其他属性(如边框),因此需要进一步保存这些属性。