Typecho非插件实现文章置顶功能

Typecho杂文 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 = '1'; //置顶的文章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);

泽泽的修改记录
2018.2.28

1,昨天和作者沟通,作者说被置顶的文章文章列表里就不会再显示了,这个本来是个挺好的处理方式,但是今天我想到了它有个小问题,就是被置顶文章分类页面或者搜索页面也不会显示出来了,这个就不太好了,于是特此修复下!

2018.2.27

1,置顶的文章只会对首页生效,不会对分类页面生效。
2,文章cid输入方式改为和Sticky插件一样,即在注释部分输入需要置顶文章的cid按照排序输入, 请以半角逗号或空格分隔。

原作者的更新记录
2018.2.6

1,登录时,显示用户各自的私密文章

2018.2.7

1,隐藏定时发送的文章

文章代码转自:https://www.littlehands.site/archives/typecho_sticky.html

文章置顶.png

Comments (22)

    Generic placeholder image
    可乐

    作者,我想问一下,如果我首页有两种样式,我想让第一种样式里的文章置顶该怎么做呢!我这样设置后只有第二种样式里的文章被置顶,第一种样式里的文章无反应!

    Windows7 86天前回复

    Generic placeholder image
    Quanyin

    似乎整合到 function 里更好一些?

    Windows10 113天前回复

    Generic placeholder image
    刘丰源

    路途中

    Windows10 490天前回复

    Generic placeholder image
    True

    步骤二下面代码放在主题下index.php中:这个放的位置没解析呗

    Windows10 499天前回复

      Generic placeholder image
      Jrotty
      @True

      放最上边准没错

      499天前回复

    Generic placeholder image
    九四

    在第三例代码最后多了个符号“`”

    Windows10 513天前回复

      Generic placeholder image
      Jrotty
      @九四

      已修正感谢提醒

      513天前回复

    Generic placeholder image
    fish

    上好了代码, @(玫瑰)

    Windows7 539天前回复

    Generic placeholder image
    梁兴健

    置顶功能很实用 @(滑稽)

    Windows7 541天前回复

      Generic placeholder image
      Jrotty
      @梁兴健

      是啊以前都是用插件的

      Windows10 541天前回复

    Generic placeholder image
    True

    这样还不如插件方便啊。

    Windows10 542天前回复

      Generic placeholder image
      Jrotty
      @True

      都说了可以根据需要关连到模板设置页面,那样就好多了

      安卓奥利奥 542天前回复

        Generic placeholder image
        True
        @Jrotty

        后台设置显示8篇文章,使用置顶就变9个,导致首页变形。怎么解决呢?

        Windows10 499天前回复

          Generic placeholder image
          Jrotty
          @True

          问原作者,原作者文章地址链接在本文底部

          499天前回复

            Generic placeholder image
            True
            @Jrotty

            Windows10 497天前回复

    Generic placeholder image
    True

    逛博中 @(滑稽) 。。。。

    Windows10 542天前回复

      Generic placeholder image
      Jrotty
      @True

      文章更新啦,这次诚意满满

      安卓奥利奥 542天前回复

    Generic placeholder image
    欢子

    路过 @(滑稽)

    Windows10 542天前回复