在search.php中的一个页面上使用带有多个循环的WP_QUERY

时间:2012-01-24 作者:Nathan

我正在尝试设置一个搜索页面,首先显示一个包含所有帖子的循环,其中自定义字段meta\\u键为“seek\\u premium”,其中meta\\u值为“yes”,然后是第二个循环,其中meta\\u值(相同的meta\\u键)为空。大部分情况下我都能做到,但我的做法似乎打破了默认的搜索功能,因为如果我进行搜索,无论帖子是否包含搜索查询,我最终会在第一个循环中看到所有标记为“seek\\u premium”的帖子,在第二个循环中看到所有“seek\\u premium”为空的帖子。这是我的代码:

<?php if ( have_posts() ) : ?>
    <h1>My Heading</h1>
    <?php
        $premium_query = new WP_Query( array( \'meta_key\' => \'seek_premium\', \'meta_value\' => \'yes\' ) );
        while ( $premium_query->have_posts() ) : $premium_query->the_post(); 
            $seekpremium = get_post_meta( $post->ID, \'seek_premium\', true );
    ?>
            SHOW PREMIUM POSTS                                                                                  
        <?php endwhile; ?> 
    <?php
        $free_query = new WP_Query( \'post_per_page=50\' );
        while ( $free_query->have_posts() ) : $free_query->the_post();
            $seekpremium = get_post_meta( $post->ID, \'seek_premium\', true );
            if ( !empty( $seekpremium ) )
                continue;
    ?>
            SHOW FREE POSTS                                                     
        <?php endwhile; ?> 
<?php else : ?>
    <?php include ( TEMPLATEPATH . "/unknown.php" ); ?>
<?php endif; ?>
有人有什么想法吗?我看到了一些关于使用$is\\u search作为参数的内容,但要么没有正确实现它,要么我的查询有其他错误。。。

4 个回复
最合适的回答,由SO网友:Nathan 整理而成

我在这里找到了我需要的:http://deadlyhifi.posterous.com/separate-posts-and-pages-in-wordpress-search

本质上,我需要知道如何维护生成的基本查询WP(因此它知道将其作为搜索结果保存,而不是只执行我在search.php文件中调用的确切查询)。

谢谢大家的意见!

SO网友:mor7ifer

好吧,我刚刚做了点什么,这应该可以,但它还没有经过测试。

<?php
    $premium_args = array(
        \'post_status\' => \'publish\',
        \'meta_query\'  => array(
            array(
                \'key\'   => \'seek_premium\',
                \'value\' => \'yes\'
            )
        )
    );
    $premium_posts = new WP_Query( $premium_args );
?>
<?php foreach( $premium_posts as $p ) : ?>
    Your output here
<?php endforeach; ?>

<?php
    $free_args = array(
        \'post_status\' => \'publish\',
        \'meta_query\'  => array(
            array(
                \'key\'     => \'seek_premium\',
                \'value\'   => \'yes\',
                \'compare\' => \'!=\'
            )
        )
    );
    $free_posts = new WP_Query( $free_args );
?>

<?php foreach( $free_posts as $p ) : ?>
    Your output here
<?php endforeach; ?>

<?php if( 0 == count( $premium_posts ) && 0 == count( $free_posts ) ) : ?>
    No results
<?php endif; ?>
我还觉得这比您当前的代码更容易阅读和遵循,因此如果您能同时使用这两种代码,通常最佳做法是使用可读性最好的代码。当然,有了它,您可以实现have_posts() 诸如此类,但我只是想了解一下一般的想法,即使用meta\\u查询。

SO网友:Jared

试一下,看看是否有什么不同:

<?php if (have_posts()) : ?>
<h1>My Heading</h1>
<?php $premium_query = new WP_Query(array(\'meta_key\' => \'seek_premium\', \'meta_value\' => \'yes\' ));
while ($premium_query->have_posts()) : $premium_query->the_post(); 
$seekpremium = get_post_meta($post->ID, \'seek_premium\', true); ?>
SHOW PREMIUM POSTS                                                                                  
<?php endwhile; wp_reset_postdata(); ?> 
<?php $free_query = new WP_Query(\'post_per_page=50\');
while ($free_query->have_posts()) : $free_query->the_post(); 
$seekpremium = get_post_meta($post->ID, \'seek_premium\', true); 
if ( !empty( $seekpremium ) ) 
continue; ?>
SHOW FREE POSTS                                                     
<?php endwhile; ?> 
<?php else : ?>
<?php include (TEMPLATEPATH . "/unknown.php"); ?>
<?php endif; ?>
我加入了wp_reset_postdata() 在那里(引用Codex)这样做:“在循环通过一个单独的查询之后,这个函数恢复$post 全局到主查询中的当前帖子。“虽然没有测试这个,但我想我会把它扔出去。

SO网友:Matthew Boynes

只需一个查询和一个循环,就很容易做到这一点。将查询更改为按元键排序。。。

add_filter(\'request\', \'check_requests_for_search\' );
function check_requests_for_search( $request ) {
    $dummy_query = new WP_Query();
    $dummy_query->parse_query( $request );
    if ( $dummy_query->is_search() ) {
        $request[\'orderby\'] = \'meta_value menu_order title\';
        $request[\'meta_key\'] = \'seek_premium\';
        $request[\'order\'] = \'DESC\';
    }
    return $request;
}
请注意,我按menu\\u顺序排在第二位,然后按标题排在这里,因为这似乎很符合逻辑。无论如何,这允许您进行正常分页,并且一切都应按预期继续工作。

如果你想把这些部分分开,你仍然可以在一个循环中这样做;在循环中放入if子句,检查seek\\u premium的值何时更改。

干杯~

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post