Typecho系统自带的上一篇下一篇文章是不包含缩略图链接的,因为本身显示缩略图就有很多种方式实现,缩略图可以通过附件调用,也可以通过指定文件夹的默认图片调用,也可以自定义字段设置,甚至可以提取文章里面的图片来作为缩略图,平常我们的个人博客使用并没有多大问题,可是对于一些图片资源站来说,上一篇下一篇文章如果不包含缩略图的话,看起来会没有那么美观,因此我们需要完成Typecho获取上一篇和下一篇文章的封面的方法,好在这个方法泽泽已经完成了,陌客也曾经在自己的主题上使用过没有问题,因此就记录下来,方便日后使用。
首先我们需要一个获得缩略图的函数,这里我们可以定义一下:
function showThumbnail($widget)
{
$mr = '默认图片地址';
$attach = $widget->attachments(1)->attachment;
$pattern = '/\<img.*?src\=\"(.*?)\"[^>]*>/i';
if (preg_match_all($pattern, $widget->content, $thumbUrl)) {
echo $thumbUrl[1][0];
} elseif ($attach->isImage) {
echo $attach->url;
} else {
echo $mr;
}
}
然后我们需要修改一下系统自带的获得上一篇下一篇的代码
//下一篇
function theNext($widget)
{
$t = Typecho_Widget::widget('Widget_Archive@1');//@的作用我之前也有讲过,就是用来区分的,这里的$t就是定义的$this
$db = Typecho_Db::get();
$sql = $db->select()->from('table.contents')
->where('table.contents.created > ?', $widget->created)
->where('table.contents.status = ?', 'publish')
->where('table.contents.created <= ?', time())
->where('table.contents.type = ?', $widget->type)
->where('table.contents.password IS NULL')
->order('table.contents.created', Typecho_Db::SORT_ASC)
->limit(1);//sql查询下一篇文章
$db->fetchAll($sql, array($t, 'push'));//这个代码就是如何将查询结果封到$this里的
return $t;//返回变量
}
//上一篇
function thePrev($widget)
{
$t = Typecho_Widget::widget('Widget_Archive@2');//@的作用我之前也有讲过,就是用来区分的,@后面参数随便只要和上边的不一样就行
$db = Typecho_Db::get();
$sql = $db->select()->from('table.contents')
->where('table.contents.created < ?', $widget->created)
->where('table.contents.status = ?', 'publish')
->where('table.contents.created <= ?', time())
->where('table.contents.type = ?', $widget->type)
->where('table.contents.password IS NULL')
->order('table.contents.created', Typecho_Db::SORT_DESC)
->limit(1);//sql查询上一篇文章
$db->fetchAll($sql, array($t, 'push'));
return $t;//返回变量
}
当我们在post.php页面调用上一篇下一篇的时候,可以像下面那样使用
<?php
$prev=thePrev($this);//调用函数并将函数值给变量
$next=theNext($this);//调用函数并将函数值给变量
?>
<?php if($prev->created<$this->created): ?><!--判断上一篇文章是否存在-->
<div class="col-12<?php if($next->created>$this->created){echo ' col-md-6 pr-1';} ?>">
<div class="mb-3"> <a href="<?php $prev->permalink(); ?>" title="<?php $prev->title(); ?>"><div class="overlay"></div> <img src="<?php showThumbnail($prev); ?>" alt="<?php $prev->title(); ?>" class="slimg"><div class="title"><div class="entry-meta"><span><?php $prev->date(); ?></span><span></span></div><h4><?php $prev->title(); ?></h4></div> </a></div>
</div><?php endif; ?>
<!--
讲解一下,$prev=thePrev($this);调用后,$prev->permalink就是上一篇文章的链接,$prev->title就是标题,showThumbnail($prev)就是缩略图,就跟正常调用文章的语法一致,只是$this换成了$prev。
-->
<?php if($next->created>$this->created): ?><!--判断下一篇文章是否存在-->
<div class="col-12<?php if($prev->created<$this->created){echo ' col-md-6 pl-1';} ?>">
<div class="mb-3"> <a href="<?php $next->permalink() ?>" title="<?php $next->title(); ?>"><div class="overlay"></div> <img src="<?php showThumbnail($next); ?>" alt="<?php $next->title(); ?>" class="slimg"><div class="title"><div class="entry-meta"><span><?php $next->date(); ?></span><span></span></div><h4><?php $next->title(); ?></h4></div> </a></div>
</div><?php endif; ?>
考虑到兼容性,有些朋友可能并不想修改系统代码,后续我会更新一下自定义的函数来获取上一篇下一篇文章的缩略图,用来替代系统默认的功能,这样的话就不用担心typecho更新导致功能失效的问题了。
原创文章,作者:努力的牛奋,如若转载,请注明出处:https://mokev.com/8.html