如何通过ACF关联员工的availability术语过滤WordPress Office查询
过滤Office查询中关联的可用员工(Availability=Yes)
要实现仅显示关联availability术语为yes的员工的Office查询,需要结合员工的分类信息与现有关联字段过滤逻辑,以下是两种可行方案:
方案一:先获取可用员工ID,再过滤Office
先查询所有标记为“可用”的员工ID,再通过ACF关联字段筛选关联这些员工的Office:
// 1. 获取所有availability=yes的员工ID $available_employee_ids = get_posts(array( 'post_type' => 'employee', 'posts_per_page' => -1, 'fields' => 'ids', // 仅返回ID,提升性能 'tax_query' => array( array( 'taxonomy' => 'availability', // 替换为你的分类法实际slug 'field' => 'slug', 'terms' => 'yes', ), ), )); // 2. 构建Office查询参数 $args = array( 'post_type' => 'office', 'posts_per_page' => -1, 'order' => 'ASC' ); // 组合双重过滤条件:关联指定办公室 + 关联的员工在可用列表中 $args['meta_query'] = array( 'relation' => 'AND', // 原有:筛选关联指定办公室的条件 array( 'key' => 'acf_employee_relationship_field', // 替换为你的ACF字段键 'value' => $selected_office, 'compare' => 'LIKE', ), // 新增:筛选关联可用员工的条件(适配ACF关系字段的序列化存储) array( 'relation' => 'OR', ) ); // 为每个可用员工ID添加LIKE条件(匹配序列化数组中的ID格式) foreach($available_employee_ids as $emp_id) { $args['meta_query'][1][] = array( 'key' => 'acf_employee_relationship_field', 'value' => '"' . $emp_id . '"', 'compare' => 'LIKE', ); } // 执行查询 $office_query = new WP_Query($args);
方案二:通过SQL JOIN关联分类表(性能更优)
直接通过posts_join和posts_where钩子扩展SQL查询,关联员工的分类信息,避免多次查询:
// 定义JOIN钩子:关联员工的元数据与分类表 function filter_offices_by_available_employees($join) { global $wpdb; $join .= " INNER JOIN {$wpdb->postmeta} AS emp_meta ON {$wpdb->posts}.ID = emp_meta.post_id INNER JOIN {$wpdb->term_relationships} AS emp_tr ON emp_meta.meta_value = emp_tr.object_id INNER JOIN {$wpdb->term_taxonomy} AS emp_tt ON emp_tr.term_taxonomy_id = emp_tt.term_taxonomy_id INNER JOIN {$wpdb->terms} AS emp_terms ON emp_tt.term_id = emp_terms.term_id "; return $join; } // 定义WHERE钩子:添加分类过滤条件 function filter_offices_where_clause($where) { global $wpdb; $where .= " AND emp_meta.meta_key = 'acf_employee_relationship_field' AND emp_tt.taxonomy = 'availability' AND emp_terms.slug = 'yes' "; return $where; } // 添加钩子到查询 add_filter('posts_join', 'filter_offices_by_available_employees'); add_filter('posts_where', 'filter_offices_where_clause'); // 原有Office查询参数 $args = array( 'post_type' => 'office', 'posts_per_page' => -1, 'order' => 'ASC' ); $args['meta_query'][] = array( 'key' => 'acf_employee_relationship_field', 'value' => $selected_office, 'compare' => 'LIKE', ); // 执行查询 $office_query = new WP_Query($args); // 移除钩子,避免影响后续其他查询 remove_filter('posts_join', 'filter_offices_by_available_employees'); remove_filter('posts_where', 'filter_offices_where_clause');
注意事项
- 替换代码中的
acf_employee_relationship_field为你实际使用的ACF关联字段键名 - 确认分类法的slug是
availability,如果不是,替换为你创建的分类法实际slug - 方案一适合数据量较小的场景,方案二性能更优,适合大数据量场景
内容的提问来源于stack exchange,提问作者CrisC
相关产品推荐
相关产品推荐

