You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多语言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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:24:26