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

WordPress发布提交表单拦截求助:需数据存储前执行校验

WordPress 发布前校验拦截方案

方案1:admin_init 钩子拦截提交请求(推荐)

该钩子在后台初始化阶段触发,能在数据进入存储流程之前直接拦截发布/更新请求,完全适配你无法修改前端的需求:

  • 先判断当前请求是否为文章发布/更新操作:检查POST参数中的action(通常为editpost或addpost)、post_type,以及发布/保存按钮的提交标识
  • 执行自定义校验逻辑
  • 校验失败时,添加错误提示并跳回编辑页面,终止后续存储流程

示例代码:

add_action('admin_init', 'my_plugin_pre_save_validation');
function my_plugin_pre_save_validation() {
    // 过滤非文章发布/更新的请求
    if (isset($_POST['action']) && in_array($_POST['action'], ['editpost', 'addpost']) 
        && isset($_POST['post_type']) && $_POST['post_type'] === 'post'
        && (isset($_POST['publish']) || isset($_POST['save'])) ) {
        
        // 自定义校验:示例检查标题长度
        $post_title = trim($_POST['post_title']);
        if (strlen($post_title) < 5) {
            // 添加错误提示
            add_settings_error('my_plugin_errors', 'title_too_short', '文章标题不能少于5个字符', 'error');
            // 跳回编辑页面,携带错误状态
            $redirect_url = add_query_arg(
                ['post' => $_POST['post_ID'] ?? '', 'action' => 'edit', 'settings-updated' => 'false'],
                admin_url('post.php')
            );
            wp_redirect($redirect_url);
            exit; // 必须终止流程,防止数据存储
        }
    }
}

// 在编辑页面显示错误提示
add_action('admin_notices', 'my_plugin_display_errors');
function my_plugin_display_errors() {
    settings_errors('my_plugin_errors');
}

方案2:修正 wp_insert_post_data 钩子的使用

你之前使用该钩子异常,大概率是未正确返回过滤后的$data数组,或优先级设置不当。该钩子专为文章数据插入前的校验/修改设计:

  • 建议使用默认优先级10,确保逻辑能正常触发
  • 必须返回修改后的$data数组,否则会导致数据异常
  • 校验失败时可将文章状态改为草稿,避免错误数据发布

示例代码:

add_filter('wp_insert_post_data', 'my_plugin_validate_post_data', 10, 2);
function my_plugin_validate_post_data($data, $postarr) {
    // 跳过自动保存和修订版本
    if (wp_is_post_autosave($postarr['ID']) || wp_is_post_revision($postarr['ID'])) {
        return $data;
    }
    // 仅针对发布状态的文章校验
    if ($data['post_status'] === 'publish') {
        // 自定义校验:示例检查内容是否为空
        if (empty(trim($data['post_content']))) {
            $data['post_status'] = 'draft'; // 强制改为草稿
            add_settings_error('my_plugin_errors', 'empty_content', '文章内容不能为空,请完善后再发布', 'error');
        }
    }
    // 必须返回$data,否则会引发核心错误
    return $data;
}

// 显示错误提示
add_action('admin_notices', 'my_plugin_display_errors');
function my_plugin_display_errors() {
    settings_errors('my_plugin_errors');
}

方案3:pre_post_update 钩子(针对文章更新场景)

若仅需拦截文章更新操作,该钩子会在文章更新前触发,比save_post更早执行:

add_action('pre_post_update', 'my_plugin_pre_update_validation', 10, 2);
function my_plugin_pre_update_validation($post_id, $data) {
    // 跳过自动保存和修订版本
    if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
        return;
    }
    // 自定义校验:示例检查摘要是否为空
    if (empty(trim($data['post_excerpt']))) {
        // 直接终止流程并提示错误,或用方案1的redirect方式优化体验
        wp_die('文章摘要不能为空,请返回修改后再提交!');
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:20:40