幻蓝小站

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 16|回复: 0

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

[复制链接]

5317

主题

5318

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
15994
幻蓝 发表于 2022-11-16 18:47:46
在制作Typecho主题时,有的时候会想弄个随机推荐文章的功能,所以我就简单弄了个函数,可以随机输出n篇文章,同时追加一些参数还可以输出当前文章分类下的随机文章,具体如下:

函数部分
在主题functions.php文件中添加如下函数。
  1. class Widget_Post_tongleisuiji extends Widget_Abstract_Contents
  2. {
  3.     public function __construct($request, $response, $params = NULL)
  4.     {
  5.         parent::__construct($request, $response, $params);
  6.         $this->parameter->setDefault(array('pageSize' => $this->options->commentsListSize, 'parentId' => 0, 'ignoreAuthor' => false));
  7.     }
  8.     public function execute()
  9.     {
  10.     $adapterName = $this->db->getAdapterName();//兼容非MySQL数据库
  11.     if($adapterName == 'pgsql' || $adapterName == 'Pdo_Pgsql' || $adapterName == 'Pdo_SQLite' || $adapterName == 'SQLite'){
  12.         $order_by = 'RANDOM()';
  13.     }else{
  14.         $order_by = 'RAND()';
  15.     }   
  16. $select  = $this->select()->from('table.contents')
  17. ->join('table.relationships', 'table.contents.cid = table.relationships.cid');
  18. if($this->parameter->mid>0){
  19. $select->where('table.relationships.mid = ?', $this->parameter->mid);
  20. }
  21. $select->where('table.contents.cid <> ?', $this->parameter->cid)
  22. ->where("table.contents.password IS NULL OR table.contents.password = ''")
  23. ->where('table.contents.type = ?', 'post')
  24. ->limit($this->parameter->pageSize)
  25. ->order($order_by);
  26. $this->db->fetchAll($select, array($this, 'push'));
  27.     }
  28. }
复制代码
调用输出
在主题需要的地方调用如下内容即可随机输出多篇文章,样式需要自行美化。
  1. <?php
  2. $mid='';//此参数为空时为随机文章,为分类mid时则为当前分类下的随机文章
  3. $cid=0;//此参数填写当前文章的cid即可在随机文章时不输出当前文章
  4. $size=5;//随机输出文章的数量
  5. $this->widget('[email protected]', 'mid='.$mid.'&pageSize='.$size.'&cid='.$cid)->to($to);?>
  6. <?php if($to->have()): ?>
  7. <?php while($to->next()): ?>
  8. <!--文章内容开始-->
  9. <?php $to->title(); ?>
  10. <?php $to->excerpt(150, '...'); ?>
  11. <?php $to->permalink() ?>
  12. <!--文章内容结束-->
  13. <?php endwhile; ?>
  14. <?php endif; ?>
复制代码
拓展内容
在文章页面下,调用这个函数时可以这样填写参数
  1. $cid=$this->cid;//这样设置下cid,随机推荐文章时就不会与当前文章重复了
  2. $mid=$this->categories[0]['mid'];//这样设置函数即可获得文章的第一个分类,然后随机输出这个分类下的文章
  3. $size=5;
复制代码
有的时候我们其他页面和文章页面都是在同一处输出随机文章,此时我们就可以使用if判断来为不同页面输入不同参数,如
  1. $mid='';
  2. $cid=0;
  3. $size=5;
  4. if ($this->is('post')){
  5. $cid=$this->cid;
  6. $mid=$this->categories[0]['mid'];
  7. $size=5;
  8. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|幻蓝小站 ( 黔ICP备18008076号-1 )|网站地图

GMT+8, 2022-11-30 09:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表