typecho默认的缩略图功能是贫穷的,只有区区一个名为img的字段显示而已,如果这个字段的内容是空白的,那你发布的文章在首页就不会显示缩略图,既$this->fields->img为空。
一般情况下,我们通过上传附件插入图片,程序会自动把图片地址加入到img字段中,但总有一些是例外的。
没有缩略图,对于首页的布局是难看的(至少我是这么认为的),所以我要改:
/**
* 输出文章缩略图(
* 显示顺序:小图(自定义字段) > 文章内插图(可指定第几张) > 随机图片
*/
function showThumbnail($widget,$imgnum='',$show=true){
//获取两个参数,文章的ID和需要显示第几张的图片,第三个参数控制输出方式
$thumb = '';
$rand = rand(1,10);
$random = $widget->widget('Widget_Options')->themeUrl . '/rand/' . $rand . '.jpg';
$attach = $widget->attachments(1)->attachment;
$pattern = '/\<img.*?src\=\"(.*?)\"[^>]*>/i'; //#1
$patternMD = '/\!\[.*?\]\((http(s)?:\/\/.*?(jpg|png))/i'; //#2
$patternMDfoot = '/\[.*?\]:\s*(http(s)?:\/\/.*?(jpg|png))/i'; //#3
if (empty($imgnum)) {
if (!empty($widget->fields->img)){
$thumb = $widget->fields->img;
}
//搜索图片的第一个附件
else if ($attach && $attach->isImage) {
$thumb = $attach->url;
}
else {
$imgnum = 0;
}
}
//如果文章内有插图,则调用插图
if (preg_match_all($pattern, $widget->content, $thumbUrl) && empty($thumb)) {
$thumb = $thumbUrl[1][$imgnum].'#1';
}
//搜索内联式markdown格式的图片
else if (preg_match_all($patternMD, $widget->content, $thumbUrl) && empty($thumb)) {
$thumb = $thumbUrl[1][$imgnum].'#2';
}
//搜索脚注式markdown格式的图片
else if (preg_match_all($patternMDfoot, $widget->content, $thumbUrl) && empty($thumb)) {
$thumb = $thumbUrl[1][$imgnum].'#3';
}
//如果真的没有图片,就调用一张随机图片
$thumb = empty($thumb) ? $random : $thumb;
if($show){
echo $thumb;
}
else{
return $thumb;
}
}
函数有三种调用方式:
(此处省略一万个草尼玛,该死的防火墙把我之前写的内容给拦截了,这是重写的)
- <?php showThumbnail($this); ?> 优先调用原有$this->fields->img图片链接,然后是附件图片,再是以下。
- <?php showThumbnail($this,0); ?> 优先搜索文章内插图,0表示第一张,然后再是以上。
- showThumbnail($this,null,false) 这个是用于赋值用的,例如:
<?php echo '<img src=".showThumbnail($this,null,false).">' ?>
当在img字段,文章附件,文章内,都搜索不到图片时,会用主题目录下rand目录中1.jpg~10.jpg代替。