You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 06:15:43