
本文详解如何在 wordpress 中通过 php 时间函数精准判断当前是否处于客服工作时段,并动态输出对应提示文本,重点修复原逻辑中边界时间(如17:00整点)判断失效的问题。
本文详解如何在 wordpress 中通过 php 时间函数精准判断当前是否处于客服工作时段,并动态输出对应提示文本,重点修复原逻辑中边界时间(如17:00整点)判断失效的问题。
在构建多语言或本地化服务型网站时,实时显示客服可联系状态(如“今日营业至17:00”或“当前已关闭”)能显著提升用户体验。但实现该功能的关键在于时间逻辑的严谨性——尤其需注意时间边界的包含关系(如“17:00”是否属于开放时段)、星期标识的一致性,以及服务器时区的正确配置。
以下是一个经过优化、生产可用的 WordPress 短代码实现:
function customer_service_phone() {
// 确保使用欧洲阿姆斯特丹时区(推荐在 wp-config.php 或主题 functions.php 开头统一设置)
date_default_timezone_set('Europe/Amsterdam');
$day = (int) date('N'); // 'N': ISO-8601 星期编号(1=周一,7=周日),比 'w'(0=周日)更符合业务语义
$hour = (int) date('H'); // 强制转为整数,避免字符串比较陷阱
// 周一:13:00–16:59(含13:00,不含17:00)
if ($day === 1 && $hour >= 13 && $hour < 17) {
$message = "We zijn vandaag bereikbaar tot 17.00 uur.";
}
// 周二至周五:09:00–16:59
elseif ($day >= 2 && $day <= 5 && $hour >= 9 && $hour < 17) {
$message = "We zijn vandaag bereikbaar tot 17.00 uur.";
}
// 其他所有情况(含周末、工作日早于09:00/晚于或等于17:00)
else {
$message = "We zijn momenteel gesloten. Stuur een e-mail en we nemen z.s.m. contact met je op.";
}
echo esc_html($message); // 使用 esc_html() 更适合输出可见文本,比 esc_attr() 更安全
}
add_shortcode('availability_phone', 'customer_service_phone');✅ 关键改进说明:
- 使用 date('N') 替代 'w':N 返回 1–7(周一至周日),语义清晰,避免周日为 0 导致逻辑混淆;
- 使用 (int) 强制类型转换:防止字符串 '9' > '13' 这类字典序误判(原问题中 $time > '9' 在字符串比较下会返回 true,因 '9' > '1');
- 边界条件修正:将 > 改为 >=(起始时间包含),< 17 精确排除 17:00 整点(即 17:00 起显示“已关闭”),彻底解决原文中“17:00 后仍显示开放”的核心 Bug;
- 安全输出:改用 esc_html() 替代 esc_attr(),因输出内容为页面正文文本,非 HTML 属性值;
- 逻辑分组更清晰:用 $day >= 2 && $day <= 5 明确表达“周二到周五”,可读性与可维护性更强。
⚠️ 注意事项:
- 请勿在短代码函数内重复调用 date_default_timezone_set()(除非确保全局未设置)。更佳实践是在 wp-config.php 中添加 date_default_timezone_set('Europe/Amsterdam');,或在主题 functions.php 开头统一设定;
- 若站点启用对象缓存或页面静态化插件(如 WP Super Cache),该短代码可能被缓存导致时间不更新。建议配合 AJAX 动态加载,或禁用该 shortcode 的缓存;
- 测试时建议使用 date('Y-m-d H:i:s', strtotime('+2 hours')) 模拟不同时段,验证各分支逻辑。
将上述代码添加至当前主题的 functions.php 文件后,即可在任意文章/页面中插入 [availability_phone] 短代码,实时响应访客访问时刻,提供准确的服务状态提示。

















