April 11
Typecho非插件实现文章置顶功能
其实在写themia模板时,就用了个非插件的文章置顶功能,然而那个代码不能置顶文章内容,只能置顶标题,而且代码比较繁琐。
而后最近看到隔壁友链写了个《Typecho非插件文章置顶》,于是我对此进行了转载并做了点修改弥补一些需求!
他是根据 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 = '2463'; //置顶的文章cid,按照排序输入, 请以半角逗号或空格分隔
if($sticky && $this->is('index') || $this->is('front')){
$sticky_cids = explode(',', strtr($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(null,"(case cid$order end)"); //置顶文章的顺序 按 $sticky 中 文章ID顺序
if ($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)); //置顶文章不计算在所有文章内
}
这个东西输入文字cid整合到模板设置里,想必也是极好的!!!那么如何做呢?
上文中$sticky = '1';
改为$sticky = $this->options->sticky;
,然后在functions.php
中添加如下代码即可
$sticky = new Typecho_Widget_Helper_Form_Element_Text('sticky', NULL,NULL, _t('文章置顶'), _t('置顶的文章cid,按照排序输入, 请以半角逗号或空格分隔'));
$form->addInput($sticky);
文章代码转自:https://www.littlehands.site/archives/typecho_sticky.html
作者:https://qqdie.com/archives/typecho_sticky.html
:D 少女祈祷中...