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
相关产品推荐
相关产品推荐

