Typecho随机文章与同分类下随机文章的实现
在Typecho博客系统中,实现 随机文章 展示或者在同一分类下的 随机文章 展示可以极大地丰富用户的阅读体验。下面,我将详细介绍如何在Typecho主题中通过修改functions.php
文件来实现这一功能。
步骤一:创建 自定义 Widget
首先,在主题的functions.php
文件中,我们定义一个名为Widget_Post_Random
的Widget类,用于处理随机文章的逻辑。这个类继承自Widget_Abstract_Contents
,以便利用Typecho的内容查询功能。
class Widget_Post_Random extends Widget_Abstract_Contents
{
public function __construct($request, $response, $params = NULL)
{
parent::__construct($request, $response, $params);
$this->parameter->setDefault(array(
'pageSize' => $this->options->pageSize, // 设置默认文章数量
'mid' => 0, // 默认为随机文章,指定mid则为指定分类下的随机文章
'excludeCid' => 0 // 排除特定文章的CID
));
}
public function execute()
{
$adapterName = $this->db->getAdapterName(); // 判断数据库类型以适配不同的随机函数
$orderBy = ($adapterName == 'pgsql' || strpos($adapterName, 'Pdo_Pgsql') !== false || strpos($adapterName, 'SQLite') !== false) ? 'RANDOM()' : 'RAND()';
$select = $this->select()
->from('table.contents')
->where('table.contents.type = ?', 'post')
->where('table.contents.password IS NULL OR table.contents.password = ""')
->where('table.contents.status = ?', 'publish')
->where('table.contents.cid <> ?', $this->parameter->excludeCid);
if ($this->parameter->mid > 0) {
$select->join('table.relationships', 'table.contents.cid = table.relationships.cid')
->where('table.relationships.mid = ?', $this->parameter->mid);
}
$select->order($orderBy)
->limit($this->parameter->pageSize);
$this->db->fetchAll($select, array($this, 'push'));
}
}
步骤二:在模板中调用 自定义 Widget
接下来,在主题的模板文件中(如sidebar.php
或index.php
),你可以通过调用这个自定义的Widget来显示随机文章或同分类下的随机文章。
<?php
$mid = $this->options->category->mid; // 当前分类的mid,用于同分类随机文章
$excludeCid = $this->cid; // 当前文章的CID,用于排除当前文章
$size = 5; // 随机文章数量
// 调用Widget,并传递参数
$randomPosts = $this->widget('Widget_Post_Random', 'mid=' . $mid . '&pageSize=' . $size . '&excludeCid=' . $excludeCid);
if ($randomPosts->have()):
while ($randomPosts->next()):
?>
<!-- 文章内容开始 -->
<h3><a href="<?php $randomPosts->permalink(); ?>"><?php $randomPosts->title(); ?></a></h3>
<p><?php $randomPosts->excerpt(150, '...'); ?></p>
<!-- 文章内容结束 -->
<?php
endwhile;
endif;
?>