WordPress自定义更新日期无法持久存储问题排查求助
问题分析与修复方案
你的代码存在两个核心问题,导致自定义更新日期在重复保存时被清空:
- 日期输入框未回显已保存值:编辑文章时,输入框默认是空的,用户未重新选择日期就保存时,会提交空字符串覆盖原有值
- 保存逻辑缺少必要验证与空值处理:未排除自动保存、未做权限校验,且空值提交时直接更新meta字段导致清空
修正后的完整代码
<?php // 添加自定义更新日期元框 function add_custom_meta_update() { global $post; // 获取已保存的自定义更新日期 $saved_date = get_post_meta($post->ID, '_cstm_update_post', true); if ($saved_date) { $cus_date = date_create($saved_date); $cus_date_format = date_format($cus_date, 'M d, Y') . " at " . date_format($cus_date, 'H:i'); $PostDate = 'Updated on: <b>' . $cus_date_format . '</b>'; } else { $PostDate = 'No update set'; } ?> <div class="misc-pub-section post_uptime"> <span id="updt-datetime"><span class="dashicons dashicons-clock"></span> <?php echo $PostDate ?></span> <a href="#edit_timestamp" class="edit-timestamp" role="button"><span class="open-updt-edit">Edit</span></a> <div id="updt-timestamp" style="display:none;" > <!-- 回显已保存的日期 --> <input type="date" name="_cstm_update_post" value="<?php echo esc_attr($saved_date); ?>"> </div> </div> <?php } add_action('post_submitbox_misc_actions', 'add_custom_meta_update'); // 保存自定义更新日期到数据库 function store_custom_update_time($post_id) { // 排除自动保存和修订版本 if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) { return; } // 检查用户权限 if (!current_user_can('edit_post', $post_id)) { return; } // 处理自定义日期字段 if (isset($_POST['_cstm_update_post'])) { $update_date = sanitize_text_field($_POST['_cstm_update_post']); if (!empty($update_date)) { update_post_meta($post_id, '_cstm_update_post', $update_date); } else { // 如果提交空值,删除该元字段 delete_post_meta($post_id, '_cstm_update_post'); } } } add_action('save_post', 'store_custom_update_time');
关键修改说明
- 输入框回显:在
input标签中添加value="<?php echo esc_attr($saved_date); ?>",让编辑页面显示已保存的日期,避免用户误提交空值 - 安全与过滤:添加自动保存/修订版本判断、用户权限校验,防止非法操作
- 空值处理:当提交的日期为空时,删除对应的meta字段,而不是设置为空字符串,符合"No update set"的显示逻辑
- 代码优化:使用
get_post_meta($post->ID, '_cstm_update_post', true)直接获取单个值,替代原代码中数组索引的写法,更简洁安全
内容的提问来源于stack exchange,提问作者dragoweb
相关产品推荐
相关产品推荐

