StickyPost 插件改造:侧栏「置顶」独立区块
需求澄清
之前的实现把「置顶」理解成改写主列表排序(把勾选的文章排到分类列表最前),但目标其实是:与「本分类最新 / 热门 / 序号」并列的独立侧栏区块,由后台手动挑选文章,显示在左/右侧栏,且不改动主列表顺序。
改动内容
插件 Plugin.php
- 删除
handleInit钩子(改写主列表 SQL 排序的逻辑)。 - 新增
getPinnedPosts(int $mid, ?int $limit):按分类mid返回按勾选顺序的置顶文章(cid/title/slug/text),供主题侧栏调用;上限优先级为「显式传入 → 规则内上限 → 全局默认」。 - 配置说明改为「侧栏区块」语义。
主题新增 cc-side-pinned.php
- 读当前分类 slug → 取该分类置顶文章 → 复用
cc-sidebar-list.php渲染成独立的「置顶」块。 - 用函数作用域包裹渲染,避免污染同文件里「本分类最新」的
$ccSidePosts等变量。 - 直接读取
plugin:StickyPostData选项数据,不依赖插件类运行方法,规避 opcache 缓存旧类导致「方法未定义」。
侧栏接入
在右栏内容文件 sidebar-right-{blog,music,Tools,Tutorials}.php 的 <aside> 开头插入 require cc-side-pinned.php(product 分类是 blog 的壳,自动复用)。
踩坑与修复
Request::get()取数组参数必须传数组默认值:$request->get('pin')默认null(非数组),取到数组字段pin[]时会返回null,导致保存把规则清空。改为$request->get('pin', [])。- 改了钩子注册必须「禁用 → 启用」插件:旧的
handleInit钩子仍指向已删除的onArchiveInit方法,分类页会整页Server Error。重新启用刷新注册表即可。 - opcache 旧类缓存:侧栏块改为直接读数据选项,避免依赖插件类方法在 opcache 陈旧时报错。
验证(线上)
/category/product/(开发,已置顶 1 篇、上限 1):右栏依次出现「二级分类 / 标签 / 置顶 / 本分类最新」,置顶块仅含那 1 篇,无报错。/category/music/(无规则):正常,不显示置顶块。
使用方式
后台顶部菜单「文章置顶」→ 选分类 → 勾选要置顶的文章 → 设数量上限 → 保存。每个分类/子分类独立设置、互不影响。
评论 0
还没有评论,来说两句吧。