WordPress:为文章设置默认的特色图像(Default featured image)的方法很多,各有优劣,选择哪种方式要看自己的用途,有些方法并没有真的设置了特色图像,但用起来却很灵活,下面一一列举出来。

featured-image

准备:特色图像是什么

首先要明白特色图像究竟是什么,特色图像的本质是一个custom field,存储在wp_postmeta表中,meta_key叫做_thumbnail_id,meta_value是一个整数,也就是attachment_id

特色图像的本质

当meta_key以“_”开头时,这个custom field对用户是隐藏的,就像windows文件夹里的隐藏文件一样。

方法一:自动设置文章第一张图片为特色图像

注意这里说的第一张图片,是指已经上传到媒体库(Media Library)中的图片,因为特色图像需要一个attachment_id,只有上传到媒体库的图片才有attachment_id,经常有人问可不可以用通过输入图片URL设置特色图像,我想看了特色图像的本质你就知道这个问题的答案了。

方法见文章《自动为WordPress文章设置特色图像

方法二:设置一张用户指定的图像为特色图像

这种方法也是真正的设置了特色图像,所以你的默认图像应该是一张上传到媒体库的图片,你要做的第一个工作就是获取这张图片的attachment_id,打开媒体库,找到图片,点击编辑图片,这时浏览器地址栏attachment_id后面的数字就是你要的东西。

get-attachment-id

然后将下面的代码拷贝到主题的functions.php中

add_action( 'save_post', 'wptuts_save_thumbnail' );

function wptuts_save_thumbnail( $post_id ) {

	// Get Thumbnail
	$post_thumbnail = get_post_meta( $post_id, $key = '_thumbnail_id', $single = true );

	// Verify that post is not a revision
	if ( !wp_is_post_revision( $post_id ) ) {
		// Check if Thumbnail exists
		if ( empty( $post_thumbnail ) ) {
			// Add thumbnail to post
			update_post_meta( $post_id, $meta_key = '_thumbnail_id', $meta_value = '26' );
		}
	}

}

update_post_meta中的meta_value填写默认图片的attachment_id

注意上面的方法只对新建文章有用,当你编辑文章或者从草稿发布文章时,不会自动设置特色图像,如果要在任何时候都管用,再加上下面的代码。

add_action('the_post', 'wptuts_save_thumbnail');
add_action('draft_to_publish', 'wptuts_save_thumbnail');
add_action('new_to_publish', 'wptuts_save_thumbnail');
add_action('pending_to_publish', 'wptuts_save_thumbnail');
add_action('future_to_publish', 'wptuts_save_thumbnail');

方法三:通过filters添加默认图像

这种方法并没有真实的设置特色图像,只是在输出特色图像时,检查一下是否有特色图像,如果没有,就显示默认的。

在主题的functions.php中添加如下代码

add_filter( 'post_thumbnail_html', 'my_post_thumbnail_html' );

function my_post_thumbnail_html( $html ) {

	if ( empty( $html ) )
		$html = '<img src="' .  get_stylesheet_directory_uri() . '/images/default-thumbnail.png' . '" alt="" />';

	return $html;
}

这样默认图像就是你主题的images目录下一张叫做default-thumbnail.png的图像。

使用此方法时要注意

主题中不能使用has_post_thumbnail()检测,否则此法无效。

方法四:最简单的方法

从方法三开始,我们就没有真正的去设置特色图像,只是在特色图像没设置时找个替代的,所以可以使用图片的URL,而且图片不需要上传到媒体库,像方法三中,我们使用了主题目录下的图片。

既然可以放水,那就放的更彻底一点,在主题需要输出特色图像的地方直接这样写

<?php
	if ( has_post_thumbnail() )
		the_post_thumbnail();
	else
		echo '<img src="' . trailingslashit( get_stylesheet_directory_uri() ) . 'images/default-thumbnail.png' . '" alt="" />';
?>

也就是如果有特色图像,显示,没有就显示咱默认指定的。

四种方法对比

  • 前两种方法真实的设置了特色图像,需要写数据库。而后两种方法只是在输出图像时做了些手脚,让主题看起来有特色图像,其实并没有去写数据库。
  • 前两种方法只有用户去编辑文章时才会生效,对旧文章不起作用。后两种方法对任何文章都有用。
  • 如果你想让特色图像与文章相关,第一种方法更合适。
  • 如果你想使用主题的图片甚至一张外部图片,使用方法三或方法四,两种方法都要求对主题进行一定修改。
  • 当你需要更新默认图片时,方法三和方法四只要求你去替换一下主题目录下的图片。这时方法二就显的很笨拙,你需要手动更新数据库信息,或者用ftp去更换那张附件图片。如果不小心删除了那张附件,你就得花点时间到数据库里鼓捣一下了。从灵活性角度考虑,方法三和四更佳。

参考文章

方法二出自 《Quick Tip: Saving a Default Post Thumbnail

方法三和四出自 《How to define a default post thumbnail

17条留言

  1. 站长你好 这些方法我都试了 问题都没解决 模板是D8 4.0
    请问还有什么方法吗
    现在wordpress程序升级了 attachment_id获取不到了
    我其实最想实现的功能是 不同分类目录不同特色图像 特色图像是固定的图片
    还有能用的方法吗

    1. 其实你大可以不用特色图像啊。如果非要用,特色图像只不过是文章的一个cusotm field字段,具有隐藏属性编辑页面看不见罢了。获取不到的原因应该比较容易排查,数据就在数据库表单里,跑不了也错不了,好好确认一下post id和字段名称。

      1. 找到原因了 原因就是模板里的模板设置 未开启缩略图功能 开启后就可以自动获取了 但是能不能实现根据分类目录而判断显示什么特色图像呢 纯自动的 谢谢

  2. 有没有插件直接在发布文章的时候上传一张或在媒体库里选一张图片来做为特色图像呀。

    1. 你是说自动上传?我不是太明白你的意思。

      1. 我的意思是,有没有一个插件在发布文章那个页面给一个上传或在媒体库选择特色图像的功能呀;或者设置默认特色图像;当没有上传或在媒体库选择特色图像时就有默认的,选择或上传了就使用选择的或上传的;这样的话就可以在媒体库建一个文件夹专门放特色图像,特色图像也可以直接调用外部网站的图片等等。。。

        1. 特色图像不支持站外图片。你描述的其它内容默认就支持,除非你主题问题,换个主题试试。

  3. Sola,您好!看了您写得几篇关于特色图像的文章,觉得很赞!您能不能抽空写一篇《如何截取视频图片作为特色图像》的文章?
    我用过一款名叫“DETUBE”的国外wordpress video theme,只要在后台插入YouTube视频,首页就可以截取视频上的默认图片作为特色图像。
    这功能挺实用的,我想知道这是如何实现的,谢谢您!虽然国外已经有插件可以实现这个功能了,比如:Video Thumbnails和Video Thumbnail Auto-Feature,wpforce的作者也写了一篇文章“How to Download a Video Thumbnail and Set as the Featured Image”,但问题的关键是老外写得插件不支持国内像优酷土豆这样的主流视频网站。
    最后,再次表示感谢!

    1. YouTube和国内的土豆优酷不同,YouTube提供了非常完善的API,允许用户获取视频的截图,可以看看这篇文章

      我最近没怎么看过这些视频截图,以前的文章都是通过正则表达式匹配优酷分享到社交网站的图片来实现获取视频截图的。我想如果优酷自己提供API的话,这事就容易多了,搜了下发现youku还真有API,似乎还不太完善http://dev.youku.com/node/43,等API完善了就会有很多获取YOUKU视频截图的WP插件出来了。

      1. 不好意思,回复晚了,前段时间弄了很久都没搞定,放弃了…很感谢你!
        另外,再提醒一下(之前也有几个人提醒过了,嘿嘿),貌似你博客回复邮件通知功能还是有点问题,我gmail邮箱没收到(垃圾箱里也找过了)

        1. 多谢你再次相告,这次我测试了一把,貌似从后台回复就不会发邮件,从文章页面回复的有。呵呵,这个邮件回复功能是很久以前从网上找的代码,现在都不记得到底是咋回事了。
          My bad,对给你造成的麻烦表示抱歉

          1. 回复通知邮件都收到了,谢谢 O(∩_∩)O

        2. 收到就好,多谢你的帮忙和关注

  4. 大哥,“发现我的关键词”这个功能用什么插件实现的呢?

评论功能已关闭