版本号 3.2.6 -> 3.2.7(纪念日全部默认不勾 + 彩色说明页 + 邮件彩色 + 双引用块)

哀悼默认值全部改为不勾选
- 九个纪念日的 default 全改成 0。之前法定那三个是 1,导致全新安装的站点
  一到日子就自己变黑白,而站主根本没同意过这件事。
- 后台多选组件的 std 全为 0,打开设置页一个都不勾。
- 「从未保存过」与「保存过但全不勾」两条路径都返回空数组,
  不能因为结果为空就回退到默认 —— 那等于用户取消勾选无效。

新增彩色说明页(inc/theme-mourning-page.php + pages/page-mourning.php)
- 站点变黑白后必须有个地方解释清楚,否则访客只看到一片灰、以为站点坏了。
- 三处入口:顶部提示条(wp_body_open,首屏可见)、页脚常驻链接、
  [yang_mourning] 短代码。
- 页面内容由真实配置驱动,不是写死的文案:没勾的日期不会出现,
  今天在列表里带「今天」标记,一个都没勾时明说「不会生效」。
- 页面必须保持彩色,否则解释「为什么是灰的」的页面自己也是灰的。
  取消灰度做了两层:filter:none 与 grayscale(0%) 都写,且带 !important;
  优先级放在 wp_head 的 2,晚于灰度样式的 1。
- 路由走 parse_request 优先级 5 而非 template_redirect:
  避免先走一遍 404 判定与 404 模板。带子目录安装时先剥掉前缀再比对。
- 不抢占用户自己建的页面:如果站里已有同名 slug 的页面就放手。
  否则用户会觉得「我建的页面坏了」,且没有任何提示。

邮件不受影响,且回复邮件同时给出双方内容
- 邮件是独立 HTML,不走 wp_head,结构上就不可能被灰度,已断言验证。
- theme-mail-template 的单个 quote 改成 quotes 列表,一个模板同时渲染
  「被回复的那条」与「新的回复」,最后一块用主色高亮(回复是重点),
  前面的用弱化色。只有一块时退化为主色,与旧行为一致。
- 通过 wpdiscuz_email_content 重建整封邮件,不需要改插件。
  审核通过通知用 wpdiscuz_comment_approved_email_content 走同一模板,
  但它只给 post_id、不给评论对象,能放的内容受此限制。

两个必须记下来的坑
- wpDiscuz 在过滤器之后还会做一次 html_entity_decode 再发信。
  esc_html 的输出会被那一步还原成真标签,评论里的 <script> 直接生效。
  所以返回前先把 & 编码一次。本地 stub 没有这一步,测试看不出来。
- header.php 从来没有调用 wp_body_open,挂在上面的东西全部静默失效。
  不调用不会报错,只会「什么都没发生」。已补在 <body> 之后。

yang_mail_text 保留换行
- 原来用 wp_strip_all_tags($t, true),第二个参数 remove_breaks 会把换行
  压成空格;而 strip_tags 遇到 <br> 是直接删掉不补换行的。
  结果整条评论被拍成一行,模板里的 nl2br 成了死代码。
- 改为先把块级边界降级成 \n,再去标签(remove_breaks=false)。
  收行内空白用 [^\S\n] 而不是 [ \t\f\v]:PCRE 的 \v 是垂直空白类,
  会把 \n 一起匹配掉。

说明页对比度修正(WCAG AA)
- 金色 #b8860b 在白底只有 3.06:1,当装饰色没问题,当 12-15px 文字偏虚。
  拆成 --ym-gold(装饰)与 --ym-gold-text(#946600,4.75:1,仍属金色)。
- 分组小标题 #9aa5b1 只有 2.36:1,改用 #5f6b78(5.12:1)。
- 「今天」标签白字压金底 3.25:1,改用 #8a6100(5.54:1)。
This commit is contained in:
2026-10-23 14:43:47 +08:00
parent 37c52948c4
commit 269364bed4
9 changed files with 833 additions and 21 deletions
+62
View File
@@ -0,0 +1,62 @@
<?php
/**
* 哀悼说明页的模板
*
* 由 inc/theme-mourning-page.php 的 yang_mourning_page_route() 直接 include,
* 不经过 WordPress 的模板层级。
*
* 关键点:这一页**必须是彩色的**。全站在纪念日会挂
* `html{filter:grayscale(100%)}`(wp_head 优先级 1),
* 本模板在 wp_head 优先级 2 里把它反转回来。
* 只反转 html 的 filter 不够 —— 见下方注释。
*
* @author Yongquan Yang <yangyq.net>
* @license MIT License
*/
if (!defined('ABSPATH')) {
exit;
}
/**
* 把灰度反转掉
*
* 为什么写两遍:
* - `html{filter:none}` 取消外面的灰度;
* - 但某些浏览器在 filter 从有到无的瞬间会留下合成层缓存,导致首屏仍是灰的,
* 所以补一条 `filter:grayscale(0%)` 显式声明,比 none 更稳。
*
* 权限用 `!important`:主题的灰度样式在 wp_head 优先级 1 输出,
* 本段在优先级 2,同优先级下后写的赢,加 !important 是防其它插件插入的覆盖。
*/
function yang_mourning_page_ungrayscale()
{
echo '<style id="yang-mourning-page-color">'
. "\nhtml{filter:none !important;-webkit-filter:none !important;}"
. "\nhtml{filter:grayscale(0%) !important;-webkit-filter:grayscale(0%) !important;}"
. "\nhtml body{-webkit-transform:none !important;}"
. "\n</style>\n";
}
add_action('wp_head', 'yang_mourning_page_ungrayscale', 2);
/**
* 输出本页样式
*/
function yang_mourning_page_print_css()
{
echo '<style id="yang-mourning-page">' . yang_mourning_page_css() . "</style>\n";
}
add_action('wp_head', 'yang_mourning_page_print_css', 3);
get_header();
?>
<div class="k-main <?php echo kratos_option('top_select', 'banner'); ?>" style="background:<?php echo kratos_option('g_background', '#f5f5f5'); ?>">
<div class="container">
<div class="row">
<div class="col-12">
<?php echo yang_mourning_page_content(); ?>
</div>
</div>
</div>
</div>
<?php get_footer(); ?>