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

自定义文章类型页面中如何两次使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:15:29