🔍 SEO 优化
DiscussionForumPosting 结构化数据补 text 字段:Google 规范要求必须指定 text/image/video 之一,原代码仅填 description(非规范字段)触发 Search Console 警告。
route/thread.php第 1114 行新增 text 字段,与 description 同值(首楼正文截断 120 字纯文本),QAPage 分支本已正确填 text 无需改动。ProfilePage 结构化数据补 mainEntity 字段:Google 规范要求 mainEntity 指向 Person/Organization,原代码未填触发警告。
route/user.php第 44-48 行新增mainEntity = {@type:Person, name:用户名, url:用户主页绝对URL}。sitemap.xml 保持现状:当前单文件包含首页+全部公开版块+最近 1000 条帖子(后台可配
sitemap_thread_limit)+版块总览+排行榜,远低于 Google 50000 URL 上限,未触发分片需求;用户主页/帖子分页 URL 经评估不加(前者涉及隐私,后者 canonical 已指向第一页 SEO 价值有限)。robots.txt 动态生成:Google 抓取工具要求 Sitemap 字段必须是完整 URL(含协议+域名),相对路径
/sitemap.xml被拒。新建route/robots.php输出原内容 + 末尾动态拼接 Sitemap 完整 URL(http_url_path()拼站点根),index.php新增/robots.txt早期拦截(参考 sitemap.xml 模式),删除根目录静态 robots.txt。后台 SEO 检查适配:
admin/route/setting.php:121原检测静态robots.txt存在性,改为检测动态生成源文件route/robots.php是否存在,同步更新三语言seo_check_robots_ok/missing文案。
⚡ 性能优化
渲染阻塞 CSS 异步化:用
media=print+onload技巧将装饰性图标/组件样式移出关键渲染路径,bootstrap 布局骨架 CSS 保持同步避免 FOUC。完成:核心header.inc.htm两个 tabler-icons 异步 + noscript 兜底;插件xnx_hidden/xnx_project_cost/xnx_feeds的header_link_after.htmhook CSS 异步化。frame.css因头像框 img 定位依赖同步加载保持现状。Tabler Icons 子集化压缩字体体积:
view/vendor/tabler-icons/tabler-icons.woff2(含 5175 字形)裁剪为仅核心+plugin 实际用到的 402 个字形,449.3KB → 43.2KB(-90%);filled 同步裁剪 70.9KB → 2.3KB。CSS 同步只保留收录 icon 映射,更新@font-face版本串强制刷新缓存。后台 icon 选择器可选范围=子集内。新增tool/subset_tabler_icons.py供后续新增 icon 后重跑,维护规则已沉淀至project_rules.md。Tabler Icons filled 整合进单一字体:用 fontTools 把 18 个 filled 字形物理合并进主 woff2(402→420 字形,44.0KB),filled 图标 CSS 规则并入
tabler-icons.min.css,删除tabler-icons-filled.min.css/.woff2及三处 header 引用。浏览器字体请求由「1 字体+2 CSS」收敛为「1 字体+1 CSS」。字体合并偏左修复:fontTools.merge 合并同 family 字体会把字形整体平移贴到左缘(图标中心 500→375),所有图标普遍偏左。将每个字形平移到「图形中心=advance 中点 500」后全部回归,同步 hmtx 的 lsb。版本串更新
v20260828b强制刷新缓存。规避方法已沉淀至project_rules.md。
🐛 Bug 修复
首页用户数与后台仪表盘口径不一致:
model/runtime.func.php runtime_init()的 users 用空 cond 触发 InnoDB 估算值,改为user_count(array('uid'=>array('>'=>0)))与后台一致,走精确 COUNT(*)。xnx_quest 多项修复:
自定义任务从独立
is_custom复选框整合进任务类型下拉(type=custom),选择时自动隐藏触发事件/人工审核配置并强制审核,旧数据编辑时自动映射。自定义任务类型下仍显示"指定版块/勋章"事件参数行:
toggleType补充隐藏事件参数行,toggleEventParams增加 custom 类型短路。"访问 URL"步骤的目标 URL 输入框不显示:补充
visit_url→target_url字段映射。任务编辑保存改为前端提交前置校验:自定义任务访问 URL 步骤为空时拦截并 toast 提示,不再等后端报错导致已填内容被清空。
"文本输入"步骤前台 placeholder 误用未定义 lang 键,改用站长配置的"文本证据占位提示",未配置时回退默认占位。
首页未登录站点信息用户数与后台仪表盘口径不一致:
model/runtime.func.php runtime_init()的 users 用空 cond 触发 InnoDB information_schema 估算值,改为user_count(array('uid'=>array('>'=>0)))与后台一致,走精确 COUNT(*)。[xnx_quest] 自定义任务从独立 is_custom 复选框整合进任务类型下拉(type=custom),选择时自动隐藏触发事件/人工审核配置并强制审核,仅保留步骤编辑+奖励;旧 is_custom 数据编辑时自动映射为 custom 类型,前台卡片 type 徽章新增自定义任务。
[xnx_quest] 自定义任务类型下仍显示"指定版块/勋章"事件参数行:toggleType 补充隐藏事件参数行,toggleEventParams 增加 custom 类型短路,彻底排除版块/勋章下拉干扰。
[xnx_quest] 自定义任务"访问URL"步骤的目标URL输入框不显示(class 为 target_url 但 toggleStepFields 按 visit_url 拼接 class 导致匹配不到):补充 visit_url→target_url 字段映射,选访问URL类型时正常显示目标URL输入框。
[改进] xnx_quest 任务编辑保存改为前端提交前置校验:自定义任务"访问URL"步骤 target_url 为空时拦截并 toast 提示、聚焦到缺失输入框,不再等后端提交后报错导致已填内容被清空需重填。
[xnx_quest] "文本输入"步骤前台输入框 placeholder 误用未定义 lang 键 quest_step_text_placeholder(lang() 原样返回键名显示垃圾文本),改用站长配置的"文本证据占位提示",未配置时回退默认占位。
🆕 新插件:xiunox_icon_gallery(图标库演示)
前台
/icons.htm单页展示系统当前可用的全部 420 个 Tabler 图标(402 常规 + 18 实心)。运行时直接从
tabler-icons.min.css解析图标清单(字体子集化更新后页面自动同步)。支持名称搜索过滤、全部/常规/实心分类切换、点击图标一键复制 class(
navigator.clipboard+execCommand回退 + XN.toast 反馈)。通过
discover_register.php自注册到发现页供开发者查阅。纯展示插件不建表无后台设置。布局修复:移除 layout_three_column 骨架,直接 header+内容+footer 渲染,内容铺满整页。





