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 的壳,自动复用)。

踩坑与修复

  1. Request::get() 取数组参数必须传数组默认值:$request->get('pin') 默认 null(非数组),取到数组字段 pin[] 时会返回 null,导致保存把规则清空。改为 $request->get('pin', [])。
  2. 改了钩子注册必须「禁用 → 启用」插件:旧的 handleInit 钩子仍指向已删除的 onArchiveInit 方法,分类页会整页 Server Error。重新启用刷新注册表即可。
  3. opcache 旧类缓存:侧栏块改为直接读数据选项,避免依赖插件类方法在 opcache 陈旧时报错。

验证(线上)

  • /category/product/(开发,已置顶 1 篇、上限 1):右栏依次出现「二级分类 / 标签 / 置顶 / 本分类最新」,置顶块仅含那 1 篇,无报错。
  • /category/music/(无规则):正常,不显示置顶块。

使用方式

后台顶部菜单「文章置顶」→ 选分类 → 勾选要置顶的文章 → 设数量上限 → 保存。每个分类/子分类独立设置、互不影响。