Typecho

Typecho1.2最新非插件文章置顶功能代码

by Intern, 2021-10-27


在进行Elise 1.5版本制作的时候发现文章置顶代码用不了会报错

Typecho\Db\Query::order(): Argument #1 ($orderBy) must be of type string, null given

搜索了一下通过(泽泽)的那篇文章找到作者(MoeShin)网站发现大佬已经修复了1.2兼容问题

2021-10-27T08:56:00.png

下面是全新可用的代码

在 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); //压入列队
    }
    if($this->user->hasLogin()){
    $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)); //置顶文章不计算在所有文章内
}

原文地址:https://moeshin.com/archives/typecho_sticky.html
简直完美感谢大佬的分享

2021.10.28

  • 修复如果有私密文章未登录状态下会报错
Intern

作者: Intern

7 条评论
    Meteor 回复
    Meteor2021-11-02 17:21

    现在感觉还是不升1.2的好,很多以前大佬开发的插件现在基本上都不兼容,估计也不会更新,再等等吧

      Intern 回复
      Intern2021-11-02 17:27

      嗯,目前不稳定还有很多插件主题不兼容

      @Meteor
    Pnnk 回复
    Pnnk2021-10-27 18:39

    1.2??????有1.2了?诶 我再加点字...

      Intern 回复
      Intern2021-10-28 11:54

      😄那是因为我一开始评论发现报错,后面发的是修复时候测试的

      @Pnnk
      Intern 回复
      Intern2021-10-27 21:52

      测试评论通知插件

      @Pnnk
      Intern 回复
      Intern2021-10-27 21:18

      1.2已经RC了,不过还是有点问题

      @Pnnk
        Pnnk
        Pnnk2021-10-28 11:51

        测试那一条收到了邮件通知,这一条回复没收到( ๑´•ω•) "(ㆆᴗㆆ)

        @Intern
2021 © typecho & elise