PHP中if语句如何正确判断WordPress指定分类设置文章私有
代码错误原因及修复方案
两段代码的核心问题
第一段代码错误点
- 变量类型不匹配:
wp_insert_post_data钩子传入的$post参数是数组格式,你用对象属性写法$post->ID无法获取到文章ID,get_the_category()拿不到有效分类数据,判断逻辑永远不会触发。 - 返回值格式不匹配:即使你拿到了正确的文章ID,
get_the_category()返回的是WP_Term分类对象数组,不是纯数字ID的数组,直接和[11]做等值比较永远返回false。
第二段代码错误点
- 数组比对逻辑过于严格:
$post['post_category']虽然是分类ID数组,但直接用==和[11]做整数组等值判断兼容性极差:- 新文章首次创建、自动保存触发钩子时,分类数据还未完成绑定,默认值是
[0](未分类) - 古腾堡编辑器走REST API保存、或其他插件介入保存流程时,分类数组可能携带额外键名、或暂时为空,整组比对很容易失效
- 新文章首次创建、自动保存触发钩子时,分类数据还未完成绑定,默认值是
- 未排除无效触发场景:文章修订版、自动草稿、回收站内容触发钩子时,分类数据本身是无效的,也会干扰判断结果。
可用修复代码
你需要改用in_array()判断目标分类ID是否存在于分类数组中,同时通过钩子的第二个参数$postarr获取更可靠的提交数据,兼容不同编辑器的保存逻辑:
// 注意需要声明接收2个参数 add_filter('wp_insert_post_data', 'force_type_private', 10, 2); function force_type_private($data, $postarr) { // 跳过不需要处理的场景 if ( $data['post_status'] === 'trash' || $data['post_type'] !== 'post' // 只处理普通文章,排除页面、自定义类型等 || wp_is_post_autosave($postarr['ID']) // 跳过自动保存 || wp_is_post_revision($postarr['ID']) // 跳过修订版本 ) { return $data; } $target_cat_id = 11; $cat_ids = []; // 优先从提交数据中获取分类ID if (!empty($postarr['post_category'])) { $cat_ids = array_map('intval', $postarr['post_category']); } elseif (!empty($postarr['ID'])) { // 提交数据无分类信息时,取文章已绑定的分类(兼容更新场景) $cat_ids = array_map('intval', wp_get_post_categories($postarr['ID'])); } // 只要分类中包含目标ID就设为私有,不要求文章只绑定这一个分类 if (in_array($target_cat_id, $cat_ids)) { $data['post_status'] = 'private'; } return $data; }
补充说明:这段代码即使你后续给文章绑定多个分类也能正常生效,不用限制文章只能归属一个分类。
内容的提问来源于stack exchange,提问作者Eline
相关产品推荐
相关产品推荐

