WP_QUERY为第一个粘帖,然后显示除第一个粘帖之外的其余帖子

时间:2012-10-20 作者:davebowker

我一直在读这个@nacin 通过我以前使用的query\\u帖子了解wp\\u query。

我想要的是:

将其放入模板文件

  • 查询此类别的所有帖子,在本例中为“3”

  • 在页面上显示第一个结果(如果可用)最新的粘性帖子

  • 在第一次粘贴后,如果设置了一个,则显示除设置了该粘贴外的其他帖子

  • 我所看到的问题是:-如果我在粘性循环中执行posts\\u per\\u page=1,则我无法在posts循环的其余部分执行posts\\u per\\u page=-1。为了解决这个问题,我刚刚将数字设置为999。

    我现在应该说works. 然而,这是一个流量非常高的网站,我想确保这是最好的方式,我不确定我是否正确使用wp\\u query来实现这一点,因为原始查询基本上是相同的,只是有和没有粘性帖子。

    global $wp_query;
    $wp_query = new WP_Query(array(
        \'post_type\' => \'post\',
        \'posts_per_page\' => 1,
        \'category__in\' => 3,
        \'post__in\'  => get_option( \'sticky_posts\' )
    ));
    while ($wp_query->have_posts()) : $wp_query->the_post();
        $exclude_featured = $post->ID;
        echo the_title();
        echo \'<br />\';
    endwhile; 
    
    echo \'<br />\';
    echo \'<br />\';
    
    global $wp_query;
    $args = array_merge(
        $wp_query->query_vars,
        array(
            \'post__in\' => null,
            \'posts_per_page\' => 999,
            \'ignore_sticky_posts\' => 1,
            \'post__not_in\' => array($exclude_featured)
        )
    );
    query_posts( $args );
    while ($wp_query->have_posts()) : $wp_query->the_post(); 
        if ( $exclude_featured == get_the_ID() )
            continue;
            echo the_title();
            echo \'<br />\';
    endwhile; 
    
    谢谢大家的帮助。

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

    you could use wp_list_pluck();

    if ( $exclude_featured )
        $args[\'post__not_in\'] = wp_list_pluck( $exclude_featured->posts, \'ID\' );
        $args[\'posts_per_page\'] = 999;
        query_posts( $args );
    endif;
    while ( have_posts() ) : the_post();
    ...
    
    SO网友:Wyck

    下面是一个非常简单的方法。

    $args = array(
              \'posts_per_page\' => -1,
              \'category__in\' => 3,
              \'ignore_sticky_posts\' => 0
           );
    
    $my_custom_query = new WP_Query( $args );
    
    while ( $my_custom_query->have_posts() ) :$my_custom_query->the_post();
    
    <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    //Your Stuff
    
    endwhile;
    
    // Reset Post Data
    wp_reset_postdata();
    
    无需使用global $wp_query; 尤其是2倍br 标记。。。如果您使用<?php post_class(); 使用CSS,这样您将自动得到一个名为.sticky ! 这里有一个更新,使用2个查询来解决我错过的细节,因为这样会比较安全。

    // **Loop 1** get the first sticky only 
    
    $sticky = get_option( \'sticky_posts\' );
    
    $the_query = new WP_Query( \'p=\' . $sticky[0]);
    
    while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
    
    <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    
    // your content
    
    <?php endwhile; wp_reset_postdata(); ?>
    
    //////////////
    //**Loop 2** exclude the sticky from the Loop 1
    
    $args = array(
            \'posts_per_page\' => -1,
            \'ignore_sticky_posts\' => 1,
            \'post__not_in\' => array($sticky[0])
    
    );
    
    $super_query = new WP_Query($args);
    
    while ( $super_query->have_posts() ) : $super_query->the_post(); ?>
    
    <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    
    // your content
    
    <?php endwhile; wp_reset_postdata(); ?>
    

    SO网友:Mridul Aggarwal

    我看到两个主要问题。a) 您不应该直接修改全局变量&;b) 你不应该使用query_posts. 这是一个重新设计的示例

    功能。php

    add_action(\'pre_get_posts\', \'customize_query\');
    function customize_query($query) {
        if(!$query->is_main_query() || !is_page_template(\'template-file-name.php\'))
            return;
    
        $wp_query = new WP_Query(array(
            \'post_type\' => \'post\',
            \'posts_per_page\' => 1,
            \'category__in\' => 3,
            \'post__in\'  => get_option( \'sticky_posts\' )
        ));
    
        $query->set(\'posts_per_page\', -1);
        $query->set(\'ignore_sticky_posts\', 1);
        if(!empty($wp_query->posts))
            $query->set(\'post__not_in\', array($wp_query->posts[0]->ID));
    
    }
    
    在模板文件中

    $query = new WP_Query(array(
        \'post_type\' => \'post\',
        \'posts_per_page\' => 1,
        \'category__in\' => 3,
        \'post__in\'  => get_option( \'sticky_posts\' )
    ));
    while ($query->have_posts()) : $query->the_post();
        echo the_title();
        echo \'<br />\';
    endwhile; 
    
    echo \'<br />\';
    echo \'<br />\';
    
    while (have_posts()) : the_post(); 
            echo the_title();
            echo \'<br />\';
    endwhile;
    

    结束

    相关推荐

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

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