有一个代码。
add_filter( \'the_content\', \'adding_image_dimensions\' );
function adding_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 ) );
$html = \'\';
if (($width != 0) || ($height != 0)) {
$html = \' width="%d" height="%d" \';
}
$image_tag = sprintf( \'<img loading="lazy" src=%s%s%s%s%s\' . $html . \'/>\', $src, $alt, $title, $class, $id, $width, $height );
$content = str_replace($image, $image_tag, $content);
}
}
return $content;
}
我把它改了一点。因此,所有内容都可以立即放入数据库,而不是不断地动态生成。
add_action( \'wp_insert_post_data\', \'adding_image_dimensions\' );
function adding_image_dimensions( $content ) {
$content = $content[\'post_content\'];
preg_match_all( \'/<img[^>]+>/i\', $content, $images);
if (count($images) < 1)
return $content;
foreach ($images[0] as $image) {...
但由于某些原因,代码不起作用:-(
Im使用WordPress 5.7.2,经典编辑器。在我的文章中,我有很多这样题写的图片。
<a href="https://....jpg" target="_blank" rel="nofollow" title="test title"><img class="test class" alt="test alt" src="https://....jpg"></a>
对不起,我的英语不好。
最合适的回答,由SO网友:Sally CJ 整理而成
我把它改了一点。
但由于某些原因,代码不起作用:-(
你应该解释到底发生了什么或没有发生什么,而不是简单地说;不起作用;。
但无论如何,如果下面的第一行和第五行是您在代码中应用的唯一更改:
add_action( \'wp_insert_post_data\', \'adding_image_dimensions\' );
function adding_image_dimensions( $content ) {
$content = $content[\'post_content\'];
那么这确实不会给您带来预期的结果(例如,否
<img>
标签将被替换,因为第二个
preg_match_all()
调用将失败),原因如下:
该函数现在连接到wp_insert_post_data
filter, 因此,函数应该返回post数据数组,但在代码中,第五行(即。$content = $content[\'post_content\'];
) 实际上,将返回值更改为字符串。
在$content[\'post_content\']
值被删除(例如。src="..."
成为src=\\"...\\"
), 因此,您应该首先取消斜杠值,然后在处理图像标记后将其向后斜杠。
如何解决这些问题,使adding_image_dimensions()
函数与wp_insert_post_data
相反,您可以尝试以下操作:
// 1: Rename the $content to $data
function adding_image_dimensions( $data ) {
// 2: Unslash the post content.
$content = wp_unslash( $data[\'post_content\'] );
preg_match_all( \'/<img[^>]+>/i\', $content, $images);
if (count($images) < 1) {
// 3: Return the $data and not $content.
return $data;
}
foreach ($images[0] as $image) {
// ... your code here.
}
// 4: Slash back the post content.
$data[\'post_content\'] = wp_slash( $content );
// 5: Return the $data and not $content.
return $data;
}
替代解决方案(无需“转换”或修改自定义函数)
删除
add_filter( \'the_content\', \'adding_image_dimensions\' );
调用原始文件adding_image_dimensions()
中的函数wp_insert_post_data
挂钩:
// * use add_filter() and not add_action()
add_filter( \'wp_insert_post_data\', \'my_wp_insert_post_data\' );
function my_wp_insert_post_data( $data ) {
$content = adding_image_dimensions( wp_unslash( $data[\'post_content\'] ) ); // pass an *unslashed* content
$data[\'post_content\'] = wp_slash( $content ); // then slash back the content
return $data;
}