Files
wordpress-kratos-yang/inc/theme-mourning.php
T
laoyang 0799268661 3.2.16: 删三项无用功能、选项重排为 10 组、修移动端提示条偏左
删除
- 微信二维码:配置项 s_wechat / 隐藏上传 s_wechat_url、footer 浮动块、
  默认图注册表条目、CSS 规则、wechat.png
- Font Awesome:选项 g_fontawesome、theme-core 入队、58KB 样式、
  assets/fonts/webfonts 全套字体(2.8MB,CSS 删后零引用)
- 多人模式:选项 multiusers、page-content / page-toolbar 两处分支

选项重排(9 组 → 10 组)
全站配置 / 顶部导航 / 首页配置 / 文章配置 / 站长信息 /
页脚配置 / 哀悼模式 / 收录与统计 / 邮件通知 / 自定义代码
哀悼 5 个字段从「首页配置」独立成「哀悼模式」——它不是首页专属功能。
g_404/g_chrome/g_animate/g_gravatar 等归「全站配置」,s_copyright 归「页脚配置」。

修复
- footer.php 版权行此前无条件硬编码,后台 s_copyright 填了不生效
- 附加日期命中时 yang_mourning_today_name() 返回空串,提示条退化成
  只说「今天是纪念日」而不给名字
- 小屏哀悼提示条 padding 写成 `7px 40px 7px 12px`(右宽左窄给关闭按钮
  让位),内容盒中心 181 vs 视口中心 195,整体偏左 14px。关闭按钮本就
  absolute 不占内部流,改为左右等宽 + 缩小按钮。桌面端同类错误 3.2.14 已修,
  此处漏了同一个断点。

加载顺序
theme-options.php 可能早于 theme-mourning.php / theme-custom-code.php 加载,
新增 yang_opt_* 四个 function_exists 包装,避免裸调用导致后台白屏。

验证:静态断言 62/0 · 后台面板 14/0 · 反向验证 7/7 与 44/0 ·
提示条 4 视口几何 20/0(注入旧 bug 精确复现 -14px)· 线上 3 视口 33/0
2026-10-23 22:56:10 +08:00

512 lines
23 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* 纪念日自动哀悼
*
* ── 依据 ─────────────────────────────────────────────────────
* 以下日期分三类,可信度不同,代码里也分开对待:
*
* A. 法定纪念日(全国人大常委会决定设立,每年国家举行纪念活动)
* · 09-03 中国人民抗日战争胜利纪念日
* 2014-02-27 十二届全国人大常委会第七次会议决定设立
* · 09-30 烈士纪念日
* 2014-08-31 十二届全国人大常委会第十次会议决定设立
* · 12-13 南京大屠杀死难者国家公祭日
* 2014-02-27 同一会议决定设立
* 依据:全国人大网《铭记历史坐标 凝聚前行力量》
* http://www.npc.gov.cn/c2/c30834/202510/t20251020_448426.html
* http://npc.gov.cn/c2/c12435/c12487/201905/t20190521_220992.html
*
* B. 民间广泛采用(非法定,但主流网站普遍黑白)
* · 05-12 汶川地震纪念(2008-05-12 14:28)
* · 09-18 九一八事变纪念(1931-09-18)
* 这两个日期黑白是网络惯例,但不是法定「哀悼日」,所以默认**不勾选**,
* 由用户自己决定。硬编码成默认开启会替用户做价值判断,不合适。
*
* C. 历史全国哀悼日(一次性事件,非每年)
* · 2008-05-19~21 汶川地震(国务院决定)
* · 2010-04-21 玉树地震(国务院决定)
* · 2010-08-15 舟曲泥石流(国务院决定)
* · 2020-04-04 新冠疫情牺牲烈士和逝世同胞(国务院决定)
* 这些是**特定年份的特定日期**,不是周年循环。所以代码里不把它们
* 当成"每年重复",而是保留为可自定义的具体日期,避免明年 4 月 4 日
* 又自动变黑白(那是错的)。
*
* ── 设计取舍 ──────────────────────────────────────────────────
* 1. **按站点时区判断**,不按服务器时区。用 current_time('md'),
* 它走 WordPress 设置的时区。否则服务器在 UTC,北京时间 9 月 18 日
* 早上 8 点前还算 17 日,哀悼会晚 8 小时生效。
*
* 2. **只判断月日,不判断年份**。纪念日是周年性质,每年的同一天都要生效。
*
* 3. **兼容旧的 g_rip 开关**。老版本是纯手动「一直黑白」。
* 若用户勾着旧的 g_rip,仍然一直黑白;新逻辑是叠加在上面的。
* 不能因为升级就让原本黑白中的站点突然恢复彩色。
*
* @author Yongquan Yang <yangyq.net>
* @license MIT License
*/
if (!defined('ABSPATH')) {
exit;
}
/**
* 内置纪念日清单
*
* 返回 array( 键 => array(月份, 日, 名称, 说明, 分类, 是否默认勾选) )
*
* 键名用 `m-d` 形式(补零),与 current_time('m') / current_time('d') 直接可比。
*/
function yang_mourning_presets()
{
return array(
// ── A 类:法定纪念日 ──
'09-03' => array(
'name' => __('中国人民抗日战争胜利纪念日', 'kratos'),
'note' => __('1945 年 9 月 2 日日本签署投降书,9 月 3 日定为胜利纪念日', 'kratos'),
'group' => 'legal',
'default' => 0,
),
'09-30' => array(
'name' => __('烈士纪念日', 'kratos'),
'note' => __('向人民英雄敬献花篮仪式在天安门广场举行', 'kratos'),
'group' => 'legal',
'default' => 0,
),
'12-13' => array(
'name' => __('南京大屠杀死难者国家公祭日', 'kratos'),
'note' => __('1937 年 12 月 13 日南京沦陷,30 万同胞遇难', 'kratos'),
'group' => 'legal',
'default' => 0,
),
// ── B 类:民间惯例,默认不勾 ──
'05-12' => array(
'name' => __('汶川地震纪念日', 'kratos'),
'note' => __('2008 年 5 月 12 日 14 时 28 分,汶川发生 8.0 级地震', 'kratos'),
'group' => 'custom',
'default' => 0,
),
'09-18' => array(
'name' => __('九一八事变纪念日', 'kratos'),
'note' => __('1931 年 9 月 18 日,日本关东军发动九一八事变', 'kratos'),
'group' => 'custom',
'default' => 0,
),
'07-07' => array(
'name' => __('七七事变纪念日', 'kratos'),
'note' => __('1937 年 7 月 7 日,卢沟桥事变,全民族抗战爆发', 'kratos'),
'group' => 'custom',
'default' => 0,
),
'12-12' => array(
'name' => __('西安事变纪念日', 'kratos'),
'note' => __('1936 年 12 月 12 日,张学良、杨虎城发动兵谏', 'kratos'),
'group' => 'custom',
'default' => 0,
),
'08-15' => array(
'name' => __('日本宣布无条件投降纪念日', 'kratos'),
'note' => __('1945 年 8 月 15 日,日本天皇宣布接受波茨坦公告', 'kratos'),
'group' => 'custom',
'default' => 0,
),
'04-04' => array(
'name' => __('清明节', 'kratos'),
'note' => __('节气日期每年浮动,这里固定为 4 月 4 日,仅作近似', 'kratos'),
'group' => 'custom',
'default' => 0,
),
);
}
/**
* 读取用户勾选的纪念日
*
* 老站点升级上来时这个选项还不存在,此时返回 presets 里 default=1 的那些。
* 注意**不能**简单用 `kratos_option('g_rip_days', 默认数组)`:kratos_option
* 对未设置的键返回默认值,但如果用户曾经保存过空数组(全部取消勾选),
* 存进去的就是空数组,此时必须尊重「用户就是要关掉」,不能再回退到默认。
* 所以这里用「option 数组里有没有这个键」来判断,而不是判断值是否为空。
*/
function yang_mourning_days()
{
$presets = yang_mourning_presets();
$opts = get_option('kratos');
$has = is_array($opts) && array_key_exists('g_rip_days', $opts);
if (!$has) {
// 从未保存过:用内置默认
$out = array();
foreach ($presets as $md => $info) {
if (!empty($info['default'])) {
$out[] = $md;
}
}
return $out;
}
$saved = $opts['g_rip_days'];
if (!is_array($saved)) {
return array();
}
// 只保留在 presets 里存在、且值为真的日期(防止脏数据)
$out = array();
foreach ($saved as $md => $v) {
if ($v && isset($presets[$md])) {
$out[] = $md;
}
}
return $out;
}
/**
* 今天是否应当哀悼
*/
function yang_is_mourning_today()
{
// 旧的手动开关:开了就一直黑白(保持向后兼容,不能让升级把黑白站点变回彩色)
if (kratos_option('g_rip', false)) {
return true;
}
if (!kratos_option('g_rip_auto', false)) {
return false;
}
// 走站点时区,不是服务器时区
$md = current_time('m') . '-' . current_time('d');
$days = yang_mourning_days();
// 自定义附加日期(用户自己填的,如特定年份的哀悼日)
foreach (yang_mourning_extra_days() as $one) {
$days[] = $one;
}
return in_array($md, $days, true);
}
/**
* 把「附加日期」输入框里的自由文本解析成月日列表
*
* 支持两种写法,语义不同,不能混为一谈:
* · `MM-DD` —— 每年循环(05-12 每年都会触发)
* · `YYYY-MM-DD` —— 只在指定那年触发(2020-04-04 是一次性事件,
* 明年 4 月 4 日不该再自动变黑白)
*
* 分隔符容错:空格、回车、英文逗号、中文逗号、顿号、分号都认,
* 因为用户复制粘贴来源五花八门,要求他只准用半角空格不现实。
*
* 非法格式**静默跳过**而不是报错:这是个自由文本框,中途保存到
* 一半(比如只打了 `10-`)不应该让整个后台保存失败。
*/
function yang_mourning_extra_days()
{
$raw = kratos_option('g_rip_extra', '');
if (!is_string($raw) || trim($raw) === '') {
return array();
}
$out = array();
foreach (preg_split('/[\s,,、;;]+/u', $raw) as $one) {
$one = trim($one);
if ($one === '') {
continue;
}
if (preg_match('/^(\d{1,2})-(\d{1,2})$/', $one, $m)) {
// MM-DD:补零后与 current_time('m')-current_time('d') 可比
$out[] = sprintf('%02d-%02d', (int) $m[1], (int) $m[2]);
} elseif (preg_match('/^(\d{4})-(\d{1,2})-(\d{1,2})$/', $one, $m)) {
if ((int) $m[1] === (int) current_time('Y')) {
$out[] = sprintf('%02d-%02d', (int) $m[2], (int) $m[3]);
}
}
}
return $out;
}
/**
* 附加日期的原始文本(后台选项说明里回显"当前填的是什么"用)
*
* 单独抽出来是因为后台 desc 里要展示它,而 desc 在
* kratos_options() 里拼装 —— 那里不该重复一遍取值逻辑。
*/
function yang_mourning_extra_raw()
{
$raw = kratos_option('g_rip_extra', '');
return is_string($raw) ? trim($raw) : '';
}
/**
* 输出黑白样式
*
* 几个细节:
* 1. `html { filter: grayscale(1) }` 会给整页建一个合成层,fixed 定位的元素
* 在某些旧版 Chrome 上会错位。所以额外加 `background-attachment: fixed`
* 的补丁样式不写;这里改用给 body 和 .k-header 分别处理更稳。
* —— 实际上实测最稳的是给 html 加 filter 并用 transform: translateZ(0)
* 在 body 上兜住,避免 iOS Safari 的渲染错位。这里保留 html 方案,
* 因为它在用户当前主题结构下工作正常(老功能的写法),只是补一条
* iOS 的兼容声明。
* 2. 不能只挂 is_home():详情页也应该黑白。老代码限定首页,那是 bug。
* 3. 只在真正哀悼的日子输出,避免给所有页面增加一条无用样式。
*/
function yang_mourning_style()
{
if (is_admin() || !yang_is_mourning_today()) {
return;
}
echo '<style id="yang-mourning">'
. "\nhtml{filter:grayscale(100%);-webkit-filter:grayscale(100%);}"
. "\nhtml body{-webkit-transform:translateZ(0);}"
// 打印时不灰度,否则打印出来是灰的
. "\n@media print{html{filter:none!important;-webkit-filter:none!important;}}"
. "\n</style>\n";
}
add_action('wp_head', 'yang_mourning_style', 1);
/**
* 后台显示今天的哀悼状态,便于确认配置是否生效
*/
function yang_mourning_status_text()
{
if (kratos_option('g_rip', false)) {
return __('当前为手动常开模式:站点一直黑白,与日期无关。', 'kratos');
}
if (!kratos_option('g_rip_auto', false)) {
return __('自动哀悼未开启。(上面的「手动常开」也没勾,所以现在整站是彩色的。)', 'kratos');
}
$days = yang_mourning_days();
$extra = yang_mourning_extra_days();
foreach ($extra as $one) {
if (!in_array($one, $days, true)) {
$days[] = $one;
}
}
if (empty($days)) {
return __('自动哀悼已开启,但一个日期都没有 —— 清单没勾、附加日期也没填,因此不会生效。', 'kratos');
}
sort($days);
$today = current_time('m') . '-' . current_time('d');
$is = in_array($today, $days, true);
return sprintf(
/* translators: 1: 今天的月日, 2: 是否处于哀悼, 3: 生效的日期列表 */
__('今天是 %1$s,%2$s。当前会变黑白的日期:%3$s', 'kratos'),
$today,
$is ? __('正在哀悼,站点已黑白', 'kratos') : __('不在哀悼日', 'kratos'),
implode('、', $days)
);
}
/**
* 哀悼期间在页面**最顶部正中**显示一条提示,链接到说明页
*
* ── 为什么必须放在最顶部 ──────────────────────────────────────
* 用户的原话是「别人都不知道咋回事,为啥变黑白」。只把入口藏在页脚,
* 绝大多数人根本不会看到 —— 他们看到一片灰就关掉了。
* 所以提示条必须出现在**首屏第一眼就看到**的位置:整页最上方、水平居中。
*
* ── 只在哀悼日出现 ────────────────────────────────────────────
* 平时打开站点的人不应该看到任何"哀悼说明"的入口 —— 他既没看到黑白,
* 也不知道在对什么致哀,那个入口本身就是困惑源。所以页脚的常驻链接
* 已经移除,说明页的入口就只在这条提示里。
*
* ── 为什么不做成弹窗 ──────────────────────────────────────────
* 弹窗会挡住内容,纪念日当天每个访客每次访问都被弹一次,是骚扰。
* 一条可以关闭的细横条才是合适的强度,且关闭状态记在 sessionStorage
* (用 session 而不是 localStorage:当天关闭后,第二天不应该还记着)。
*
* ── 定位方式:占文档流第一行 + 同步下移导航栏 ─────────────────
* 目标是「整页最上方、水平居中」。实现时连撞两次,都靠真实几何测出来:
*
* 第一版:`position:relative`,排进文档流。左右 padding 是
* `9px 46px 9px 18px`(左 18、右 46,为了给关闭按钮让位),
* 内容整体偏左(实测文字中心 602、视口中心 640,偏 38px)——
* "最中间"根本没做到。同时它从 y=0 开始、高 40px,而导航栏
* `.k-nav` 是 `absolute; top:0`、z-index 1030,提示条 z-index 9990
* ⇒ **压在站点标题上方**(与 `.navbar-brand` 实测重叠 32px),把 Logo 遮住。
*
* 第二版:改成 `position:fixed; top:0; left:0; right:0`,并给 body 加
* `padding-top`。居中问题解决了(中心精确等于视口中心),但**重叠仍在 31px**。
* 原因很隐蔽:`.k-nav` 是 `position:absolute`,它的包含块是初始包含块
* (视口),**body 的 padding 推不动它**。
*
* 现在的做法(两件事配合):
* 1. 提示条本身 `position:relative` 占文档流第一行、横跨整宽,
* 内容交给内层 `.ymb-inner` 居中,左右 padding 等宽,
* 关闭按钮 absolute 不占内部流 ⇒ 几何中心 = 视口中心。
* 它占位后,`.k-header` 会被自然推下去,正文不受影响。
* 2. 唯独 `.k-nav` 是 absolute,必须单独补一条
* `body.has-yang-mourning-bar .k-nav{top:var(--ymb-h)}` 把它挪到提示条下方。
* 没有提示条时该变量不存在、偏移为 0,行为与改动前完全一致。
*
* 不用 fixed 的理由:fixed 会一直悬浮,滚动看文章时顶部永远压一条深色带,
* 内容从它下面穿过去;而且它不占位,必须靠 padding 补偿,补偿量还算不准
* (窄屏换行后高度会变)。占文档流第一行没有这些问题。
*/
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-inner">
<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>
</span>
<button type="button" class="ymb-close" aria-label="<?php esc_attr_e('关闭提示', 'kratos'); ?>">&times;</button>
</div>
<style id="yang-mourning-bar-css">
.yang-mourning-bar{position:relative;z-index:9995;display:flex;align-items:center;justify-content:center;min-height:38px;padding:8px 44px;background:#2b2f36;color:#e8eaed;font-size:13.5px;line-height:1.55;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif;letter-spacing:.2px;box-sizing:border-box;width:100%}
.yang-mourning-bar .ymb-inner{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:8px;max-width:100%}
.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;white-space:nowrap;transition:border-color .18s ease}
.yang-mourning-bar .ymb-link:hover{border-bottom-color:#fff}
.yang-mourning-bar .ymb-close{position:absolute;right:10px;top:50%;transform:translateY(-50%);background:none;border:0;color:#9aa3ad;font-size:19px;line-height:1;cursor:pointer;padding:2px 8px;border-radius:4px}
.yang-mourning-bar .ymb-close:hover{color:#fff;background:rgba(255,255,255,.1)}
.yang-mourning-bar.is-hidden{display:none}
/* 导航栏是 absolute;top:0,相对视口定位 —— body 的 padding 推不动它。
不同步下移的话,它会和提示条叠在一起、把站点标题遮住(实测重叠 31px)。
这里只用一条 top 偏移把它挪到提示条下方;没有提示条时 --ymb-h 为 0。 */
body.has-yang-mourning-bar .k-nav{top:var(--ymb-h,0px)}
/* 小屏:左右 padding 必须等宽。
曾写成 `7px 40px 7px 12px`(右宽左窄,给关闭按钮让位),
结果内容盒中心 = 181,而视口中心 = 195,文字整体偏左 14px —— 桌面端同样
的错在 3.2.14 修过,这里漏了同一个断点。
关闭按钮本来就是 absolute、不占内部流,所以它的空间由"缩小自身"解决,
不能靠单边 padding 去让:right:6px + 更小字号/内边距后宽度约 20px,
落在右侧 40px 的 padding 区内,与文字不重叠。 */
@media (max-width:560px){
.yang-mourning-bar{font-size:12.5px;padding:7px 40px;letter-spacing:0}
.yang-mourning-bar .ymb-inner{gap:6px}
.yang-mourning-bar .ymb-close{right:6px;font-size:17px;padding:2px 5px}
}
</style>
<script>
(function () {
var bar = document.getElementById('yang-mourning-bar');
if (!bar) return;
var body = document.body;
// 让正文让出提示条的高度。必须读真实高度:
// 窄屏下文字换行,高度不是常数,写死像素必然在某些宽度下失准。
function syncOffset() {
if (bar.className.indexOf('is-hidden') > -1) {
body.classList.remove('has-yang-mourning-bar');
body.style.removeProperty('--ymb-h');
return;
}
body.classList.add('has-yang-mourning-bar');
body.style.setProperty('--ymb-h', bar.offsetHeight + 'px');
}
// 提示条本身在文档流里,会把 .k-header 自然推下去;
// 但 .k-nav 是 absolute,必须靠上面的 CSS 变量把它也挪下来。
syncOffset();
window.addEventListener('resize', syncOffset);
window.addEventListener('load', syncOffset);
// 当天关闭过就不再显示。用 sessionStorage 而非 localStorage:
// 明天是另一天,不该还记着昨天的关闭操作。
var KEY = 'yangMournBarClosed:' + <?php echo wp_json_encode(current_time('Ymd')); ?>;
var closed = false;
try { closed = sessionStorage.getItem(KEY) === '1'; } catch (e) {}
if (closed) { bar.className += ' is-hidden'; syncOffset(); return; }
var btn = bar.querySelector('.ymb-close');
if (btn) {
btn.addEventListener('click', function () {
bar.className += ' is-hidden';
syncOffset();
try { sessionStorage.setItem(KEY, '1'); } catch (e) {}
});
}
})();
</script>
<?php
}
add_action('wp_body_open', 'yang_mourning_notice_bar', 5);
/**
* 说明页的入口只存在于哀悼提示条里,不做页脚常驻链接
*
* ── 为什么删掉页脚那个入口 ────────────────────────────────────
* 之前的实现除了提示条,还在页脚挂了一个常驻的「纪念日哀悼说明」链接,
* 意图是"事后也能找到"。但用户看得很准:这个链接**一年 365 天都在**,
* 平时打开站点的人会莫名其妙看到一个"哀悼说明"——他既没看到黑白,
* 也不知道哀悼什么,这个入口本身就是个困惑源。
*
* 正确的产品逻辑是:**哀悼是当天才发生的事,说明入口就只该在那天出现**。
* 提示条本身就是那个入口(带「了解详情」链接)。
* 非哀悼日不显示任何入口,说明页仍然可以被直接访问(知道地址的人能打开),
* 只是不再到处劝人去看。
*
* 因此这里刻意**不再注册 wp_footer 钩子**。保留这个函数名是为了让
* 老版本的子主题/缓存里对它的调用不会 Fatal,行为是空输出。
*/
function yang_mourning_footer_link()
{
return '';
}
/**
* 当前请求是不是说明页自己
*/
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());
}
/**
* 今天哀悼的纪念日名称(用于提示条文案)
*
* 取第一个命中的,取不到返回空串。
*
* ── 为什么附加日期也要给个名字 ──────────────────────────────
* 清单里的日期都有正式名称,附加日期是用户自己填的、系统不知道叫什么。
* 早先这里只查 presets,于是用附加日期触发的哀悼,提示条会退化成
* 「今天是纪念日,本站以黑白致哀」—— 名字丢了,而这条提示的全部意义
* 就是告诉访客"今天是哪个纪念日"。所以附加日期命中时,明确说明
* 这是自定义的纪念日,让文案仍然完整、不露出系统的无知。
*/
function yang_mourning_today_name()
{
if (!yang_is_mourning_today()) {
return '';
}
$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'];
}
// 命中的是「附加日期」里用户自己填的那一天
if (in_array($md, yang_mourning_extra_days(), true)) {
return __('纪念日', 'kratos');
}
return '';
}