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

WordPress查询中如何添加多个post_type判断条件

问题根因

你之前的两种写法逻辑完全不符合预期:

  • 连续两个独立if判断的问题:第一个判断会拦截所有非property类型的请求直接返回,根本走不到后面的testimonial判断分支;就算是property类型,走到第二个判断时因为类型不是testimonial也会被拦截返回,等于所有请求都不会执行后续过滤逻辑。
  • 嵌套if判断的问题:只有当类型不是property的时候才会进入testimonial判断,等于直接把property类型排除在过滤逻辑外,和需求完全相反。
适配多Post Type的修改方案

最易维护的实现方式是把所有需要触发附件过滤的post_type存入数组,用in_array()做白名单校验,后续要新增支持的post_type直接往数组里加元素即可,不需要修改判断逻辑。
另外原代码存在两个隐藏bug:

  • 未全局声明$current_user,调用时会报变量未定义的错误
  • 按上传用户筛选附件的查询参数写成了editor,WordPress中正确的参数是author,原写法无法实现仅显示当前用户上传附件的效果

修改后的完整可运行代码如下:

add_filter( 'ajax_query_attachments_args', 'filter_query_attachments_args' );

function filter_query_attachments_args( $query ) {
    // 校验用户基础上传权限
    if ( ! current_user_can( 'upload_files' ) ) {
        wp_send_json_error();
    }

    // 管理员不做限制,需要启用请取消下方注释
    //if ( current_user_can( 'administrator' ) ) {
        //return $query;
    //}

    // 未传递关联文章ID时返回错误
    if ( ! isset( $_REQUEST['post_id'] ) ) {
        wp_send_json_error();
    }

    // 校验传入的文章ID是否为有效文章对象
    $post = get_post( (int) $_REQUEST['post_id'] );
    if ( ! $post instanceof \WP_Post ) {
        return $query;
    }

    // 白名单:配置需要触发附件权限过滤的文章类型,新增支持类型直接往数组内添加即可
    $allowed_post_types = [
        'property',
        'testimonial',
        // 如需支持第三个类型,按格式在这里添加即可,例如 'product',
    ];
    // 非白名单内的文章类型,不应用过滤规则
    if ( ! in_array( $post->post_type, $allowed_post_types, true ) ) {
        return $query;
    }
    
    // 仅显示正常状态的附件
    $query['post_status'] = 'inherit';
    // 仅显示挂载到当前文章下的附件
    $query['post_parent'] = $post->ID;
    // 仅显示当前用户自己上传的附件
    global $current_user;
    $query['author'] = $current_user->ID;

    return $query;
}

如果你后续需要扩展到3个及以上post_type,只需要在$allowed_post_types数组里按格式新增对应的post_type字符串即可,不需要改动其他逻辑。

内容的提问来源于stack exchange,提问作者neosan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:57:26