自定义文章类型页面中如何两次使用query_posts()并分别展示结果?
问题解决:两次查询并展示不同Tour组的方案
你的问题核心是连续调用query_posts()会覆盖前一次的主查询对象,导致第一次查询的结果被覆盖无法展示。下面提供两种可行的解决方法:
方法1:修正query_posts的使用逻辑(适配现有代码)
每次调用query_posts()后,立即执行循环展示内容,然后必须用wp_reset_query()重置主查询,再进行下一次查询:
<?php // 第一个查询:包含当前Activity的Tour $query_string = 'paged='.$paged; $query_string.= '&orderby=post_date&order=DESC&post_type=tour&meta_query[tour_activities][key]=tour_activities&meta_query[tour_activities][value]='.$current_page_id.'&meta_query[tour_activities][compare]=LIKE&suppress_filters=0&post_status=publish'; parse_str($query_string, $args); query_posts($args); ?> <h4 style="margin-bottom: 20px;">包含<?php echo get_the_title(); ?>的Tour</h4> <?php // 循环展示第一个查询的Tour卡片 if (have_posts()) : while (have_posts()) : the_post(); // 这里放你的自定义卡片HTML逻辑,示例: echo '<div class="tour-card">#'. get_the_ID(). ' '. get_the_title(). '</div>'; endwhile; else : echo '<p>暂无相关Tour</p>'; endif; // 必须重置主查询,避免影响后续逻辑 wp_reset_query(); ?> <?php // 第二个查询:包含推荐当前Activity的Tour $query_string2 = 'paged='.$paged; $query_string2.= '&orderby=post_date&order=DESC&post_type=tour&meta_query[tour_activities_suggested][key]=tour_activities_suggested&meta_query[tour_activities_suggested][value]='.$current_page_id.'&meta_query[tour_activities_suggested][compare]=LIKE&suppress_filters=0&post_status=publish'; parse_str($query_string2, $args); query_posts($args); ?> <h4 style="margin-bottom: 20px;">包含推荐<?php echo get_the_title(); ?>的Tour</h4> <?php // 循环展示第二个查询的Tour卡片 if (have_posts()) : while (have_posts()) : the_post(); // 复用相同的卡片HTML逻辑 echo '<div class="tour-card">#'. get_the_ID(). ' '. get_the_title(). '</div>'; endwhile; else : echo '<p>暂无相关Tour</p>'; endif; // 重置主查询 wp_reset_query(); ?>
方法2:使用WP_Query(推荐,更规范)
WP_Query是WordPress官方推荐的自定义查询方式,不会干扰主查询,还能封装重复逻辑减少代码冗余:
<?php // 封装Tour卡片展示的公共函数,避免重复写循环逻辑 function display_tour_cards($tour_query) { if ($tour_query->have_posts()) : while ($tour_query->have_posts()) : $tour_query->the_post(); // 这里放你的自定义卡片HTML逻辑 echo '<div class="tour-card">#'. get_the_ID(). ' '. get_the_title(). '</div>'; endwhile; // 重置全局post数据,避免影响后续代码 wp_reset_postdata(); else : echo '<p>暂无相关Tour</p>'; endif; } // 第一个查询:包含当前Activity的Tour $args1 = array( 'paged' => $paged, 'orderby' => 'post_date', 'order' => 'DESC', 'post_type' => 'tour', 'post_status' => 'publish', 'suppress_filters' => 0, 'meta_query' => array( array( 'key' => 'tour_activities', 'value' => $current_page_id, 'compare' => 'LIKE' ) ) ); $tour_query1 = new WP_Query($args1); ?> <h4 style="margin-bottom: 20px;">包含<?php echo get_the_title(); ?>的Tour</h4> <?php display_tour_cards($tour_query1); ?> // 第二个查询:包含推荐当前Activity的Tour $args2 = array( 'paged' => $paged, 'orderby' => 'post_date', 'order' => 'DESC', 'post_type' => 'tour', 'post_status' => 'publish', 'suppress_filters' => 0, 'meta_query' => array( array( 'key' => 'tour_activities_suggested', 'value' => $current_page_id, 'compare' => 'LIKE' ) ) ); $tour_query2 = new WP_Query($args2); ?> <h4 style="margin-bottom: 20px;">包含推荐<?php echo get_the_title(); ?>的Tour</h4> <?php display_tour_cards($tour_query2); ?>
为什么原代码失效?
query_posts()会直接替换WordPress全局的$wp_query对象,你第一次查询后没有立即执行循环展示,紧接着调用第二次查询就覆盖了第一次的结果,所以只能看到第二组Tour。
内容的提问来源于stack exchange,提问作者wordpressnoobo
相关产品推荐
相关产品推荐

