版本号 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:
+123
-4
@@ -65,19 +65,19 @@ function yang_mourning_presets()
|
||||
'name' => __('中国人民抗日战争胜利纪念日', 'kratos'),
|
||||
'note' => __('1945 年 9 月 2 日日本签署投降书,9 月 3 日定为胜利纪念日', 'kratos'),
|
||||
'group' => 'legal',
|
||||
'default' => 1,
|
||||
'default' => 0,
|
||||
),
|
||||
'09-30' => array(
|
||||
'name' => __('烈士纪念日', 'kratos'),
|
||||
'note' => __('向人民英雄敬献花篮仪式在天安门广场举行', 'kratos'),
|
||||
'group' => 'legal',
|
||||
'default' => 1,
|
||||
'default' => 0,
|
||||
),
|
||||
'12-13' => array(
|
||||
'name' => __('南京大屠杀死难者国家公祭日', 'kratos'),
|
||||
'note' => __('1937 年 12 月 13 日南京沦陷,30 万同胞遇难', 'kratos'),
|
||||
'group' => 'legal',
|
||||
'default' => 1,
|
||||
'default' => 0,
|
||||
),
|
||||
|
||||
// ── B 类:民间惯例,默认不勾 ──
|
||||
@@ -256,4 +256,123 @@ function yang_mourning_status_text()
|
||||
$is ? __('正在哀悼,站点已黑白', 'kratos') : __('不在哀悼日', 'kratos'),
|
||||
implode('、', $days)
|
||||
);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 哀悼期间在页面顶部显示一条提示,链接到说明页
|
||||
*
|
||||
* ── 为什么必须放在顶部 ────────────────────────────────────────
|
||||
* 用户的原话是「别人都不知道咋回事,为啥变黑白」。只把入口藏在页脚,
|
||||
* 绝大多数人根本不会看到 —— 他们看到一片灰就关掉了。
|
||||
* 所以提示条要出现在**首屏就能看到**的位置。
|
||||
*
|
||||
* ── 为什么不做成弹窗 ──────────────────────────────────────────
|
||||
* 弹窗会挡住内容,纪念日当天每个访客每次访问都被弹一次,是骚扰。
|
||||
* 一条可以关闭的细横条才是合适的强度,且关闭状态记在 sessionStorage
|
||||
* (用 session 而不是 localStorage:当天关闭后,第二天不应该还记着)。
|
||||
*/
|
||||
function yang_mourning_notice_bar()
|
||||
{
|
||||
// 只在真正哀悼时显示,且不在说明页自身显示(那页自己会说明)
|
||||
if (is_admin() || !yang_is_mourning_today()) {
|
||||
return;
|
||||
}
|
||||
if (yang_mourning_page_is_current()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$url = yang_mourning_page_url();
|
||||
$name = yang_mourning_today_name();
|
||||
$text = $name !== ''
|
||||
? sprintf(__('今天是%s,本站以黑白致哀。', 'kratos'), $name)
|
||||
: __('今天是纪念日,本站以黑白致哀。', 'kratos');
|
||||
?>
|
||||
<div id="yang-mourning-bar" class="yang-mourning-bar" role="region" aria-label="<?php esc_attr_e('哀悼提示', 'kratos'); ?>">
|
||||
<span class="ymb-dot" aria-hidden="true"></span>
|
||||
<span class="ymb-text"><?php echo esc_html($text); ?></span>
|
||||
<a class="ymb-link" href="<?php echo esc_url($url); ?>"><?php _e('了解详情', 'kratos'); ?></a>
|
||||
<button type="button" class="ymb-close" aria-label="<?php esc_attr_e('关闭提示', 'kratos'); ?>">×</button>
|
||||
</div>
|
||||
<style>
|
||||
.yang-mourning-bar{position:relative;z-index:9990;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:10px;padding:9px 46px 9px 18px;background:#2b2f36;color:#e8eaed;font-size:13.5px;line-height:1.6;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif;letter-spacing:.2px}
|
||||
.yang-mourning-bar .ymb-dot{width:6px;height:6px;border-radius:50%;background:#b0b7c0;flex:0 0 auto}
|
||||
.yang-mourning-bar .ymb-text{opacity:.92}
|
||||
.yang-mourning-bar .ymb-link{color:#fff;text-decoration:none;border-bottom:1px solid rgba(255,255,255,.42);padding-bottom:1px;transition:border-color .18s ease}
|
||||
.yang-mourning-bar .ymb-link:hover{border-bottom-color:#fff}
|
||||
.yang-mourning-bar .ymb-close{position:absolute;right:12px;top:50%;transform:translateY(-50%);background:none;border:0;color:#9aa3ad;font-size:19px;line-height:1;cursor:pointer;padding:2px 7px;border-radius:4px}
|
||||
.yang-mourning-bar .ymb-close:hover{color:#fff;background:rgba(255,255,255,.1)}
|
||||
.yang-mourning-bar.is-hidden{display:none}
|
||||
@media (max-width:560px){
|
||||
.yang-mourning-bar{font-size:12.5px;padding:8px 42px 8px 12px;gap:7px;justify-content:flex-start}
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
(function () {
|
||||
var bar = document.getElementById('yang-mourning-bar');
|
||||
if (!bar) return;
|
||||
// 当天关闭过就不再显示。用 sessionStorage 而非 localStorage:
|
||||
// 明天是另一天,不该还记着昨天的关闭操作。
|
||||
var KEY = 'yangMournBarClosed:' + <?php echo wp_json_encode(current_time('Ymd')); ?>;
|
||||
try { if (sessionStorage.getItem(KEY) === '1') { bar.className += ' is-hidden'; return; } } catch (e) {}
|
||||
var btn = bar.querySelector('.ymb-close');
|
||||
if (btn) {
|
||||
btn.addEventListener('click', function () {
|
||||
bar.className += ' is-hidden';
|
||||
try { sessionStorage.setItem(KEY, '1'); } catch (e) {}
|
||||
});
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
<?php
|
||||
}
|
||||
add_action('wp_body_open', 'yang_mourning_notice_bar', 5);
|
||||
|
||||
/**
|
||||
* 页脚常驻入口
|
||||
*
|
||||
* 提示条只在哀悼日出现,但说明页应该随时可达 ——
|
||||
* 有人可能事后才知道,想去看看是怎么回事。
|
||||
*/
|
||||
function yang_mourning_footer_link()
|
||||
{
|
||||
ob_start();
|
||||
?>
|
||||
<p class="yang-mourning-footer">
|
||||
<a href="<?php echo esc_url(yang_mourning_page_url()); ?>"><?php _e('纪念日哀悼说明', 'kratos'); ?></a>
|
||||
</p>
|
||||
<style>
|
||||
.yang-mourning-footer{margin:6px 0 0}
|
||||
.yang-mourning-footer a{color:inherit;opacity:.75;text-decoration:none;border-bottom:1px dotted currentColor;font-size:13px;transition:opacity .18s ease}
|
||||
.yang-mourning-footer a:hover{opacity:1}
|
||||
</style>
|
||||
<?php
|
||||
echo ob_get_clean();
|
||||
}
|
||||
add_action('wp_footer', 'yang_mourning_footer_link', 20);
|
||||
|
||||
/**
|
||||
* 当前请求是不是说明页自己
|
||||
*/
|
||||
function yang_mourning_page_is_current()
|
||||
{
|
||||
$path = trim((string) parse_url($_SERVER['REQUEST_URI'] ?? '', PHP_URL_PATH), '/');
|
||||
$home_path = trim((string) parse_url(home_url('/'), PHP_URL_PATH), '/');
|
||||
if ($home_path !== '' && strpos($path, $home_path) === 0) {
|
||||
$path = trim(substr($path, strlen($home_path)), '/');
|
||||
}
|
||||
return ($path === yang_mourning_page_slug());
|
||||
}
|
||||
|
||||
/**
|
||||
* 今天哀悼的纪念日名称(用于提示条文案)
|
||||
*
|
||||
* 取第一个命中的,取不到返回空串。
|
||||
*/
|
||||
function yang_mourning_today_name()
|
||||
{
|
||||
$md = current_time('m') . '-' . current_time('d');
|
||||
$presets = yang_mourning_presets();
|
||||
if (isset($presets[$md]) && in_array($md, yang_mourning_days(), true)) {
|
||||
return $presets[$md]['name'];
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user