在制作Typecho主题时,有的时候会想弄个随机推荐文章的功能,所以我就简单弄了个函数,可以随机输出n篇文章,同时追加一些参数还可以输出当前文章分类下的随机文章,具体如下: 函数部分
在主题functions.php
文件中添加如下函数。
class Widget_Post_tongleisuiji extends Widget_Abstract_Contents
{
public function __construct($request, $response, $params = NULL)
{
parent::__construct($request, $response, $params);
$this->parameter->setDefault(array('pageSize' => $this->options->commentsListSize, 'parentId' => 0, 'ignoreAuthor' => false));
}
public function execute()
{
$adapterName = $this->db->getAdapterName();//兼容非MySQL数据库
if($adapterName == 'pgsql' || $adapterName == 'Pdo_Pgsql' || $adapterName == 'Pdo_SQLite' || $adapterName == 'SQLite'){
$order_by = 'RANDOM()';
}else{
$order_by = 'RAND()';
}
$select = $this->select()->from('table.contents')
->join('table.relationships', 'table.contents.cid = table.relationships.cid');
if($this->parameter->mid>0){
$select->where('table.relationships.mid = ?', $this->parameter->mid);
}
$select->where('table.contents.cid <> ?', $this->parameter->cid)
->where("table.contents.password IS NULL OR table.contents.password = ''")
->where('table.contents.type = ?', 'post')
->limit($this->parameter->pageSize)
->order($order_by);
$this->db->fetchAll($select, array($this, 'push'));
}
}
调用输出
在主题需要的地方调用如下内容即可随机输出多篇文章,样式需要自行美化。
代码语言:javascript复制widget('Widget_Post_tongleisuiji@suiji', 'mid='.$mid.'&pageSize='.$size.'&cid='.$cid)->to($to);?>
have()): ?>
next()): ?>
title(); ?>
excerpt(150, '...'); ?>
permalink() ?>
拓展内容
在文章页面下,调用这个函数时可以这样填写参数
代码语言:javascript复制$cid=$this->cid;//这样设置下cid,随机推荐文章时就不会与当前文章重复了
$mid=$this->categories[0]['mid'];//这样设置函数即可获得文章的第一个分类,然后随机输出这个分类下的文章
$size=5;
有的时候我们其他页面和文章页面都是在同一处输出随机文章,此时我们就可以使用if
判断来为不同页面输入不同参数,如
$mid='';
$cid=0;
$size=5;
if ($this->is('post')){
$cid=$this->cid;
$mid=$this->categories[0]['mid'];
$size=5;
}
linkCard('.post-content','0');