首先,我不明白为什么需要挂接5个不同的操作:save_post
足够了:发布和更新后调用它。
之后,您发布的函数不会获取帖子内容中的图像,而是获取当前帖子的第一张子图像。
在以下情况下,图像是帖子的子级:
它是从帖子编辑屏幕上传的(通过帖子内容编辑器上方的“添加媒体”按钮)
它是从媒体页面上传的,第一次插入帖子中,但是帖子和媒体之间的关系是一对多的:帖子可以有多个媒体子级,但媒体只能有一个父级。这就是为什么如果一个图像已经附加到一个帖子(它是帖子的子帖子)上,您的功能就无法工作,因为该图像不能是两个(或更多)帖子的子帖子。
因此,如果您想在帖子内容中获取第一幅图像,您应该查看帖子内容并提取第一幅图像,然后从图像中获取图像id,最后将该id用作帖子缩略图。
add_action(\'save_post\', \'wpse127196_auto_set_featured_image\', 10, 2);
function wpse127196_auto_set_featured_image( $postid, $post ) {
// do work only if there is no featured image already
// and no need to rely on global post: the function receive
// post id and post object as arguments
if ( ! has_post_thumbnail($postid) ) {
// get the url of first image in post content
$image = wpse127196_get_first_image( $post->post_content);
if ( ! empty($image) ) {
// get the image id from the url
$img_id = wpse127196_get_img_id_from_url( $image );
if ( (int) $img_id > 0 ) {
// finally set post thumbnail
set_post_thumbnail($postid, $img_id );
}
}
}
}
如您所见,上述函数中使用了两个函数:wpse127196_get_first_image
和wpse127196_get_img_id_from_url
.第一种是从内容中提取图像,可以用不同的方式编写。可能最可靠的方法是使用html解析器(Google for it). 一种更简单但价格更低的方法是使用regex。
为了简单起见,我将在此处使用regex:
function wpse127196_get_first_image( $text = \'\' ) {
if ( is_string($text) && ! empty($text) ) {
$m = array();
preg_match_all(\'#src=["\\\']([^"\\\']*\\.jpg|jpeg|gif|png)["\\\']#i\' , $text, $m);
if ( isset($m[1]) && ! empty($m[1]) ) {
$path = wp_upload_dir();
foreach( $m[1] as $url ) {
if ( false !== strpos( $url, $path[\'baseurl\'] ) ) { // skip external images
return $url;
}
}
}
}
}
从url开始检索id的函数来自herefunction wpse127196_get_img_id_from_url( $url ) {
$id = 0;
if ( filter_var($url, FILTER_VALIDATE_URL) ) {
$upload_dir_paths = wp_upload_dir();
// skip external images
if ( false !== strpos( $url, $upload_dir_paths[\'baseurl\'] ) ) {
global $wpdb;
// If this is the URL of an auto-generated thumbnail
// get the URL of the original image
$url = preg_replace( \'/-\\d+x\\d+(?=\\.(jpg|jpeg|png|gif)$)/i\', \'\', $url );
// Remove the upload path base directory from the attachment URL
$url = str_replace( $upload_dir_paths[\'baseurl\'] . \'/\', \'\', $url );
// Finally, run a custom database query to get the attachment ID from URL
$id = $wpdb->get_var( $wpdb->prepare(
"SELECT wposts.ID FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
WHERE wposts.ID = wpostmeta.post_id
AND wpostmeta.meta_key = \'_wp_attached_file\'
AND wpostmeta.meta_value = \'%s\'
AND wposts.post_type = \'attachment\'", $url
) );
}
}
return $id;
}