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

在WordPress中使用Regex替换日期格式(长月份名)并移除时间

解决WordPress中日期格式的正则查找替换问题

嘿,我来帮你搞定这个日期格式转换的问题!要把F j, Y g:i a格式(比如「February 16, 2018 3:00 PM」)转成Ymd(「20180216」),单纯靠普通的正则替换搞不定——因为正则没法把月份名称(比如February)转成数字02,得结合PHP的日期处理功能来实现。下面是具体的操作步骤,全程安全可靠:

第一步:先备份数据库!

这步绝对不能省!不管你用什么工具替换,先把整个数据库备份好,万一出问题能立刻恢复。可以用WordPress自带的导出工具,或者用主机面板的数据库备份功能。

第二步:用Code Snippets插件执行转换代码

我推荐用Code Snippets插件来运行自定义PHP代码,比直接改主题functions.php安全,而且可以随时启停。

  1. 安装并激活Code Snippets插件
  2. 进入「Snippets」→「Add New」,新建一个代码片段
  3. 粘贴下面的代码,记得把代码里的your_meta_key_here替换成你实际存储日期的自定义字段键名(比如start_date):
function convert_date_format() {
    global $wpdb;
    // 替换成你实际的自定义字段键名
    $meta_key = 'your_meta_key_here';
    
    // 筛选出所有需要转换的日期记录
    $results = $wpdb->get_results(
        $wpdb->prepare(
            "SELECT post_id, meta_value FROM $wpdb->postmeta WHERE meta_key = %s AND meta_value REGEXP %s",
            $meta_key,
            '[A-Za-z]+ \d{1,2}, \d{4} \d{1,2}:\d{2} (AM|PM)'
        )
    );
    
    if (empty($results)) {
        echo '没有找到需要转换的日期记录。';
        return;
    }
    
    foreach ($results as $result) {
        $old_date = $result->meta_value;
        // 用PHP的DateTime类解析原日期格式
        $date_obj = DateTime::createFromFormat('F j, Y g:i a', $old_date);
        if ($date_obj) {
            // 格式化为Ymd格式
            $new_date = $date_obj->format('Ymd');
            // 更新数据库里的日期值
            $wpdb->update(
                $wpdb->postmeta,
                array('meta_value' => $new_date),
                array('post_id' => $result->post_id, 'meta_key' => $meta_key),
                array('%s'),
                array('%d', '%s')
            );
            echo '已转换帖子ID ' . $result->post_id . ' 的日期:' . $old_date . ' → ' . $new_date . '<br>';
        } else {
            echo '无法解析帖子ID ' . $result->post_id . ' 的日期:' . $old_date . '<br>';
        }
    }
}
// 运行一次转换,完成后一定要注释掉这行!
convert_date_format();
  1. 点击「Save Changes and Activate」激活这个片段,然后访问你的网站前台任意页面,代码就会执行转换
  2. 执行完后,立刻回到这个代码片段,把最后一行convert_date_format();注释掉(改成// convert_date_format();),或者直接删除这个片段,防止重复执行导致数据错误

第三步:验证转换结果

转换完成后,随便找几个之前的帖子,检查自定义字段里的日期是不是已经变成Ymd格式了,然后测试你的日期排序功能(&start_date=20180201&end_date=20180228),应该就能和手动创建的帖子正常匹配排序了。

为什么不用普通的正则替换插件?

因为正则只能匹配字符串,没法识别月份名称对应的数字——比如它知道「February」是月份,但没法自动转成「02」。用PHP的DateTime类就能完美解决这个问题,还能自动处理日期的合法性(比如避免出现无效日期)。

内容的提问来源于stack exchange,提问作者Randy Hoffman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:17:52