3.2.29: 把「自定义 CSS」里的站点样式并入主题公共样式 assets/css/site.css(段落缩进/h2 蓝条/列表缩进与行距),配置项默认置空并一次性清库迁移;自定义 CSS 内联输出改挂 kratos-site 以保持在最末

This commit is contained in:
2026-10-25 10:36:29 +08:00
parent 420434aacf
commit 677de0f24e
5 changed files with 162 additions and 11 deletions
+48
View File
@@ -0,0 +1,48 @@
@charset "UTF-8";
/**
* 站点级公共样式(3.2.29 起)
*
* 这些规则原来是站长手填在「主题设置 → 自定义代码 → 自定义 CSS」里的,
* 3.2.29 把它们并入主题公共样式,配置项因此留空。
*
* ⚠️ 选择器与声明**必须与原来的自定义 CSS 逐字一致**:
* 自定义 CSS 是以 `<style>` 形式紧跟在 kratos.min.css 之后输出的,
* 所以「排在最后 + 同选择器」才等价于原来的层叠结果。
* 本文件的加载顺序同样是 kratos.min.css 之后(enqueue 依赖 'kratos'),
* 改选择器范围(例如把 ul 收窄到 .article .content ul)会改变实际渲染。
*
* @author Yongquan Yang <yangyq.net>
* @license MIT License
*/
/* 正文段落首行缩进两字 */
.article .content p {
text-indent: 2em;
}
/* 正文二级标题:左侧蓝条 + 浅灰底,横向铺满(负 margin 吃掉正文的 16px 内距) */
.k-main .details .article .content h2 {
margin: 16px -16px;
padding: 0 10px;
border-left: 5px solid #00a2ff;
background-color: rgba(243, 243, 243, 0.7);
font-size: 20px;
line-height: 41px;
}
/* 列表缩进与行距 */
ul {
margin-left: 2em;
}
ol {
margin-left: 2em;
}
ol > li {
line-height: 1.8;
}
ul > li {
line-height: 1.8;
}
+7 -1
View File
@@ -53,6 +53,10 @@ function theme_autoload()
wp_enqueue_style('animate', ASSET_PATH . '/assets/css/animate.min.css', array(), '3.7.2'); wp_enqueue_style('animate', ASSET_PATH . '/assets/css/animate.min.css', array(), '3.7.2');
} }
wp_enqueue_style('kratos', ASSET_PATH . '/assets/css/kratos.min.css', array(), THEME_VERSION); wp_enqueue_style('kratos', ASSET_PATH . '/assets/css/kratos.min.css', array(), THEME_VERSION);
// 站点级公共样式:原「自定义 CSS」的内容已并入本文件(3.2.29)。
// 依赖 kratos ⇒ 一定排在主题样式之后,才压得住主题里的同名规则;
// 它自己也作为「自定义 CSS」的挂载点,保证站长临时覆盖仍排在最末。
wp_enqueue_style('kratos-site', ASSET_PATH . '/assets/css/site.css', array('kratos'), THEME_VERSION);
if (kratos_option('g_adminbar', true)) { if (kratos_option('g_adminbar', true)) {
$admin_bar_css = " $admin_bar_css = "
@media screen and (max-width: 782px) { @media screen and (max-width: 782px) {
@@ -72,9 +76,11 @@ function theme_autoload()
} }
// 自定义样式:存在主题选项里(数据库),排在主题样式之后,优先级最高。 // 自定义样式:存在主题选项里(数据库),排在主题样式之后,优先级最高。
// 放选项而非主题目录,是为了让它在主题升级(升级会清空主题目录)后依然存在。 // 放选项而非主题目录,是为了让它在主题升级(升级会清空主题目录)后依然存在。
// 挂在 kratos-site 上(而非 kratos):站点公共样式 site.css 排在 kratos 之后,
// 自定义 CSS 必须继续排在 site.css 之后,否则临时覆盖会被公共样式反压。
$custom_css = yang_custom_css(); $custom_css = yang_custom_css();
if (trim($custom_css) !== '') { if (trim($custom_css) !== '') {
wp_add_inline_style('kratos', $custom_css); wp_add_inline_style('kratos-site', $custom_css);
} }
// js // js
wp_deregister_script('jquery'); wp_deregister_script('jquery');
+97 -7
View File
@@ -13,15 +13,33 @@
*/ */
/** /**
* 默认自定义 CSS。 * 默认自定义 CSS:空。
* *
* 历史沿革:这些规则原本放在主题目录下的一个 custom 子目录里,是该主题早期的 * 历史沿革(3.2.29 变更):
* 「自定义样式」入口。改成配置项后,把它作为默认值,保证切换瞬间站点外观 * 早年主题目录下有个 custom 子目录当「自定义样式」入口,后来改成配置项,
* 完全不变;同时 `恢复默认` 也能拿回这套样式。 * 那批规则(段落缩进、h2 蓝条、列表缩进)就作为默认值下发,并被写进了库。
* 3.2.29 把它们并入主题公共样式 assets/css/site.css,配置项改为默认空 ——
* 「站点通用样式」本该跟着主题走,「自定义代码」留给临时覆盖。
* *
* 想彻底清掉:在后台把「自定义 CSS」清空保存即可(空值会覆盖这里的默认值)。 * ⚠️ 不要再用旧的那段 CSS 给配置项兜底:site.css 已经在输出同样的规则,
* 再兜底一次就等于全站样式写两遍,且会让后台的框永远显示旧内容。
*/ */
function yang_default_custom_css() function yang_default_custom_css()
{
return '';
}
/**
* 3.2.29 之前作为默认值下发、并已写进数据库的那段 CSS。
*
* 只用于两件事:
* ① 识别「库里存的还是历史默认值」——输出时跳过,避免与 site.css 重复;
* ② 迁移时比对,确认是可以安全清空的那一份(不是站长自己改过的内容)。
*
* 这里有意保留原样的换行与缩进:比对前会先做空白归一化,
* 所以即使库里的换行是 CRLF、这里的是 LF,也能正确匹配。
*/
function yang_legacy_custom_css()
{ {
return <<<'CSS' return <<<'CSS'
.article .content p{ text-indent:2em } .article .content p{ text-indent:2em }
@@ -50,12 +68,48 @@ CSS;
} }
/** /**
* 取自定义 CSS(未设置时回退到默认值) * CSS 空白归一化:只用于「是不是同一段代码」的比对,不用于输出。
*
* 处理:CRLF/CR → LF、连续空白压成一个空格、去掉 `{ } : ; , >` 两侧空白、
* 去掉块尾多余的 `;`。这样「同一条规则的不同缩进/换行」会得到同一个字符串。
*/
function yang_normalize_css($css)
{
if (!is_string($css)) {
return '';
}
$css = str_replace(array("\r\n", "\r"), "\n", $css);
$css = preg_replace('/\s+/', ' ', $css);
$css = preg_replace('/\s*([{}:;,>])\s*/', '$1', $css);
$css = str_replace(';}', '}', $css);
return trim($css);
}
/**
* 库里存的这段 CSS 是否就是「已并入 site.css 的历史默认值」。
*/
function yang_is_legacy_custom_css($css)
{
$normalized = yang_normalize_css($css);
return $normalized !== '' && $normalized === yang_normalize_css(yang_legacy_custom_css());
}
/**
* 取自定义 CSS(未设置时为空)。
*
* 历史默认值已被 site.css 接管:库里若还是它,这里返回空串,
* 避免同一批规则在页面上出现两遍。真正自己改过的内容原样返回。
*/ */
function yang_custom_css() function yang_custom_css()
{ {
$css = kratos_option('g_custom_css', yang_default_custom_css()); $css = kratos_option('g_custom_css', yang_default_custom_css());
return is_string($css) ? $css : ''; if (!is_string($css)) {
return '';
}
if (yang_is_legacy_custom_css($css)) {
return '';
}
return $css;
} }
/** /**
@@ -66,3 +120,39 @@ function yang_custom_js()
$js = kratos_option('g_custom_js', ''); $js = kratos_option('g_custom_js', '');
return is_string($js) ? $js : ''; return is_string($js) ? $js : '';
} }
/**
* 一次性迁移:把库里那段「历史默认 CSS」清成空串。
*
* 为什么需要:std / 默认值只在「后台预填」和「恢复默认」时起作用,
* 运行时 kratos_option() 只查库 —— 库里的旧值不清,后台那个框就永远
* 显示着已经并入 site.css 的旧内容,站长以为它还在生效。
*
* 为什么挂在 admin_init:
* · 只影响后台请求,前台一个写操作都不做;
* · 用户升级后第一次进后台就自动完成,不需要额外操作。
*
* ⚠️ 三条护栏:
* ① 有 $_POST 时直接退出 —— 本函数会走 update_option(),而 update_option()
* 内部会跑 sanitize_option_kratos(= validate_options)。那个回调看到
* $_POST['reset'] 会返回「全部默认值」⇒ 用户在后台点保存/恢复默认的
* 那一下,配置会被我们顺手改成默认值。所以提交请求里绝不插手。
* ② 只清「与历史默认值逐字等价」的内容 —— 站长自己改过的一个字都不碰。
* ③ 清空而不是删键:删键会被 validate_options 用库里的旧值补回来。
*/
function yang_custom_code_migrate()
{
if (!empty($_POST)) {
return;
}
$saved = get_option('kratos');
if (!is_array($saved) || !isset($saved['g_custom_css'])) {
return;
}
if (!yang_is_legacy_custom_css($saved['g_custom_css'])) {
return;
}
$saved['g_custom_css'] = '';
update_option('kratos', $saved);
}
add_action('admin_init', 'yang_custom_code_migrate');
+8 -1
View File
@@ -124,6 +124,9 @@ if (!function_exists('yang_opt_qingming_label')) {
* 同样是加载顺序问题:这个函数在 theme-custom-code.php 里, * 同样是加载顺序问题:这个函数在 theme-custom-code.php 里,
* 而 kratos_options() 可能被更早触发。缺了就返回空串, * 而 kratos_options() 可能被更早触发。缺了就返回空串,
* 后台的「自定义 CSS」框是空的,但能打开、能填、能保存。 * 后台的「自定义 CSS」框是空的,但能打开、能填、能保存。
*
* 3.2.29 起该默认值恒为空:原来的那批规则(段落缩进、h2 蓝条、列表缩进)
* 已并入主题公共样式 assets/css/site.css,配置项只留给站长做临时覆盖。
*/ */
if (!function_exists('yang_opt_default_custom_css')) { if (!function_exists('yang_opt_default_custom_css')) {
function yang_opt_default_custom_css() function yang_opt_default_custom_css()
@@ -714,6 +717,10 @@ function kratos_options()
/* ══════════════════════════════════════════════════════════ /* ══════════════════════════════════════════════════════════
* 十、自定义代码 —— 兜底用,放最后 * 十、自定义代码 —— 兜底用,放最后
*
* 3.2.29 起这两项默认都为空:站点自己的通用样式
* (段落缩进、h2 蓝条、列表缩进)已并入 assets/css/site.css,
* 跟着主题走、升级不丢,也不再需要在这里重复一份。
* ══════════════════════════════════════════════════════════ */ * ══════════════════════════════════════════════════════════ */
$options[] = array( $options[] = array(
'name' => __('自定义代码', 'kratos'), 'name' => __('自定义代码', 'kratos'),
@@ -722,7 +729,7 @@ function kratos_options()
$options[] = array( $options[] = array(
'name' => __('自定义 CSS', 'kratos'), 'name' => __('自定义 CSS', 'kratos'),
'desc' => __('附加样式,在所有主题样式之后加载。保存后立即生效,随主题升级保留。', 'kratos'), 'desc' => __('附加样式,排在主题公共样式之后加载,用于临时覆盖。站点通用样式已并入主题的 assets/css/site.css,这里<b>留空即可</b>。保存后立即生效,随主题升级保留。', 'kratos'),
'id' => 'g_custom_css', 'id' => 'g_custom_css',
'std' => yang_opt_default_custom_css(), 'std' => yang_opt_default_custom_css(),
'type' => 'code', 'type' => 'code',
+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.28 Version: 3.2.29
Requires PHP: 7.0 Requires PHP: 7.0
Description: 这是一个Kratos主题的分支版本,用来增加一些定制化功能。 Description: 这是一个Kratos主题的分支版本,用来增加一些定制化功能。
Tags: 博客, 双栏, 响应式, 自定义背景, 自定义颜色, 自定义图标, 自定义菜单, 特色图像, 收录优化, 邮件中心, 主题选项, 小工具, 文章置顶, 无障碍友好 Tags: 博客, 双栏, 响应式, 自定义背景, 自定义颜色, 自定义图标, 自定义菜单, 特色图像, 收录优化, 邮件中心, 主题选项, 小工具, 文章置顶, 无障碍友好