WordPress自定义文章类型jobs保存时如何阻止默认content字段保存?
实现方案说明
首先要厘清一个非常容易踩的钩子使用误区:
pre_post_update是动作钩子,仅负责在文章数据即将写入数据库前发通知,传入的$data参数是本次要写入的全量文章字段,但这个参数不支持直接修改后回传给核心写入逻辑——也就是说你在这个钩子里直接修改$data['post_content']是完全无效的,根本拦不住内容更新。
要实现「jobs类型文章保存时,仅锁定默认内容字段不被覆盖、其余字段正常保存」的需求,核心逻辑非常简单:在WP把文章数据写入wp_posts表之前,把即将写入的post_content值替换成数据库里已存在的旧值,拦截新提交的编辑内容即可。
推荐实现代码
使用天然支持修改写入数据的wp_insert_post_data过滤钩子,无冗余数据库操作,稳定性最好:
add_filter( 'wp_insert_post_data', 'prefix_lock_jobs_post_content', 10, 2 ); function prefix_lock_jobs_post_content( $data, $postarr ) { // 非jobs类型文章直接放行,不做任何处理 if ( 'jobs' !== $data['post_type'] ) { return $data; } // 排除自动保存、文章修订的系统场景,避免误拦截核心功能 if ( wp_is_post_autosave( $postarr['ID'] ) || wp_is_post_revision( $postarr['ID'] ) ) { return $data; } // 取出数据库中该文章原本存储的内容值 $original_post = get_post( $postarr['ID'] ); if ( $original_post ) { // 强制把即将写入的内容替换为旧值,直接拦截新提交的内容 $data['post_content'] = $original_post->post_content; } return $data; }
方案效果
- 自定义字段、发布时间、文章标题、自定义分类/标签等所有其余内容,都会按照后台提交的内容正常保存,完全不受影响
- 后台大段文本的"描述"编辑框,管理员就算输入新内容、修改原有文本,点保存时最终落库的还是之前存储的旧内容,新输入的内容不会被写入
- WP原生的自动保存、修订版本生成等系统逻辑,不会被这个规则干扰,运行完全正常
基于你现有代码框架的补充实现
如果你确实想沿用pre_post_update钩子来做逻辑,也可以完成功能,但会多一次冗余的数据库回写操作,不推荐生产环境使用:
add_action( 'pre_post_update', 'prefix_prevent_job_description_admin_save', 10, 2 ); function prefix_prevent_job_description_admin_save( $post_id, $data ) { if ( 'jobs' !== get_post_type( $post_id ) ) return; if ( wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id ) ) return; // 先提前取出数据库中存储的旧内容 $original_content = get_post_field( 'post_content', $post_id ); // 等WP完成本次文章写入后,立刻把内容字段改回旧值 add_action( 'post_updated', function() use ( $post_id, $original_content ) { global $wpdb; $wpdb->update( $wpdb->posts, [ 'post_content' => $original_content ], [ 'ID' => $post_id ] ); // 清除文章缓存,保证后续读取到的是正确的旧内容 clean_post_cache( $post_id ); } ); }
内容的提问来源于stack exchange,提问作者Emil
相关产品推荐
相关产品推荐

