WordPress中如何用get_terms筛选关联含discount元键的job_category术语?
解决方案:获取关联带'discount'元数据的Job文章的分类术语
我给你整理了两种实用的方案,你可以根据自己的场景选择:
方案一:用WordPress内置函数(规范且易维护)
这种方法遵循WordPress的开发规范,用官方提供的函数实现,兼容性更好,适合大多数常规场景。
核心思路是:先筛选出所有带有discount元键的job类型文章,再提取这些文章关联的job_category分类术语,最后去重避免重复输出。
代码示例:
// 1. 查询所有符合条件的Job文章(仅获取ID以提升性能) $args = array( 'post_type' => 'job', 'posts_per_page' => -1, // 拉取全部符合条件的文章 'meta_query' => array( array( 'key' => 'discount', 'compare' => 'EXISTS' // 只要求存在这个元键,不管具体数值 ) ), 'fields' => 'ids' // 仅返回文章ID,减少数据传输 ); $qualified_jobs = new WP_Query($args); if ($qualified_jobs->have_posts()) { $unique_categories = array(); // 2. 遍历文章,收集关联的分类术语 foreach ($qualified_jobs->posts as $job_id) { $terms = get_the_terms($job_id, 'job_category'); // 避免错误,确保分类获取成功 if ($terms && !is_wp_error($terms)) { foreach ($terms as $term) { // 用分类ID作为键,自动去重 $unique_categories[$term->term_id] = $term; } } } // 3. 输出或使用这些分类 foreach ($unique_categories as $category) { echo '<li><a href="' . get_term_link($category) . '">' . $category->name . '</a></li>'; } } // 重置查询,避免影响后续的WordPress循环 wp_reset_postdata();
方案二:直接SQL查询(性能更优,适合大数据量)
如果你的站点Job文章数量很多,多次调用get_the_terms可能会有性能损耗,这时直接用SQL关联表查询会更高效。
代码示例:
global $wpdb; // 编写关联查询,直接从数据库获取符合条件的分类 $query = $wpdb->prepare(" SELECT DISTINCT t.* FROM {$wpdb->posts} p INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id INNER JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON tt.term_id = t.term_id WHERE p.post_type = %s AND p.post_status = 'publish' AND pm.meta_key = %s AND tt.taxonomy = %s ", 'job', 'discount', 'job_category'); $qualified_categories = $wpdb->get_results($query); // 输出结果 if (!empty($qualified_categories)) { foreach ($qualified_categories as $category) { echo '<li><a href="' . get_term_link($category) . '">' . $category->name . '</a></li>'; } }
注意事项
- 两种方案都默认只筛选已发布(publish状态)的文章,如果需要包含其他状态,可以调整
post_status参数(比如改成any)。 - 方案一中的
EXISTS比较符需要WordPress 3.5及以上版本支持,如果你的版本过低,可以改用value为空字符串且compare为!=的方式,但效果略有差异。
内容的提问来源于stack exchange,提问作者MMILAD
相关产品推荐
相关产品推荐

