巧用 WordPress 缩略图

wordpress-thumb-trick

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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 中调用, 调用代码如下.

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

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

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

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

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

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: 巧用 WordPress 缩略图
  1. bolo | #1
    Jan 12th, 2010 at 02:41

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

  2. 励志名言 | #2
    Jan 12th, 2010 at 04:16

    板凳 貌似评论提交不上去

  3. ranel | #3
    Jan 12th, 2010 at 08:20

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

  4. 园子 | #4
    Jan 12th, 2010 at 09:02

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

  5. 忘记月亮 | #5
    Jan 12th, 2010 at 09:13

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

  6. underone | #6
    Jan 12th, 2010 at 09:22

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

  7. fatkun | #7
    Jan 12th, 2010 at 10:51

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

  8. QiQiBoY | #8
    Jan 12th, 2010 at 11:34

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

  9. Zenoven自由人 | #9
    Jan 12th, 2010 at 11:49

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

  10. 小雅有鱼 | #10
    Jan 12th, 2010 at 12:23

    好难啊。 :twisted:

  11. Jutoy | #11
    Jan 12th, 2010 at 12:31

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

  12. buzz | #12
    Jan 12th, 2010 at 13:50

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

  13. buzz | #13
    Jan 12th, 2010 at 13:53

    '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());
    }
    ?>

  14. 吓我一跳 | #14
    Jan 12th, 2010 at 16:40

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

  15. 吓我一跳 | #15
    Jan 12th, 2010 at 16:42

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

  16. 吓我一跳 | #16
    Jan 12th, 2010 at 16:49

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

  17. happyet | #17
    Jan 12th, 2010 at 17:36

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

  18. Showfom | #18
    Jan 12th, 2010 at 17:39

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

  19. 臻臻 | #19
    Jan 12th, 2010 at 19:04

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

  20. bolo | #20
    Jan 12th, 2010 at 21:10

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

  21. cshappylove | #21
    Jan 12th, 2010 at 22:26

    没看懂

  22. 行骏 | #22
    Jan 12th, 2010 at 23:21

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

  23. mg12 | #23
    Jan 13th, 2010 at 00:09

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

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

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

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

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

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

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

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

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

  24. 麦小芽 | #24
    Jan 13th, 2010 at 09:22

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

  25. 少杰 | #25
    Jan 13th, 2010 at 15:11

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

  26. 老驴 | #26
    Jan 13th, 2010 at 16:33

    很好的一个方法!

  27. 江流 | #27
    Jan 13th, 2010 at 19:48

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

  28. 羽中 | #28
    Jan 16th, 2010 at 15:45

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

  29. vela | #29
    Jan 17th, 2010 at 15:13

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

  30. LR赚刀刀 | #30
    Jan 20th, 2010 at 23:06

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

  31. 新鲜发现 | #31
    Jan 22nd, 2010 at 11:55

    收藏了

  32. 疾风 | #32
    Jan 29th, 2010 at 14:37

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

    有没有好的解决办法呢?

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

  33. 吓我一跳 | #33
    Jan 29th, 2010 at 15:01

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

  1. 用 CSS 背景属性代替图片 SRC
    Jan 19th, 2010 at 01:21

Twitter Email feed
RSS feed