WP笔记

WordPress文章自动设置特色图像

本文介绍一种为WordPress文章自动设置特色图像的方法。WordPress的特色图像是一个很实用的功能,为每篇文章增加一个特色图像,可以使blog各个部分都更生动。比如首页每篇文章都有自己的缩略图,相关文章中用缩略图告诉用户这些文章的主题,或者在侧栏加一个特色文章功能,显示文章特色图像。

2021年10月更新

下面这段代码会将文章中第一张WordPress附件图片设置为特色图像,附件图片是指上传到WordPress的图片,不需要和当前的文章有关联。

function sola_auto_featured_image() {
  global $post;

  if( has_post_thumbnail() ){
    return;
  }

  preg_match('/<img\s[^>]*?class\s*=\s*[\'\"]([^\'\"]*?)[\'\"][^>]*?>/', $post->post_content, $matches);
  $img_class = $matches[1] ?? false;

  if( $img_class ){
    preg_match('/wp-image-([\d]+)/', $img_class, $matchId);
    $attachment_id = $matchId[1] ?? false;

    if( $attachment_id ){
        set_post_thumbnail($post->ID, absint($attachment_id) );
    }
  }
}

add_action('the_post', 'sola_auto_featured_image');
add_action('save_post_post', 'sola_auto_featured_image');

注意:add_action('the_post', 'sola_auto_featured_image')会使这段代码在任何文章被加载时运行,比如archive页面,single post页面等等。好处是被人访问一段时间,你的所有文章就自动获得了特色图像,坏处就是对性能有影响。当你的特色图像设置的差不多时,应该将这一句注释掉。


下面是旧的内容。

特色图像需要用户手动选择,方法在文章《如何设置WordPress文章特色图像(Featured Image》中有详细的介绍。但手动选择有些不方便,不是每次都能想起来点一下设置特色图像按钮,如果能自动为WordPress文章添加特色图像,就方便多了。

WordPress文章自动设置特色图像代码

这里有一段很实用的代码,可以自动将文章中的第一张图片设置为特色图像,如果你手动设置了特色图像,可以覆盖这段代码。将下面的代码丢到当前主题的functions.php里,以后就不用担心忘记设置特色图像了。

function autoset_featured() {
  global $post;
  $already_has_thumb = has_post_thumbnail($post->ID);
  if (!$already_has_thumb)  {
    $attached_image = get_children( "post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" );
    if ($attached_image) {
      foreach ($attached_image as $attachment_id => $attachment) {
        set_post_thumbnail($post->ID, $attachment_id);
      }
    }
  }
}  //end function
add_action('the_post', 'autoset_featured');
add_action('save_post', 'autoset_featured');
add_action('draft_to_publish', 'autoset_featured');
add_action('new_to_publish', 'autoset_featured');
add_action('pending_to_publish', 'autoset_featured');
add_action('future_to_publish', 'autoset_featured');

最近迷上了读一些外国人的技术博客,很崇拜他们能有条理的把一件事说明白、说透彻。

23条评论

  1. 不知道博主这个还有可能回复我,我遇到的问题是希望能固定设置一个尺寸给特色图,现在是获取到了第一个图但是样式很丑,图片有多长特色图就显示多长我希望显示一个固定的尺寸例如我的网站统一是900*450,使用看图片缩略图插件Retina已经有900*450的缩略图生成。请问配合上面的代码怎么使用尼?

    1. 你用什么函数调用特色图像?900×450是代码 指定的尺寸吗?如果是名字是什么?
      你的函数参数带上这个尺寸名字就可以调用了。

      正确的做法是先指定特色图像尺寸,在主题functions.php中使用set_post_thumbnail_size()函数,这样用the_post_thumbnail()调用特色图像,默认就是这个尺寸。

      1. 我的系统图片缓存生成函数名称是:large (900×450);
        我用的您这段代码修改的没有成功
        function autoset_featured() {
        global $post;
        $already_has_thumb = has_post_thumbnail($post->ID);
        if (!$already_has_thumb) {
        $attached_image = get_children( “post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1” );
        if ($attached_image) {
        foreach ($attached_image as $attachment_id => $attachment) {
        set_post_thumbnail($post->ID, $attachment_id); //是这里需要修改成set_post_thumbnail_size(‘large’);吗?可是这样的话$post->ID, $attachment_id是什么用的冲突了。。。
        }
        }
        }
        } //end function
        add_action(‘the_post’, ‘autoset_featured’);
        add_action(‘save_post’, ‘autoset_featured’);
        add_action(‘draft_to_publish’, ‘autoset_featured’);
        add_action(‘new_to_publish’, ‘autoset_featured’);
        add_action(‘pending_to_publish’, ‘autoset_featured’);
        add_action(‘future_to_publish’, ‘autoset_featured’);

        求再指点一下。

      2. 现在我正在调试你可以看一下我的网站首页的情况就明白了http://www.iamue.com/ 我希望是把1000*323的特色图强制缩放成900*450 的特色图,而我的缩略图实际上有这个large (900×450);属性在上述代码中就是没搞明白怎么用这个尺寸

        1. 调用的图片尺寸不对需要改php代码,先找到输出特色图像的代码再说。抱歉我现在有些忙,不能帮你研究。

  2. 我刚刚试了一下怎么没用,是不是我放的位置不对,我是用wp手机客户端写的文章,

    1. 没用手机客户端测试过,客户端机制和服务器版本应该不同,代码不一定适用。

  3. 用了博主的代码,但是写完一个文章去看所有文章列表的时候,没有看到特色图像.我是在写文章的时候插入媒体库里的一张图片的. 博主, 我是否哪里操作不当?

  4. if ( ! function_exists( ‘fb_set_featured_image’ ) ) {

    add_action( ‘save_post’, ‘fb_set_featured_image’ );
    function fb_set_featured_image() {

    if ( ! isset( $GLOBALS[‘post’]->ID ) )
    return NULL;

    if ( has_post_thumbnail( get_the_ID() ) )
    return NULL;

    $args = array(
    ‘numberposts’ => 1,
    ‘order’ => ‘ASC’, // DESC for the last image
    ‘post_mime_type’ => ‘image’,
    ‘post_parent’ => get_the_ID(),
    ‘post_status’ => NULL,
    ‘post_type’ => ‘attachment’
    );

    $attached_image = get_children( $args );
    if ( $attached_image ) {
    foreach ( $attached_image as $attachment_id => $attachment )
    set_post_thumbnail( get_the_ID(), $attachment_id );
    }

    }

    }

    哪个更好?

    1. 这俩除了用的action数量不同,别的貌似区别不太大,对代码中的‘post_status’ => NULL表示不太理解。用get_the_ID()还是用global声明$post也没大区别,不然你可以检测一下sql查询数量,比较一下吧。

  5. 最近做的一个项目,需要导入大量数据到WP中,小编问我没有有自动加特色图的功能,正处理这个问题来着,在你这解决了,多谢了! 加油!

  6. 反馈:在striking主题上,把源码加入functions.php ; 加入图象,发布后发觉特色图象并没有自动添加。
    尝试下 楼上朋友说的插件下

    1. 谢谢你的反馈,我说的不准确,第一张图片是指从当前文章上传的图片中的第一张,也就是说这图片必须属于这篇文章才可以,如果只是插入一张隶属于其它文章的图片,甚至外链图片,是不行的。
      当然,你只要修改一下函数,换成用正则表达式匹配文章中的第一张图片并设为特色图像就可以了,但这张图片您必须是上传到媒体库的图片。

  7. Pingback: WordPress:为文章设置默认的特色图像的方法总结(Default featured image) | ~SolagirL~
  8. 这个函数是不是有点限制,只能处理已经附加于文章的图片。如果从其它程序升级过来的WP,或是采集来的图片,并不能适合,是吧?

    1. 如果你只能提供一个图片url,就用post meta存储。如果是采集来的图片并且已经保存到本地,可以写程序自动设置特色图像,特色图像只能有一张,如果要显示很多张,就要用附件或者post meta了。

  9. 有了这个,可以 wp-thumbnail 插件扔了。我正在逐步扔插件,有些小插件直接写在 function.php 更好.

    1. 小插件直接写到functions.php里很不错,我也喜欢这样。特别是把这些功能做成库放到主题里,就不怕换主题了,每次只要重新引入这些文件,就会有这些功能,弄个自己的主题框架出来

评论已关闭。