Mr.Asong 写过一个缩略图插件,不过有一些功能不适合我,比如随机图片,所以自己便练习着用 functions.php 写了个缩略图功能,集成了 timthumb 生成缓存缩略图,而非缩小放大图片。

目前有一个不足的地方,就是 timthumb 无法实现外链图片缓存缩略图,只能调整大小,不过附件图片可以。我十足的菜鸟呀,还请高手指点这里一下。实现效果是先读取附件图片,如果没有则读取文章里的图片,否则输出分类的默认图片。

一、编辑 functions.php 文件

在其中加入以下代码:

/**
* 输出文章缩略图
*
* @author ShingChi
* @access public
* @param int $width 缩略图宽度
* @param int $height 缩略图高度
* @return viod
* @version Release 1.0.4
*/
function getThumbnail($widget, $width, $height)
{
$options = $widget->widget('Widget_Options');

/** 默认图片目录、后缀 */
$path = $options->themeUrl . '/images/category/'; // 路径:模板文件夹/images/category/图片为分类缩略名
$suffix = '.jpg';

/** 文章相关 */
$cid = $widget->cid;
$title = $widget->title;
$content = $widget->text;
$category = $widget->category;
$link = $widget->permalink;

$db = Typecho_Db::get();
$sql = $db->select('text')
->from('table.contents')
->where('type = ? AND parent = ?', 'attachment', $cid)
->limit(1);
$attach = $db->fetchRow($sql);

if (empty($attach)) { // 没有附件时从文章内容读取
$pattern = '/\<img.*?src\=\"(.*?)\"[^>]*>/i'; // 匹配文章内容中的图片

if (preg_match_all($pattern, $content, $thumbUrl)) {
echo '<a href="' . $link . '"><img src="' . $thumbUrl[1][0] . '" width="' . $width . '" height="' . $height . '" alt="' . $title . '" /></a>';
} else {
echo '<a href="' . $link . '"><img src="' . $path . $category . $suffix . '" width="' . $width . '" height="' . $height . '" alt="' . $title . '" ></a>';
}
} else { // 从附件中读取
$attachText = unserialize($attach['text']);
$isImage = '/gif|jpg|jpeg|bmp|png/i'; // 匹配图片附件类型

if (preg_match($isImage, $attachText['type'])) {
echo '<a href="' . $link . '"><img src="' . $options->themeUrl . '/timthumb.php?src=' . $options->siteUrl . $attachText['path'] . '&q=100&w=' . $width . '&h=' . $height . '" alt="' . $title . '" /></a>';
} else {
echo '<a href="' . $link . '"><img src="' . $path . $category . $suffix . '" width="' . $width . '" height="' . $height . '" alt="' . $title . '" ></a>';
}
}
}

二、使用缩略图

  1. http://code.google.com/p/timthumb 下载 timthumb.php 单文件,上传到当前模板目录下。
  2. 在当前模板的图片目录里新建一个 category 的文件夹,把所有分类的缩略图放在里面,图片命名为分类缩略名,后缀为 jpg,当然可以根据上面代码更改。
  3. 在需要输出缩略图的地方插入以下代码,如我要输出宽和高100px的缩略图:

    <?php getThumbnail($this, 100, 100); ?>