多语言WordPress站点法语日期转英文以实现日期比较
解决多语言WordPress站点自定义文章类型日期对比问题
我之前处理过不少多语言WordPress项目里的日期解析坑,你的情况很典型——英文环境下strtotime()能直接处理用户输入的start_date,但法语日期(比如类似"20 septembre 2024"这种格式)因为本地化的月份/星期名称,导致strtotime()完全识别不了,进而没法和当前日期做对比判断文章是否该下线。
下面给你两个实用的解决方案,都能完美适配WordPress的多语言场景:
方法1:用IntlDateFormatter解析本地化日期(推荐)
WordPress本身已经集成了PHP的Intl扩展(大部分主流主机都支持),用它可以直接解析法语日期为标准的时间戳,不用手动做字符串替换,更优雅也更通用。
// 获取当前文章的start_date meta值 $start_date = get_post_meta(get_the_ID(), 'start_date', true); // 针对法语环境处理日期解析 if (get_locale() === 'fr_FR') { // 初始化法语日期格式化器 $formatter = new IntlDateFormatter( 'fr_FR', IntlDateFormatter::FULL, IntlDateFormatter::NONE, wp_timezone_string(), IntlDateFormatter::GREGORIAN, 'd MMMM yyyy' // 这里要和用户输入的法语日期格式对应,比如"20 septembre 2024"就用这个 ); // 解析日期为时间戳 $start_timestamp = $formatter->parse($start_date); } else { // 英文环境直接用strtotime $start_timestamp = strtotime($start_date); } // 获取当前时间戳(用WordPress的当前时间,确保时区一致) $current_timestamp = current_time('timestamp'); // 对比判断:如果start_date过期(当前时间大于start时间),则执行下线逻辑 if ($current_timestamp > $start_timestamp) { // 这里写你的文章下线逻辑,比如修改状态、隐藏内容等 echo '该文章已过期,需要下线'; }
注意:'d MMMM yyyy'这个格式要和用户实际输入的法语日期格式完全匹配,如果用户输入的是"septembre 20, 2024",就改成'MMMM d, yyyy',需要根据实际情况调整。
方法2:手动映射法语月份到英文(兼容老版本PHP)
如果你的主机不支持Intl扩展,可以用手动替换的方式,把法语月份名称换成英文的,再用strtotime()解析:
// 获取当前文章的start_date meta值 $start_date = get_post_meta(get_the_ID(), 'start_date', true); if (get_locale() === 'fr_FR') { // 法语月份到英文的映射数组 $french_months = [ 'janvier' => 'january', 'février' => 'february', 'mars' => 'march', 'avril' => 'april', 'mai' => 'may', 'juin' => 'june', 'juillet' => 'july', 'août' => 'august', 'septembre' => 'september', 'octobre' => 'october', 'novembre' => 'november', 'décembre' => 'december' ]; // 替换法语月份为英文 $english_date = str_replace(array_keys($french_months), array_values($french_months), strtolower($start_date)); // 解析为时间戳 $start_timestamp = strtotime($english_date); } else { $start_timestamp = strtotime($start_date); } // 同样做日期对比 $current_timestamp = current_time('timestamp'); if ($current_timestamp > $start_timestamp) { // 执行下线逻辑 echo '该文章已过期,需要下线'; }
这个方法的好处是不需要依赖Intl扩展,但缺点是如果用户输入的日期格式有变化(比如缩写月份),需要同步更新映射数组。
另外,不管用哪种方法,都建议在保存start_date的时候就做一次标准化处理(比如转换成时间戳或者标准ISO格式存在meta里),这样前端展示可以用本地化格式,但后台判断的时候直接用标准格式对比,会更高效也避免多语言解析的问题。
内容的提问来源于stack exchange,提问作者armadadrive
相关产品推荐
相关产品推荐

