3.2.37 把「自动头像」提成独立标签页,排在全站配置之后 #6

3.2.36 上线后反馈「后台主题设置没有看到头像这个选项」。逐项排查确认
功能是好的:服务器文件已更新(style.css 3.2.36、theme-options.php md5
与本地一致、avatar-styles 14 份齐全),真实后台 HTML 里 a_auto_enable
出现 5 次、of-avatar-style 97 次,CSS/JS 全部下发,无头浏览器点开开关
后 14 张卡片、14 个单选、缩略图全部出图。

真正的原因是位置:它排在「全站配置」的第 9 项,纵坐标 1058px,而浏览器
视口 1000px 高,前面 8 项(其中「404 页面图片」一项就占 301px)把它顶到
首屏之外,不往下滚看不见;左侧 12 个标签页也没有任何「头像」字样,光扫
标签栏同样摸不着。

改动:
- 把两个选项从「全站配置」里搬出来,改成独立 heading 分组,插在
  「全站配置」之后、「顶部导航」之前,成为第 2 个标签页
- 开关显示名从「自动头像」改为「启用自动头像」,避免与标签页同名、
  「勾选上面的自动头像」这类指代说不清
- 分组注释序号全部重排为 1..13 连续

现在标签栏第 2 个就是「自动头像」,进去第一项就是开关(组内前面 0 个
控件,纵坐标 134px)。

theme-avatar.php 一行没动:它的显隐 CSS 与 JS 全部按 section id 定位
(#section-a_auto_style / getElementById('a_auto_enable')),不依赖分组
序号,搬位置不受影响。

验证:
- 分组结构 17/0、几何+交互 29/0(视口 1600x1000,正是上一版把它顶出
  首屏的高度)
- 几何反向 6 项被捕获(主判据用「开关是所在分组第 1 项」,与像素无关)
- 源码守卫 20/0,反向 12/12 全部被捕获
- 包内契约 30/0,反向 8/8 全部被捕获
- 逐字节渲染 84/0,无 mbstring(php -n)84/0
- 严格错误级别下 PHP 8.4.25 与 8.5.12(线上同版)各 43/0
- 回归:后台标签 88/0、3.2.36 头像守卫 55/0、3.2.36 包契约 24/0、
  CDN 56/0 与 77/0、3.2.28 13/0
- 89 个 php 文件 php -l 全通过
This commit is contained in:
2026-10-25 19:18:21 +08:00
parent 3fcaf25c58
commit 5c7a9e2c1c
2 changed files with 56 additions and 42 deletions
+55 -41
View File
@@ -235,38 +235,6 @@ function kratos_options()
'type' => 'checkbox', 'type' => 'checkbox',
); );
/* ── 自动头像 ────────────────────────────────────────────────
*
* 总开关与风格选择拆成两个字段,但**风格列表只在开关打开后才显示**。
* 这是用户明确要求的形式:先勾选,再出现列表。
*
* 为什么不是一个字段直接存风格名(留空=关闭):
* 用户「关闭功能」和「还没选过风格」在库里会变成同一种状态(都空),
* 以后想恢复默认值时就分不清该填什么。两个字段各管一件事更清楚。
*
* ⚠️ std 只在后台预填和「恢复默认」时起作用,运行时 kratos_option()
* 完全不看它。所以运行时默认值必须在这里同步给一份:
* 开关默认关('0'),风格默认 lorelei(见 yang_avatar_style())。
*/
$options[] = array(
'name' => __('自动头像', 'kratos'),
'desc' => __('访客没注册、也没上传头像时,按他的邮箱生成一张头像。<b>全程本地生成,不请求任何外部服务</b>,同一个邮箱永远得到同一张。若访客已经上传过真实头像,不受影响。', 'kratos'),
'std' => '0',
'id' => 'a_auto_enable',
'type' => 'checkbox',
);
$options[] = array(
'name' => __('头像风格', 'kratos'),
'desc' => __('勾选上面的「自动头像」后,这里才会出现风格列表。所有风格都是 CC0 或 MIT 许可,可自由使用与商用。点一下即时预览,保存后生效。', 'kratos'),
'std' => 'lorelei',
'id' => 'a_auto_style',
'type' => 'avatar_style',
/* 只有开关打开时才渲染这个控件;关着的时候后台完全看不到它,
避免用户在关闭状态下改了风格却不知道为什么没生效。 */
'requires' => 'a_auto_enable',
);
$options[] = array( $options[] = array(
'name' => __('禁止生成缩略图', 'kratos'), 'name' => __('禁止生成缩略图', 'kratos'),
'desc' => __('上传图片时不再额外生成多种尺寸的副本,节省磁盘空间', 'kratos'), 'desc' => __('上传图片时不再额外生成多种尺寸的副本,节省磁盘空间', 'kratos'),
@@ -284,7 +252,53 @@ function kratos_options()
); );
/* ══════════════════════════════════════════════════════════ /* ══════════════════════════════════════════════════════════
* 二、顶部导航 —— 页头那一条 * 二、自动头像 —— 独立一块
*
* 3.2.36 里这两项原本塞在「全站配置」内部(Gravatar 加速之后)。
* 上线后发现**根本找不到**:它排在第 9 位,纵坐标 1058px,而
* 浏览器视口才 1000px 高 —— 前 8 项(其中「404 页面图片」一项
* 就占 301px)把它顶到首屏之外,不往下滚看不见。左侧标签栏也没
* 有「头像」字样,光扫标签栏同样摸不着。
*
* 所以提成独立标签页:标签栏直接能看见,进去第一项就是开关。
* 这也更贴合原始需求「最上面的一个复选框,勾完之后出现下面这些
* 列表」——独立成页后,这个「上面/下面」的关系才真的成立。
*
* ── 为什么开关与风格拆成两个字段 ──────────────────────────
* 若用一个字段直接存风格名(留空=关闭),用户「主动关闭」和
* 「还没选过风格」在库里会变成同一种状态(都空),以后想恢复
* 默认值时分不清该填什么。两个字段各管一件事更清楚。
*
* ⚠️ std 只在后台预填和「恢复默认」时起作用,运行时 kratos_option()
* 完全不看它。所以运行时默认值必须同步给一份:
* 开关默认关('0'),风格默认 lorelei(见 yang_avatar_style())。
* ══════════════════════════════════════════════════════════ */
$options[] = array(
'name' => __('自动头像', 'kratos'),
'type' => 'heading',
);
$options[] = array(
'name' => __('启用自动头像', 'kratos'),
'desc' => __('访客没注册、也没上传头像时,按他的邮箱生成一张头像。<b>全程本地生成,不请求任何外部服务</b>,同一个邮箱永远得到同一张。若访客已经上传过真实头像,不受影响。', 'kratos'),
'std' => '0',
'id' => 'a_auto_enable',
'type' => 'checkbox',
);
$options[] = array(
'name' => __('头像风格', 'kratos'),
'desc' => __('勾选上面的「启用自动头像」后,这里才会出现风格列表。所有风格都是 CC0 或 MIT 许可,可自由使用与商用。点一下即时预览,保存后生效。', 'kratos'),
'std' => 'lorelei',
'id' => 'a_auto_style',
'type' => 'avatar_style',
/* 只有开关打开时才显示这个控件;关着的时候看不到它,
避免用户在关闭状态下改了风格却不知道为什么没生效。 */
'requires' => 'a_auto_enable',
);
/* ══════════════════════════════════════════════════════════
* 三、顶部导航 —— 页头那一条
* ══════════════════════════════════════════════════════════ */ * ══════════════════════════════════════════════════════════ */
$options[] = array( $options[] = array(
'name' => __('顶部导航', 'kratos'), 'name' => __('顶部导航', 'kratos'),
@@ -336,7 +350,7 @@ function kratos_options()
); );
/* ══════════════════════════════════════════════════════════ /* ══════════════════════════════════════════════════════════
* 三、首页配置 —— 只管首页列表长什么样 * 四、首页配置 —— 只管首页列表长什么样
* ══════════════════════════════════════════════════════════ */ * ══════════════════════════════════════════════════════════ */
$options[] = array( $options[] = array(
'name' => __('首页配置', 'kratos'), 'name' => __('首页配置', 'kratos'),
@@ -369,7 +383,7 @@ function kratos_options()
); );
/* ══════════════════════════════════════════════════════════ /* ══════════════════════════════════════════════════════════
* 四、文章配置 —— 打开单篇文章才看得到的东西 * 五、文章配置 —— 打开单篇文章才看得到的东西
* ══════════════════════════════════════════════════════════ */ * ══════════════════════════════════════════════════════════ */
$options[] = array( $options[] = array(
'name' => __('文章配置', 'kratos'), 'name' => __('文章配置', 'kratos'),
@@ -413,7 +427,7 @@ function kratos_options()
); );
/* ══════════════════════════════════════════════════════════ /* ══════════════════════════════════════════════════════════
* 五、自动目录 —— 把长文切成能跳的章节 * 六、自动目录 —— 把长文切成能跳的章节
* *
* 与「文章配置」分开成独立标签页,是刻意的:目录的选项有六项, * 与「文章配置」分开成独立标签页,是刻意的:目录的选项有六项,
* 塞进文章配置里会把「页面布局 / 打赏」这些一眼要看到的东西挤下去。 * 塞进文章配置里会把「页面布局 / 打赏」这些一眼要看到的东西挤下去。
@@ -569,7 +583,7 @@ function kratos_options()
); );
/* ══════════════════════════════════════════════════════════ /* ══════════════════════════════════════════════════════════
* 六、站长信息 —— 文章页页脚那张名片 * 七、站长信息 —— 文章页页脚那张名片
* ══════════════════════════════════════════════════════════ */ * ══════════════════════════════════════════════════════════ */
$options[] = array( $options[] = array(
'name' => __('站长信息', 'kratos'), 'name' => __('站长信息', 'kratos'),
@@ -599,7 +613,7 @@ function kratos_options()
); );
/* ══════════════════════════════════════════════════════════ /* ══════════════════════════════════════════════════════════
* 七、页脚配置 —— 页面最底下那几行 * 八、页脚配置 —— 页面最底下那几行
* ══════════════════════════════════════════════════════════ */ * ══════════════════════════════════════════════════════════ */
$options[] = array( $options[] = array(
'name' => __('页脚配置', 'kratos'), 'name' => __('页脚配置', 'kratos'),
@@ -653,7 +667,7 @@ function kratos_options()
); );
/* ══════════════════════════════════════════════════════════ /* ══════════════════════════════════════════════════════════
* 八、哀悼模式 —— 整站级功能,与首页无关 * 九、哀悼模式 —— 整站级功能,与首页无关
* *
* 这一组原来错放在「首页配置」下面。它影响的是整站配色 * 这一组原来错放在「首页配置」下面。它影响的是整站配色
* (首页、文章页、说明页都变黑白),放首页下面会让人以为 * (首页、文章页、说明页都变黑白),放首页下面会让人以为
@@ -748,7 +762,7 @@ function kratos_options()
); );
/* ══════════════════════════════════════════════════════════ /* ══════════════════════════════════════════════════════════
* 九、收录与统计 —— 给搜索引擎看的 * 十、收录与统计 —— 给搜索引擎看的
* ══════════════════════════════════════════════════════════ */ * ══════════════════════════════════════════════════════════ */
$options[] = array( $options[] = array(
'name' => __('收录与统计', 'kratos'), 'name' => __('收录与统计', 'kratos'),
@@ -806,7 +820,7 @@ function kratos_options()
); );
/* ══════════════════════════════════════════════════════════ /* ══════════════════════════════════════════════════════════
* 十、邮件通知 —— SMTP 与评论提醒 * 十一、邮件通知 —— SMTP 与评论提醒
* ══════════════════════════════════════════════════════════ */ * ══════════════════════════════════════════════════════════ */
$options[] = array( $options[] = array(
'name' => __('邮件通知', 'kratos'), 'name' => __('邮件通知', 'kratos'),
+1 -1
View File
@@ -1,7 +1,7 @@
/* /*
Theme Name: Kratos_Yang Theme Name: Kratos_Yang
Text Domain: kratos_Yang Text Domain: kratos_Yang
Version: 3.2.36 Version: 3.2.37
Requires PHP: 7.0 Requires PHP: 7.0
Description: 这是一个Kratos主题的分支版本,用来增加一些定制化功能。 Description: 这是一个Kratos主题的分支版本,用来增加一些定制化功能。
Tags: 博客, 双栏, 响应式, 自定义背景, 自定义颜色, 自定义图标, 自定义菜单, 特色图像, 收录优化, 邮件中心, 主题选项, 小工具, 文章置顶, 无障碍友好 Tags: 博客, 双栏, 响应式, 自定义背景, 自定义颜色, 自定义图标, 自定义菜单, 特色图像, 收录优化, 邮件中心, 主题选项, 小工具, 文章置顶, 无障碍友好