Typecho按需求输出缩略图

通过自定义函数,按优先级顺序自动为 Typecho 文章生成缩略图:自定义字段 → 第一个图片附件 → 文章第一张图片 → 随机图片。

介绍

在 Typecho 主题开发中,文章列表页经常需要展示缩略图。手动为每篇文章设置封面图太繁琐,而完全随机又缺乏关联性。这篇文章分享一个按优先级自动输出缩略图的方法。

优先级顺序为:

  • thumb 自定义字段(手动指定的优先级最高)
  • 第一个图片附件
  • 文章正文第一张图片
  • 随机图片兜底
来源:友人C

实现方法

第一步:在 function.php 中添加函数

function showThumbnail($widget)
{
    $rand = rand(1,7); // 随机 1-7 张缩略图
    $random = $widget->widget('Widget_Options')->themeUrl . '/images/sj/' . $rand . '.jpg';
    $attach = $widget->attachments(1)->attachment;
    $pattern = '/\<img.*?src\=\"(.*?)\"[^>]*>/i';
    $patternMD = '/\!\[.*?\]\((http(s)?:\/\/.*?(jpg|png))/i';
    $patternMDfoot = '/\[.*?\]:\s*(http(s)?:\/\/.*?(jpg|png))/i';

    if ($attach && $attach->isImage) {
        $ctu = $attach->url;
    } else if (preg_match_all($pattern, $widget->content, $thumbUrl)) {
        $ctu = $thumbUrl[1][0];
    } else if (preg_match_all($patternMD, $widget->content, $thumbUrl)) {
        $ctu = $thumbUrl[1][0];
    } else if (preg_match_all($patternMDfoot, $widget->content, $thumbUrl)) {
        $ctu = $thumbUrl[1][0];
    } else {
        $ctu = $random;
    }
    return $ctu;
}

这段代码的逻辑是:先尝试获取第一个图片附件的 URL,如果文章没有附件则用正则匹配正文中的第一张图片(同时支持 HTML img 标签和 Markdown 两种图片格式),最后都没有的话就随机输出一张预设图片。


第二步:在 index.php 中调用

<?php if (array_key_exists('thumb', unserialize($this->___fields()))): ?>
    <div class="index-post-thumb">
        <a class="index-post-cover" href="<?php $this->permalink() ?>">
            <img class="thumb" src="<?php echo $this->fields->thumb;?>">
        </a>
    </div>
<?php else : ?>
    <?php $thumb = showThumbnail($this); if(!empty($thumb)):?>
        <div class="index-post-thumb">
            <a class="index-post-cover" href="<?php $this->permalink() ?>">
                <img class="thumb" src="<?php echo $thumb;?>">
            </a>
        </div>
    <?php endif; ?>
<?php endif; ?>

要点说明

  • array_key_exists('thumb', unserialize($this->___fields())) 用于判断文章是否设置了 thumb 自定义字段,有的话优先使用
  • 正则同时支持 HTML <img> 标签和 Markdown ![]() 两种格式的图片匹配
  • 随机图片放在主题目录下的 /images/sj/ 文件夹,以数字命名(1.jpg ~ 7.jpg)
  • 这段代码来自 Themia 主题,思路清晰实用

添加新评论