在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安全,而且可以随时启停。
- 安装并激活Code Snippets插件
- 进入「Snippets」→「Add New」,新建一个代码片段
- 粘贴下面的代码,记得把代码里的
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();
- 点击「Save Changes and Activate」激活这个片段,然后访问你的网站前台任意页面,代码就会执行转换
- 执行完后,立刻回到这个代码片段,把最后一行
convert_date_format();注释掉(改成// convert_date_format();),或者直接删除这个片段,防止重复执行导致数据错误
第三步:验证转换结果
转换完成后,随便找几个之前的帖子,检查自定义字段里的日期是不是已经变成Ymd格式了,然后测试你的日期排序功能(&start_date=20180201&end_date=20180228),应该就能和手动创建的帖子正常匹配排序了。
为什么不用普通的正则替换插件?
因为正则只能匹配字符串,没法识别月份名称对应的数字——比如它知道「February」是月份,但没法自动转成「02」。用PHP的DateTime类就能完美解决这个问题,还能自动处理日期的合法性(比如避免出现无效日期)。
内容的提问来源于stack exchange,提问作者Randy Hoffman
相关产品推荐
相关产品推荐

