Typecho随机文章与同分类下随机文章的实现

2023-04-17 14:37:03 浏览数 (3)

在制作Typecho主题时,有的时候会想弄个随机推荐文章的功能,所以我就简单弄了个函数,可以随机输出n篇文章,同时追加一些参数还可以输出当前文章分类下的随机文章,具体如下: 函数部分

在主题functions.php文件中添加如下函数。

代码语言:javascript复制
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判断来为不同页面输入不同参数,如

代码语言:javascript复制
$mid='';
$cid=0;
$size=5;
if ($this->is('post')){
$cid=$this->cid;
$mid=$this->categories[0]['mid'];
$size=5;
}

linkCard('.post-content','0');

0 人点赞