如何用update_post_meta()更新WordPress的ACF日期字段?
解决ACF日期字段用
update_post_meta()更新失败的问题 我之前也踩过这个坑!ACF的日期字段(不管是jQuery Datepicker类型还是原生Date类型)不会直接识别DD/MM/YYYY这种格式化的字符串,因为它默认会把日期存储为数据库友好的YYYYMMDD格式(或者如果你的字段设置里选了存储为时间戳,那就是整数类型的时间戳)。你直接传22/09/2018这种格式,ACF没法解析,自然更新失败。
下面给你两种可行的解决方案:
方案一:用ACF官方推荐的update_field()函数(更稳妥)
ACF提供了专门的update_field()函数,它会自动处理字段的存储格式转换,比直接调用update_post_meta()更可靠,还能触发ACF的相关钩子。代码示例:
// 先把你的日期字符串转换成DateTime对象 $date_str = $arr[9]; // 你的日期:22/09/2018 $date_obj = DateTime::createFromFormat('d/m/Y', $date_str); // 检查转换是否成功 if ($date_obj) { // 转换成ACF默认的存储格式YYYYMMDD $acf_date = $date_obj->format('Ymd'); // 使用update_field更新(第一个参数是ACF字段的键名,第二个是值,第三个是文章ID) update_field('last_date', $acf_date, $post_id); } else { // 处理日期格式错误的情况 error_log('日期格式解析失败:' . $date_str); }
方案二:直接用update_post_meta()(需要手动匹配存储格式)
如果你坚持要用update_post_meta(),那必须确保传入的值和ACF字段设置的存储格式完全一致:
$date_str = $arr[9]; $date_obj = DateTime::createFromFormat('d/m/Y', $date_str); if ($date_obj) { $acf_date = $date_obj->format('Ymd'); // 对应ACF默认的存储格式 update_post_meta($post_id, 'last_date', $acf_date); }
额外注意事项
- 如果你在ACF字段设置里修改了「存储格式」(比如改成了
Y-m-d或者时间戳),那上面的format()参数也要对应调整:- 存储格式为
Y-m-d:用$date_obj->format('Y-m-d') - 存储格式为时间戳:用
$date_obj->getTimestamp()
- 存储格式为
- 一定要用
DateTime::createFromFormat()来解析日期,不要手动用explode()分割,避免处理不同分隔符(比如-或者.)或者日期月份顺序搞反的问题。
内容的提问来源于stack exchange,提问作者Alex Leibovich
相关产品推荐
相关产品推荐

