巧用 WordPress 缩略图

Jan 12th, 2010 Add Comment

wordpress-thumb-trick

WordPress 不仅是博客, 很多时候 WordPress 还被用作为 CMS (内容管理系统). 博主们喜欢为每个文章加上统一大小的缩略图, 尤其是信息类平台. 其中比较常用的处理办法是用 custom field 向文章插入图片, 通过上传大小一致的小图或者使用 phpThumb 等工具生成缩略图.

2.7 开始, WordPress 大幅提升多媒体功能, 越来越多人使用 WP 的内置图片仓库. 对这些用户来说, 制作缩略图变得并不那么困难, 在上传图片的时候就会默认生成 150x150 规格的小图 (如果图片高度/宽度不足 150px, 使用原高度/宽度). 那我们可以充分利用这个功能, 在文章列表上加上这个图片作为缩略图. 这样处理各有利弊, 好处是简单, 智能 (不用每次输入缩略图), 坏处是消耗服务器流量.

Okay, 现在要做的就是提取上传生成的小图片, 并放置在文章的适当位置. 我创建了一个文件 thumb.php, 图片获取和调用一起处理, 文件内容如下.

<?php
	$args = array(
		'post_parent' => $post->ID,
		'post_type' => 'attachment',
		'post_mime_type' => 'image'
	);
 
	$images = &get_children( 'post_type=attachment&post_mime_type=image&post_parent=' . $post->ID );
	$imageUrl = '';
 
	if ($images) {
		$image = array_pop($images);
		$imageSrc = wp_get_attachment_image_src($image->ID);
		$imageUrl = $imageSrc[0];
	}else{
		$imageUrl = get_bloginfo('template_url') . '/img/default.gif';
	}
?>
<a href="<?php the_permalink() ?>"><img class="left" src="<?php echo $imageUrl; ?>" alt="<?php the_title(); ?>" width="150" height="150" /></a>

这段代码会去找第一个上传的图片缩略图 (如果第一个图片被删除, 则找第二个的, 如此类推...), 如果找不到任何上传图片则使用默认图片. 代码中用到 get_children 和 wp_get_attachment_image_src 两个方法, 可以参考下面两个文章.
WordPress Codex - get children
WordPress Codex - wp get attachment image src

然后在文章列表 index.php, 存档页面 archive.php 和搜索页面 search.php 中调用, 调用代码如下.

<?php include('thumb.php'); the_content('Read More...'); ?>

这段代码是把图片放在文章内容前面, 图片如何摆放需要用 CSS 调整一下布局, 这里就不多说了.

最后我两留两个问题给同学们.

1. 如果图片高度或者宽度不足 150px, 这样做必然将图片拉伸, 很不美观. 用什么办法可以让图片都显示为 150x150, 并居中显示? 提示: 可以用 CSS 实现, 类似方法可以在 Elegant Box 主题中找到.
(答案请看文章《用 CSS 背景属性代替图片 SRC》)

2. 在文章列表中, 我们只希望看到缩略图, 而屏蔽其他所有图片, 除了使用文章摘要去除所有标签样式, 是否有其他方法可以做到?
(答案请看 #16 楼吓我一跳的评论)

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: 巧用 WordPress 缩略图

  1. http://0.gravatar.com/avatar/465fdaecfcb2e965202e95fcf411dc66?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我试了一下,发现上传的图片可以,外链图片不可以,是这样吗?

  2. http://1.gravatar.com/avatar/16d5d83b2db85e649f415490ad4acf98?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这个真是好,先看看再说啊

  3. http://0.gravatar.com/avatar/2ea37ed4ea682a6c2f54d07a2608acca?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  4. http://0.gravatar.com/avatar/45887ed2edf49a0239ab419edd848c96?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    正在为缩略图发愁呢,代码又不会编 。晕。。。

  5. http://1.gravatar.com/avatar/f45f58c2775066975603e095f36811e0?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Android 美国主机好像都这个速度啊,我这里ping是275ms。难道你有更好的美国主机?
    PS:博主的主机哪里买的?

  6. http://1.gravatar.com/avatar/57815eac1ed3b37159ad3832c39f0ba3?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    MG12同学的主机在(mt)么?南宁网通这里访问有点慢呢,352MS,还丢失了1个!

  7. http://0.gravatar.com/avatar/4c4d3e5ee424ec698c9441fef78dd013?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @isaac 抱歉,可能问题问得有些“离题”了 :razz:

  8. http://0.gravatar.com/avatar/4c4d3e5ee424ec698c9441fef78dd013?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    博主你好:

    1、请教一下文章中嵌入代码框是如何实现的?
    2、另外这个留言簿用的是什么插件呢?

    先谢谢了! ;-)

  9. http://1.gravatar.com/avatar/30d41ecc5ecf0db83f3dceb26248e6cf?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我想知道怎么才能调整生成缩略图的质量!!!

  10. http://0.gravatar.com/avatar/647996a150f378993f9422753bfa20b4?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @bolo 呵呵,好吧,问题又绕回去了,谢谢你的回复,我再研究研究。

  11. http://0.gravatar.com/avatar/2a9c4f525050372a6fe0b10ce4fe8957?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @95daba
    对插件进行改造

  12. http://0.gravatar.com/avatar/647996a150f378993f9422753bfa20b4?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @bolo 恩,我已经为每张大图做好了缩略图,已经转换了。现在问题是,有没有什么办法,能让读者用手机阅读 wap 站里的文章时,文章里的图自动替换为对应的缩略图?

  13. http://0.gravatar.com/avatar/2a9c4f525050372a6fe0b10ce4fe8957?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @95daba
    要减小图片的体积只能对图片进行转换了

  14. http://0.gravatar.com/avatar/647996a150f378993f9422753bfa20b4?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @bolo 恩,谢谢您的回复。我再查查gd库的资料看看,对php还真不熟:)不知道还有没有其他简单点的方法?

  15. http://0.gravatar.com/avatar/2a9c4f525050372a6fe0b10ce4fe8957?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @95daba
    可以自己写个程序,用php的gd库转换图片

  16. http://0.gravatar.com/avatar/647996a150f378993f9422753bfa20b4?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    您好,我有一个问题想请教一下:

    我利用wp-t-wap插件做了一个wap的站点,但是文章里的图片大小还是跟原来网页里的一样。这样对手机浏览用户来说,很耗流量。 假设我已经为每一张图做好了缩略图,有没有什么办法,将一篇文章里所有图片都替换成对应的缩略图?

    这样,读者如果去网站看到的是正常大小的图,用手机浏览文章的时候看到的是缩略图。

    谢谢您!

  17. http://1.gravatar.com/avatar/9d9477ecc62b02e1462344209df591c6?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @疾风
    看这个http://www.neoease.com/wordpress-thumb-trick/#comment-23398

  18. http://1.gravatar.com/avatar/53ac5e73cc4436c21bc5364bb95aac49?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    假如有篇文章有很多图片,那他会给每张图片都生成缩略图的,这样太浪费空间了……

    有没有好的解决办法呢?

    比如只给第一张图片生成缩略图?

  19. http://1.gravatar.com/avatar/97fa73f74e8203834201a8d0fbf5940c?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  20. http://1.gravatar.com/avatar/70dcb9fcfd6f84dcf5431a4f6e1ec89b?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不错主题,偶正在用,谢谢分享!

  21. http://1.gravatar.com/avatar/9ec2b51210687ae510ff61822aea6813?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    very good
    thank you
    不错,不过我看到了一个更加好的方法

  22. http://1.gravatar.com/avatar/ffa9ac42c56fd4776ccef37c57664965?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    消耗流量不能说是坏处吧,喜欢放图的就要舍得流量哦

  23. http://0.gravatar.com/avatar/0184be6025088ca575f080f23ad6b544?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    没什么图片上传,没什么图片给它锁

  24. http://0.gravatar.com/avatar/ae7a4ac8e7c6dab83d77793d15e58a98?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    很好的一个方法!

  25. http://1.gravatar.com/avatar/5ffa33012aa20149a67c5b91d6076cfa?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这个我现在用不着,先收藏了。

  26. http://1.gravatar.com/avatar/1a41331cf3d01fa90a027e1946b38183?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    MG12你好,我现在使用的EasyDigg插件,侧边栏的Widget小工具不能设置,包括侧边标题也改不了,是不是EasyDigg插件没有更新到对应wp2.9.1的原因呢?

  27. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @bolo
    头发没干, 夜深人静时适合看书写文.

    @励志名言
    哈~ 不是出来了嘛.

    @underone
    缩略图可以用一个 PHP 自动生成.

    @fatkun
    不会做的听下回分享.

    @Jutoy
    嗯... CMS 用 joomla 和 drupal 都比 wordpress 好 (我看中它们有购物车功能), 但是那个折腾起来也比较耗时. 简单的这个可以了.

    @buzz
    其实要做, 也可以挖外网的图, 就写一个类来爬图片和生成缩略图而已. 但是本文是讨论 WordPress 的图片仓库中的缩略图.
    另外, default image 的方法不是笨, 有图片显得更加归整. 如果像 cnBeta 那样的结构, 时而有图, 时而无图显得很丑. 当然, 如果文章内容本来就多, 那么缩略图就可有可无了.

    @吓我一跳
    差不多, 但是不应该用 $content = apply_filters('the_content', $content);
    这样的话, 独立文章中的图片也会被去掉.

    @bolo
    问题1. 这样可以, 但我不是这样做的. 下次我讲讲我的处理办法.
    问题2. 见 @吓我一跳 的解答.

    @行骏
    哦耶~ 什么时候我也在茶话会上分享一下.

  28. http://0.gravatar.com/avatar/eefde0b28ef0c51408b6d3039e99117a?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    真的和羡慕你的学习和分享精神!

  29. http://0.gravatar.com/avatar/092dccc7f8d5e916ed58a1fb1d906a9e?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    没看懂

  30. http://0.gravatar.com/avatar/2a9c4f525050372a6fe0b10ce4fe8957?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    问题1,为a设置width和height都为150px,line-height:150px;text-align:center;img标签不设置width和height
    问题2,方法很多,可以建立正则过滤content里除第一个img标签以外的img标签

  31. http://1.gravatar.com/avatar/3f3ce932b48bb69f9e28f85edd87afab?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我都是手工自行引用图片的,一时这些智能的程序有时会导致图片移位等不满意的情况出现,二是自己实在蠢,不懂利用这些功能。

  32. http://0.gravatar.com/avatar/e9e03e27bace17f0b8f333df850efbab?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    没有我现在用的好
    直接php截取出文章的第一个图片,哈哈

  33. http://0.gravatar.com/avatar/8cd2bb9bdb65b5f6b9af31fa963ba304?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    太有难度了,有完整的就好了。 :oops:

  34. http://1.gravatar.com/avatar/9d9477ecc62b02e1462344209df591c6?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    第二个问题的代码或许是这样的,没有测试到底能不能用
    <?php
    include('thumb.php');
    $content = apply_filters('the_content', $content);
    $content = preg_replace(“/<img[^>]+\>/i”, “”, $content);
    ?>

  35. http://1.gravatar.com/avatar/9d9477ecc62b02e1462344209df591c6?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    问题1是不是使用 img 先设定好高度和宽度,然后再background-position:center呢?

  36. http://1.gravatar.com/avatar/9d9477ecc62b02e1462344209df591c6?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    先读取thumbnail然后正则替换将the_content里面的<img>标签替换为空

  37. http://1.gravatar.com/avatar/5f1f4360cc274199d5a427be7605967b?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    'attachment',
    'numberposts' => -1,
    'post_status' => null,
    'post_parent' => $post->ID,
    'orderby' => 'rand'
    );
    $attachments = get_posts($args);
    $noimages = count($attachments);

    if ($attachments) {
    foreach ($attachments as $attachment) {
    $alttxt = $attachment->post_title;
    $imgid = $attachment->ID;
    $fileurl = $attachment->guid;

    $meta = wp_get_attachment_metadata($imgid);
    $imgw = $meta['sizes']['thumbnail']['width'];
    $imgh = $meta['sizes']['thumbnail']['height'];

    $imgext = substr($fileurl, -4);
    $fileurl = substr($fileurl, 0, -4);
    $fileurl = $fileurl."-".$imgw."x".$imgh.$imgext;
    $link = get_permalink();

    // construct the image
    echo "";
    break;
    }
    }
    the_excerpt('');

    } else {
    the_content('...'.get_the_title());
    }
    ?>

  38. http://1.gravatar.com/avatar/5f1f4360cc274199d5a427be7605967b?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这个缩略图的生成方法我找过很多,没有很完美的。
    1.用timthumb ,能抓外站的图,但是要生成缩略图缓存文件。
    2.自动掘文章的图出来,但是只限于本站的图片;如果图片为了减少流量而放在flickr 之类的外站就不行了。
    而且你的方法中的default image 实在是很笨的方法。没有图就不显示就好了。
    3.Wordpress 2.9 出了个post-thumbnail,这个值得挖掘一下。

  39. http://1.gravatar.com/avatar/78b0fd25b4aadfa50d9dde0ba2cc5d50?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    嗯,最近就正在用WP帮学生会搞一个小CMS

  40. http://0.gravatar.com/avatar/6ddc697872837ce41e883869fbafd018?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  41. http://0.gravatar.com/avatar/6ae83ef4bfaa6f98356a5187b6f171f6?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不过我觉得图片多了速度肯定受影响。。。所以现在加的图片很少了。。。 :grin:

  42. http://1.gravatar.com/avatar/b2986defdd28dcaa196e317a94d82e31?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我图片都是用外链。。。这个没自动生成的缩略图。。。。
    这个和直接用正则式查找图片有什么区别吗?仅仅是这个得到的是缩略的图片(更小?)。。吗?

  43. http://1.gravatar.com/avatar/58be12971823af5c6520597bd6d3a552?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    留下的题目不会做耶....

  44. http://0.gravatar.com/avatar/e8f87528ed0a0eaba60009f8580df401?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    干脆再升级一下算啦,如果post使用外链图片,自动扒到本地再生成缩略图:)
    要是缩略图插件也用上mg12的,我的blog就完美了...

  45. http://0.gravatar.com/avatar/2682ee2babff6891a2d95c1cde2354c6?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    两个问题值得研究一下~~~

  46. http://1.gravatar.com/avatar/94edba5ccaf4f54d0891cf3a7b1e1280?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    你留下的思考题我得做做。

  47. http://1.gravatar.com/avatar/1f674a9267c9d51cb930b9698dc557fb?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不用像那些插件重新生成一个文件啊! 以前用的插件会生成文件的呢.

  48. http://1.gravatar.com/avatar/10d22ccf8ec26e3ee4013b563714b68d?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    板凳 貌似评论提交不上去

  49. http://0.gravatar.com/avatar/2a9c4f525050372a6fe0b10ce4fe8957?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    Sign,深夜更新,不小心看到了。
    有空我再来看一次,如果没有人答中问题我就发答案。
    PS:答中问题有奖吗?

  1. Loading...