设置自定义文章类型默认分类术语后无法添加新术语的问题
自定义文章类型默认分类术语与新增术语共存的问题解决
你的代码存在核心问题:wp_set_post_terms()默认以替换模式运行,每次保存文章时,都会把该分类下的所有现有术语替换成你指定的Non-Profits,导致用户新增的术语被直接覆盖,无法保留。
以下两种方案可解决问题,根据你的需求选择:
方案1:仅在文章首次创建时设置默认术语
适合允许用户后续移除默认术语的场景,仅在新文章创建时添加默认分类:
add_action('save_post', 'set_default_non_profit_term', 10, 3); function set_default_non_profit_term($post_id, $post, $update) { // 跳过自动保存和修订版 if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; if (wp_is_post_revision($post_id)) return; // 仅针对目标自定义文章类型 if ('non_profits_dir_ltg' !== $post->post_type) return; $default_term_name = 'Non-Profits'; $taxonomy = 'secondary-listing-category'; // 仅在新文章创建时设置默认术语 if (!$update) { wp_set_post_terms($post_id, $default_term_name, $taxonomy); } }
方案2:强制默认术语始终存在
适合要求默认术语必须保留,同时允许用户添加其他术语的场景:
add_action('save_post', 'enforce_default_non_profit_term', 10, 3); function enforce_default_non_profit_term($post_id, $post, $update) { // 跳过自动保存和修订版 if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; if (wp_is_post_revision($post_id)) return; // 仅针对目标自定义文章类型 if ('non_profits_dir_ltg' !== $post->post_type) return; $default_term_name = 'Non-Profits'; $taxonomy = 'secondary-listing-category'; // 获取默认术语的对象(确保术语存在) $default_term = get_term_by('name', $default_term_name, $taxonomy); if (!$default_term) return; // 获取当前文章已选的该分类术语ID列表 $current_terms = wp_get_post_terms($post_id, $taxonomy, array('fields' => 'ids')); // 如果默认术语不在已选列表中,追加进去 if (!in_array($default_term->term_id, $current_terms)) { wp_add_post_terms($post_id, $default_term->term_id, $taxonomy); } }
关键说明
- 加入了对自动保存、修订版的判断,避免不必要的重复执行
- 使用
save_post钩子的$update参数区分新文章与已存在文章 - 方案2中用
wp_add_post_terms()实现术语追加,而非替换现有内容
内容的提问来源于stack exchange,提问作者Felicia Santos
相关产品推荐
相关产品推荐

