能否通过WordPress钩子获取含元数据与图片的get_terms数据?
获取包含元数据与图片的WordPress分类术语数据
默认情况下,get_terms()不会自动返回术语的元数据——即使你添加了meta_key参数,它也仅用于筛选符合条件的术语,不会将元数据包含到返回结果中。以下是两种无需自定义SQL、符合WordPress规范的解决方案:
方案一:批量加载元数据(推荐,性能最优)
通过WordPress内置的缓存机制批量加载元数据,避免循环中重复查询数据库:
// 获取目标分类下的所有术语 $airlines_terms = get_terms([ 'taxonomy' => 'air_line', 'hide_empty' => false, 'meta_key' => 'IATA_airline_code', // 筛选存在该元数据的术语 ]); // 批量加载术语元数据到缓存,后续调用get_term_meta直接取缓存 if (!empty($airlines_terms)) { $term_ids = wp_list_pluck($airlines_terms, 'term_id'); update_term_meta_cache($term_ids); } // 整理包含元数据和图片的数组 $airlines_data = []; foreach ($airlines_terms as $term) { // 获取元数据(从缓存读取,无额外查询) $iata_code = get_term_meta($term->term_id, 'IATA_airline_code', true); // 处理图片(假设图片ID存储在名为airline_logo的元字段中) $logo_id = get_term_meta($term->term_id, 'airline_logo', true); $logo_url = ''; if ($logo_id) { $logo_info = wp_get_attachment_image_src($logo_id, 'full'); $logo_url = $logo_info ? $logo_info[0] : ''; } $airlines_data[] = [ 'id' => $term->term_id, 'name' => $term->name, 'slug' => $term->slug, 'iata_code' => $iata_code, 'logo_url' => $logo_url ]; }
这种方法利用WordPress的元数据缓存机制,仅触发1次元数据查询,性能远优于循环中逐个调用get_term_meta。
方案二:使用terms_clauses钩子修改查询
通过钩子直接修改get_terms()生成的SQL语句,让查询结果包含指定元数据:
add_filter('terms_clauses', function($clauses, $taxonomies, $args) { // 仅针对air_line分类和指定场景触发 if (!in_array('air_line', $taxonomies) || empty($args['include_meta'])) { return $clauses; } global $wpdb; // 关联termmeta表 $clauses['join'] .= " INNER JOIN {$wpdb->termmeta} tm ON tm.term_id = t.term_id"; // 追加需要的元字段到查询结果 $clauses['fields'] .= ", tm.meta_value AS iata_code"; // 筛选目标元键 $clauses['where'] .= " AND tm.meta_key = 'IATA_airline_code'"; return $clauses; }, 10, 3); // 调用get_terms时传入自定义参数触发钩子 $airlines_terms = get_terms([ 'taxonomy' => 'air_line', 'hide_empty' => false, 'include_meta' => true ]);
注意:这种方法适合仅需少量固定元字段的场景,如果需要多个元字段或处理图片,仍需额外批量处理,不如方案一灵活高效。
内容的提问来源于stack exchange,提问作者Mohib Salahuddin Ayubi
相关产品推荐
相关产品推荐

