diff --git a/postlist.php b/postlist.php index 7a01722..5b4f18d 100644 --- a/postlist.php +++ b/postlist.php @@ -1,47 +1,57 @@ -options->sticky ; //置顶的文章id,多个用|隔开 +$sticky = $this->options->sticky; // 置顶的文章id,多个用|隔开 if ($sticky) { - $sticky_cids = array_filter(explode('|', $sticky)); //分割文本并过滤空值 - $sticky_html = " 置顶 "; //置顶标题的 html - + $sticky_cids = array_filter(explode('|', $sticky)); // 分割文本并过滤空值 + $sticky_html = " 置顶 "; // 置顶标题的 html $db = Typecho_Db::get(); $pageSize = $this->options->pageSize; - - // 构建置顶文章的查询 - $selectSticky = $this->select()->where('type = ?', 'post'); - foreach ($sticky_cids as $i => $cid) { - if($i == 0) - $selectSticky->where('cid = ?', $cid); - else - $selectSticky->orWhere('cid = ?', $cid); - } - // 清空原有文章的列队 + // 清空原有文章的队列 $this->row = []; $this->stack = []; $this->length = 0; - - // 只在首页第一页展示置顶文章 - if (($this->_currentPage || $this->currentPage) == 1) { - $stickyPosts = $db->fetchAll($selectSticky); - foreach ($stickyPosts as $stickyPost) { - $stickyPost['title'] = $stickyPost['title'] . $sticky_html; - $this->push($stickyPost); //压入列队 + + // 获取总数,并排除置顶文章数量 + if (isset($this->currentPage) && $this->currentPage == 1) { + $totalOriginal = $this->getTotal(); + $stickyCount = count($sticky_cids); + $this->setTotal(max($totalOriginal - $stickyCount, 0)); + + // 构建置顶文章的查询 + $selectSticky = $this->select()->where('type = ?', 'post'); + foreach ($sticky_cids as $i => $cid) { + if ($i == 0) + $selectSticky->where('cid = ?', $cid); + else + $selectSticky->orWhere('cid = ?', $cid); } + + // 获取置顶文章 + $stickyPosts = $db->fetchAll($selectSticky); + + // 压入置顶文章到文章队列 + foreach ($stickyPosts as &$stickyPost) { + $stickyPost['title'] .= $sticky_html; + $this->push($stickyPost); + } + + $standardPageSize = $pageSize - count($stickyPosts); + } else { + $standardPageSize = $pageSize; } - - // 构建普通文章的查询,排除置顶文章的 CID + + // 构建正常文章查询,排除置顶文章 $selectNormal = $this->select() ->where('type = ?', 'post') ->where('status = ?', 'publish') ->where('created < ?', time()) ->order('created', Typecho_Db::SORT_DESC) - ->page($this->_currentPage, $pageSize); + ->page(isset($this->currentPage) ? $this->currentPage : 1, $standardPageSize); foreach ($sticky_cids as $cid) { $selectNormal->where('table.contents.cid != ?', $cid); @@ -56,13 +66,39 @@ if ($sticky) { } $normalPosts = $db->fetchAll($selectNormal); + + // 压入正常文章到文章队列 foreach ($normalPosts as $normalPost) { - $this->push($normalPost); //压入列队 + $this->push($normalPost); + } +} else { + // 如果没有置顶文章,正常分页 + $selectNormal = $this->select() + ->where('type = ?', 'post') + ->where('status = ?', 'publish') + ->where('created < ?', time()) + ->order('created', Typecho_Db::SORT_DESC) + ->page(isset($this->currentPage) ? $this->currentPage : 1, $this->options->pageSize); + + // 登录用户显示私密文章 + if ($this->user->hasLogin()) { + $uid = $this->user->uid; + if ($uid) { + $selectNormal->orWhere('authorId = ? AND status = ?', $uid, 'private'); + } } - // 设置总数(减去置顶文章数量,以进行正确的分页) - $total = $this->getTotal() - count($sticky_cids); - $this->setTotal(max($total, 0)); // 确保总数不为负数 + $normalPosts = $db->fetchAll($selectNormal); + + // 清空原有文章的队列 + $this->row = []; + $this->stack = []; + $this->length = 0; + + // 压入正常文章到文章队列 + foreach ($normalPosts as $normalPost) { + $this->push($normalPost); + } } ?> next()): ?>