You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:05:03