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

WordPress查询Cast自定义文章类型按关联Show的year字段排序求助

解决方案:按关联Show的年份排序Cast记录

要实现按Cast关联的Show的year字段排序,你需要通过JOIN关联Show的元数据表,直接获取Show的年份字段来排序。以下是两种可行的实现方式:

方式一:使用WP_Query的自定义JOIN和ORDERBY参数(推荐)

这种方式无需额外过滤器,直接在查询中定义关联逻辑,代码更简洁:

// 获取当前人员的ID
$post_id = get_the_ID();
global $wpdb;

// 构建Cast查询,关联Show的年份字段排序
$cast_query = new WP_Query(array(
    'post_type'         => 'cast',
    'posts_per_page'    => -1,
    'post_status'       => 'publish',
    'distinct'          => true, // 可选:避免同一Show的多个Cast角色重复显示
    'meta_query'        => array(
        array(
            'key'       => 'actor',
            'value'     => $post_id,
            'compare'   => '='
        )
    ),
    // JOIN关联Cast的Show字段和Show的年份字段
    'join' => " LEFT JOIN {$wpdb->postmeta} AS cast_show 
                ON {$wpdb->posts}.ID = cast_show.post_id AND cast_show.meta_key = 'show' 
                LEFT JOIN {$wpdb->postmeta} AS show_year 
                ON cast_show.meta_value = show_year.post_id AND show_year.meta_key = 'year' ",
    // 按Show的年份数值排序,可改为DESC实现倒序
    'orderby' => 'show_year.meta_value_num ASC'
));

方式二:使用posts_join和posts_orderby过滤器

如果需要复用关联逻辑,可通过WordPress过滤器实现:

$post_id = get_the_ID();

// 添加JOIN和排序过滤器
add_filter('posts_join', 'cast_join_show_year');
add_filter('posts_orderby', 'cast_orderby_show_year');

function cast_join_show_year($join) {
    global $wpdb;
    // 关联Cast的Show字段和Show的年份字段
    $join .= " LEFT JOIN {$wpdb->postmeta} AS cast_show 
               ON {$wpdb->posts}.ID = cast_show.post_id AND cast_show.meta_key = 'show' 
               LEFT JOIN {$wpdb->postmeta} AS show_year 
               ON cast_show.meta_value = show_year.post_id AND show_year.meta_key = 'year' ";
    return $join;
}

function cast_orderby_show_year($orderby) {
    // 按Show的年份数值升序排序
    return "show_year.meta_value_num ASC";
}

// 执行查询
$cast_query = new WP_Query(array(
    'post_type'         => 'cast',
    'posts_per_page'    => -1,
    'post_status'       => 'publish',
    'distinct'          => true,
    'meta_query'        => array(
        array(
            'key'       => 'actor',
            'value'     => $post_id,
            'compare'   => '='
        )
    )
));

// 移除过滤器,避免影响后续查询
remove_filter('posts_join', 'cast_join_show_year');
remove_filter('posts_orderby', 'cast_orderby_show_year');

关键注意事项

  • 替换字段名:确保cast_show.meta_key = 'show'中的show是Cast类型中关联Show的元字段名,show_year.meta_key = 'year'中的year是Show类型中存储年份的元字段名,根据你的实际字段名修改。
  • 排序类型:如果年份是字符串格式,将meta_value_num改为meta_value;需要倒序排序则把ASC改为DESC。
  • 去重:添加'distinct' => true可以避免同一Show下多个Cast角色重复展示(如果不需要保留所有角色可开启)。

内容的提问来源于stack exchange,提问作者omarkoza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:05:09