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
相关产品推荐
相关产品推荐

