WordPress如何获取同时关联第二个自定义分类法的分类术语
实现思路判断
你原有直接查询brand分类法术语的思路确实无法实现需求,get_terms仅支持筛选术语本身的属性,无法直接关联跨分类法的文章绑定关系,你需要先查询models自定义文章类型的内容,再提取同时关联两种分类法的品牌术语。
另外你现有代码还有逻辑缺陷:仅渲染了空的<optgroup>标签,没有实际的下拉选项内容。
完整实现代码
以下代码可直接放在type分类法的归档模板中使用:
// 获取当前归档页的车型术语 $current_type = get_queried_object(); if ( ! $current_type instanceof WP_Term || $current_type->taxonomy !== 'type' ) { return; } // 仅查询符合当前车型的models文章ID,降低性能开销 $models_query = new WP_Query( [ 'post_type' => 'models', 'posts_per_page' => -1, 'fields' => 'ids', 'tax_query' => [ [ 'taxonomy' => 'type', 'field' => 'term_id', 'terms' => $current_type->term_id, ] ] ] ); if ( empty( $models_query->posts ) ) { echo '暂无对应品牌'; return; } // 提取所有关联的品牌ID并去重 $brand_ids = []; foreach ( $models_query->posts as $model_id ) { $post_brands = wp_get_post_terms( $model_id, 'brand', [ 'fields' => 'ids' ] ); if ( ! is_wp_error( $post_brands ) ) { $brand_ids = array_merge( $brand_ids, $post_brands ); } } $brand_ids = array_unique( $brand_ids ); // 查询符合条件的品牌术语,默认过滤顶级品牌 $brands = get_terms( [ 'taxonomy' => 'brand', 'include' => $brand_ids, 'hide_empty' => false, 'parent' => 0 ] ); if ( ! empty( $brands ) ) { $output = '<select>'; foreach ( $brands as $brand ) { // 若需要保留optgroup结构,可在此处查询当前品牌的子术语,把option嵌套在optgroup内即可 $output .= sprintf( '<option value="%s">%s</option>', esc_attr( get_term_link( $brand ) ), esc_html( $brand->name ) ); } $output .= '</select>'; echo $output; }
性能优化提示
如果站点models文章量超过1000篇,建议用自定义SQL直接查询关联的术语ID,避免循环调用wp_get_post_terms产生大量数据库查询,中小站点以上代码可直接正常运行。
内容的提问来源于stack exchange,提问作者Cray
相关产品推荐
相关产品推荐

