您需要抓取图像,获取其ID,然后使用wp_get_attachment_image
拾取大小适当的图像。
function first_image_medium_wpse_97658($content) {
global $wpdb;
$pattern = \'|<img.*?src="([^"]+)".*?/>|\';
preg_match($pattern,$content,$matches);
if (!empty($matches[1])) {
$path = pathinfo($matches[1]);
if (!empty($path[\'filename\'])) {
$id = $wpdb->get_var($wpdb->prepare("SELECT ID FROM {$wpdb->posts} WHERE post_name = %s",$path[\'filename\']));
if (!empty($id)) {
$content = wp_get_attachment_image($id,\'medium\');
}
}
}
return $content;
}
add_filter(\'the_content\',\'first_image_medium_wpse_97658\');
和另一个版本,默认情况下使用图像上设置的类。此查询没有额外的数据库查询,但如果未设置这些类,则会失败。
function first_image_medium_wpse_97658_v2($content) {
$pattern = \'|<img.*?class="([^"]+)".*?/>|\';
preg_match($pattern,$content,$matches);
if (!empty($matches[1])) {
$classes = explode(\' \',$matches[1]);
$id = preg_grep(\'|^wp-image-.*|\',$classes);
if (!empty($id)) {
$id = str_replace(\'wp-image-\',\'\',$id);
if (!empty($id)) {
$id = reset($id);
$content = wp_get_attachment_image($id,\'medium\');
}
}
}
return $content;
}
add_filter(\'the_content\',\'first_image_medium_wpse_97658_v2\');
也可以直接调用该函数,而无需用作过滤器回调。
echo first_image_medium_wpse_97658_v2($post->post_content);
要用内容中的第一个图像替换摘录,需要进行细微的更改。这个
the_excerpt
筛选器传递的内容与
the_content
筛选,但不能保证\\u post\\u content\\uimage会在其中。
function first_image_medium_wpse_97658_v3($excerpt) {
global $post;
$content = $post->post_content;
$pattern = \'|<img.*?class="([^"]+)".*?/>|\';
preg_match($pattern,$content,$matches);
if (!empty($matches[1])) {
$classes = explode(\' \',$matches[1]);
$id = preg_grep(\'|^wp-image-.*|\',$classes);
if (!empty($id)) {
$id = str_replace(\'wp-image-\',\'\',$id);
if (!empty($id)) {
$id = reset($id);
$excerpt = wp_get_attachment_image($id,\'medium\');
}
}
}
return $excerpt;
}
add_filter(\'the_excerpt\',\'first_image_medium_wpse_97658_v3\',100);
我还为回调添加了一个优先级,以便过滤器运行得很晚,希望在其他过滤器之后运行,以便
the_excerpt
被滤波器输出完全替代。