Typecho非插件文章置顶
这次在重写主题时,看到别人有的置顶文章这种功能,于是自己参考 Sticky插件 写了这种方法,添加在自己主题里~
跟 Sticky插件 一样
在 index.php 的 $this->title(); 前面加上 $this->sticky();可出现这段 html.
例: <h2 class="title"><a href="<?php $this->permalink() ?>"><?php $this->sticky(); $this->title() ?></a></h2>
代码放在主题下index.php
中:
/** 文章置顶 */
$sticky = '1'; //置顶的文章id,多个用|隔开
if($sticky){
$sticky_cids = explode('|',$sticky); //分割文本
$sticky_html = "<span style='color:red'>[置顶] </span>"; //置顶标题的 html
$db = Typecho_Db::get();
$pageSize = $this->options->pageSize;
$select1 = $this->select()->where('type = ?', 'post');
$select2 = $this->select()->where('type = ? && status = ? && created < ?', 'post','publish',time());
//清空原有文章的列队
$this->row = [];
$this->stack = [];
$this->length = 0;
$order = '';
foreach($sticky_cids as $i => $cid) {
if($i == 0) $select1->where('cid = ?', $cid);
else $select1->orWhere('cid = ?', $cid);
$order .= " when $cid then $i";
$select2->where('table.contents.cid != ?', $cid); //避免重复
}
if ($order) $select1->order('', "(case cid$order end)"); //置顶文章的顺序 按 $sticky 中 文章ID顺序
if (($this->_currentPage || $this->currentPage) == 1) foreach($db->fetchAll($select1) as $sticky_post){ //首页第一页才显示
$sticky_post['sticky'] = $sticky_html;
$this->push($sticky_post); //压入列队
}
$uid = $this->user->uid; //登录时,显示用户各自的私密文章
if($uid) $select2->orWhere('authorId = ? && status = ?',$uid,'private');
$sticky_posts = $db->fetchAll($select2->order('table.contents.created', Typecho_Db::SORT_DESC)->page($this->_currentPage, $this->parameter->pageSize));
foreach($sticky_posts as $sticky_post) $this->push($sticky_post); //压入列队
$this->setTotal($this->getTotal()-count($sticky_cids)); //置顶文章不计算在所有文章内
}
更新
2021.10.14
- 适配 1.2
2018.2.6
- 登录时,显示用户各自的私密文章
2018.2.7
- 隐藏定时发送的文章
2018.2.27
- 解决重复显示的问题
赏
![](https://moeshin.com/image/reward/Alipay-red.png)
![](https://moeshin.com/image/reward/Alipay.png)
![](https://moeshin.com/image/reward/Alipay-red.png)
支付宝红包
![](https://moeshin.com/image/reward/Alipay.png)
支付宝
![](https://moeshin.com/image/reward/WeChat.png)
微信
回复 @情非得已:
这个问题typecho 开发版3小时前已修复
[...]搜索了一下通过泽泽的那篇文章找到作者(MoeShin)网站发现大佬已经修复了1.2兼容问题下面是全新可用的代码在 index.php 的 $this->title(); 前面加上 $this->sticky();可出现这段 html.[...]
谢谢大佬的代码,1.2遇到问题过来发现已经修复了![](https://moeshin.com/usr/themes/Littlehands/emoji/paopao/6.png)
回复 @coco:
具体修改可以看:https://github.com/moeshin/Typecho-Theme-Littlehands/commit/6f0d9b327786ef4bce407bd810e60f1d21d34221
回复 @coco:
已修改
才发现好像第八行是多余的![](https://www.littlehands.site/usr/themes/Littlehands/emoji/paopao/2.png)
回复 @泽泽:
之前感觉会用到几次![](https://www.littlehands.site/usr/themes/Littlehands/emoji/paopao/49.png)