如何阻止自定义文章以‘Auto Draft’为标题保存?
解决自定义文章以「Auto Draft」为标题保存的问题
你的代码无效的核心原因是:post_title 不是自定义字段,它是WordPress wp_posts 数据表的原生字段,不能用 update_post_meta() 来修改——这个函数只负责操作wp_postmeta表中的自定义元数据,所以你的代码根本没触碰到文章标题的实际存储位置。
下面是两种针对性的解决方案,覆盖「手动保存文章」和「自动草稿生成」两种场景:
方案1:保存文章时强制替换标题
用 save_post 钩子在文章保存时直接更新标题,同时避免无限循环问题:
add_action('save_post', 'custom_set_book_post_title', 10, 3); function custom_set_book_post_title($post_id, $post, $update) { // 跳过自动保存、修订版,只处理目标自定义文章类型(替换成你的文章类型slug,比如'book') if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; if (wp_is_post_revision($post_id)) return; if ($post->post_type !== 'book') return; // 验证用户编辑权限 if (!current_user_can('edit_post', $post_id)) return; // 当Book_Title字段有值时更新标题 if (isset($_POST['Book_Title']) && trim($_POST['Book_Title']) !== '') { $clean_title = sanitize_text_field($_POST['Book_Title']); // 临时移除钩子,避免wp_update_post触发save_post导致无限循环 remove_action('save_post', 'custom_set_book_post_title', 10); // 直接更新文章标题 wp_update_post([ 'ID' => $post_id, 'post_title' => $clean_title ]); // 重新添加钩子 add_action('save_post', 'custom_set_book_post_title', 10, 3); } }
方案2:提前修改自动草稿的标题
如果要阻止刚创建自定义文章时生成「Auto Draft」标题,可以用 wp_insert_post_data 钩子,在文章写入数据库前直接替换标题:
add_filter('wp_insert_post_data', 'custom_replace_auto_draft_title', 10, 2); function custom_replace_auto_draft_title($post_data, $post_arr) { // 只处理目标自定义文章类型的自动草稿 if ($post_data['post_type'] !== 'book' || $post_data['post_status'] !== 'auto-draft') { return $post_data; } // 当Book_Title有值时替换自动草稿标题 if (isset($post_arr['Book_Title']) && trim($post_arr['Book_Title']) !== '') { $post_data['post_title'] = sanitize_text_field($post_arr['Book_Title']); } return $post_data; }
注意事项
- 把代码中的
'book'替换成你实际使用的自定义文章类型的slug - 确保你的自定义字段
Book_Title的表单name属性确实是Book_Title,否则无法获取到值 - 两个方案可以同时使用,覆盖所有场景
内容的提问来源于stack exchange,提问作者Lloyd
相关产品推荐
相关产品推荐

