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
相关产品推荐
相关产品推荐

