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

WordPress自定义更新日期无法持久存储问题排查求助

问题分析与修复方案

你的代码存在两个核心问题,导致自定义更新日期在重复保存时被清空:

  1. 日期输入框未回显已保存值:编辑文章时,输入框默认是空的,用户未重新选择日期就保存时,会提交空字符串覆盖原有值
  2. 保存逻辑缺少必要验证与空值处理:未排除自动保存、未做权限校验,且空值提交时直接更新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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:40:21