我们使用Typecho主题的时候,经常看见别人的网站会上一篇下一篇调用到别的分类下的文章,这是因为typech博客默认调用是数据库里面的文章前后内容,显然这是不符合实际情况的,如果一个访客在看文章的时候,我们下一篇推荐的是别的分类的,访客可能会因为不喜欢这些内容而离开,因此我们最好能够显示同分类下的上一篇下一篇文章。这个功能其实很多人都需要,我们可以改造Typecho自带的模板函数来实现这个效果,首先我们看Typecho是如何实现上一篇下一篇文章的。
/**
* 显示下一篇
*
* @access public
* @param string $default 如果没有下一篇,显示的默认文字
* @return void
*/
function theNext($widget, $default = NULL)
{
$db = Typecho_Db::get();
$sql = $db->select()->from('table.contents')
->where('table.contents.created > ?', $widget->created)
->where('table.contents.status = ?', 'publish')
->where('table.contents.type = ?', $widget->type)
->where('table.contents.password IS NULL')
->order('table.contents.created', Typecho_Db::SORT_ASC)
->limit(1);
$content = $db->fetchRow($sql);
if ($content) {
$content = $widget->filter($content);
$link = '<a href="' . $content['permalink'] . '" title="' . $content['title'] . '">下一篇</a>';
echo $link;
} else {
echo $default;
}
}
/**
* 显示上一篇
*
* @access public
* @param string $default 如果没有下一篇,显示的默认文字
* @return void
*/
function thePrev($widget, $default = NULL)
{
$db = Typecho_Db::get();
$sql = $db->select()->from('table.contents')
->where('table.contents.created < ?', $widget->created)
->where('table.contents.status = ?', 'publish')
->where('table.contents.type = ?', $widget->type)
->where('table.contents.password IS NULL')
->order('table.contents.created', Typecho_Db::SORT_DESC)
->limit(1);
$content = $db->fetchRow($sql);
if ($content) {
$content = $widget->filter($content);
$link = '<a href="' . $content['permalink'] . '" title="' . $content['title'] . '">上一篇</a>';
echo $link;
} else {
echo $default;
}
}
可以发现Typecho自身也是通过查询数据库得到上一篇下一篇文章的,这里它查询的是所有的文章,并没有按分类去查询,知道了这点以后,我们要实现同分类下的文章查询就很简单了,改造Typecho自带的模板函数只需要两个步骤。
1,先获取当前文章的分类
@$mid=intval($widget->categories[0]['mid']);
2,给模板函数增加查询分类的条件
->join('table.relationships', 'table.contents.cid = table.relationships.cid')
->where('table.relationships.mid = ?', $mid)
这个查询条件可以在模板函数数据库查询的适当位置插入。
就这样就可以实现不改变Typecho原有主题模板的情况下实现同分类上下篇文章的调用了,这里的方法也是来自泽泽大佬的经验,不得不说他对Typecho的研究是很深入的,而且也很愿意分享经验。如果大家又想保留原来的调用效果,可以有两个思路,第一种就是重新写调用上下篇文章的函数,然后修改Typecho模板。第二种就是在模板函数里增加参数,当有传递分类mid的时候,就在数据库查询那里增加分类查询条件,具体怎么实现就看大家实际的需求了。
原创文章,作者:努力的牛奋,如若转载,请注明出处:https://mokev.com/65.html