仅在自定义循环中显示粘滞帖子或最新帖子

时间:2014-09-13 作者:xtojump

我是Wordpress和PHP的新手,我已经为此奋斗了一段时间。目前我有两个循环。

我想首先循环只显示1篇帖子:要么是一篇粘性帖子,要么是最新的帖子(如果没有粘性帖子)。

第二个循环应显示所有其他最近的帖子,如基本博客,但任何粘贴的帖子或出现在第一个循环中的最近帖子除外。

Example:enter image description here

What I have:

我的代码在第一个循环中显示最新的帖子,在第二个循环中显示其他帖子。

The problem:

当我制作一篇粘性文章时,它会与最新的文章一起出现在第一个循环中(我只希望粘性文章在这种情况下出现在这里,而不是两者都出现),它也会出现在第二个循环的顶部。

Here 它正在运行

我成功地走到了这一步,但似乎没法完成。

UPDATED

<div id="main" class="site-main">
    <div id="primary" class="content-area">
        <div id="content" class="site-content" role="main">
            <div>
            <?php 

            $args = array(
                \'posts_per_page\' => 1,
                \'post__in\'  => get_option( \'sticky_posts\' ),
                \'ignore_sticky_posts\' => 1
            );
            $my_query = new WP_Query( $args );

            $do_not_duplicate = array();
            while ( $my_query->have_posts() ) : $my_query->the_post();
            $do_not_duplicate[] = $post->ID; ?>

<div id="post-<?php the_ID(); ?>" <?php post_class( \'\' ); ?> >
        <div class="featuredimage">
            <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_post_thumbnail(\'home-thumbnail\'); ?></a>
        </div>
        <h2><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
        </div>
<?php endwhile; ?>
<?php wp_reset_postdata(); //VERY VERY IMPORTANT?>
            </div>
<div id="gridcontainer">
<?php
$counter = 1; //start counter

$grids = 2; //Grids per row

global $query_string; //Need this to make pagination work

if ( have_posts() ) : while ( have_posts() ) : the_post();
if ( $post->ID == $do_not_duplicate ) continue; ?>
<?php
//Show the left hand side column
if($counter == 1) :
?>
        <div id="post-<?php the_ID(); ?>" <?php post_class( \'griditemleft\' ); ?> >
            <div class="postimage">
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_post_thumbnail(\'home-thumbnail\'); ?></a>
            </div>
                    <h2><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
        </div>
<?php
//Show the right hand side column
elseif($counter == $grids) :
?>
<div id="post-<?php the_ID(); ?>" <?php post_class( \'griditemright\' ); ?>>
            <div class="postimage">
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_post_thumbnail(\'home-thumbnail\'); ?></a>
            </div>
            <h2><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
</div>

<div class="clear"></div>
<?php
    $counter = 0;
    endif;
?>
<?php
    $counter++;
    endwhile;
    //Pagination can go here if you want it.
    endif;
?>
<?php
    untitled_content_nav( \'nav-below\' );
?>
</div>

        </div><!-- #content -->
    </div><!-- #primary -->

IN FUNCTIONS.PHP

/*===================================================================================
* Homepage sticky filter in loop 2
* =================================================================================*/
add_action(\'pre_get_posts\', \'wpse161279_ignore_sticky_posts\');
// the function that does the work
function wpse161279_ignore_sticky_posts($query)
{
    if (!is_admin() && $query->is_main_query()) {
        $sticky = get_option( \'sticky_posts\' );
        $query->set( \'post__not_in\', array( $sticky[0] ) );
    }   
}

2 个回复
SO网友:Pieter Goosen

您可以通过以下方式调整第一个循环以显示粘性帖子或最新帖子:请注意:您必须重置自定义查询

<?php 

$args = array(
    \'posts_per_page\' => 1,
    \'post__in\'  => get_option( \'sticky_posts\' ),
    \'ignore_sticky_posts\' => 1
);
$my_query = new WP_Query( $args );

$do_not_duplicate = array();
while ( $my_query->have_posts() ) : $my_query->the_post();
    $do_not_duplicate[] = $post->ID; ?>

<div id="post-<?php the_ID(); ?>" <?php post_class( \'\' ); ?> >
            <div class="featuredimage">
                <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_post_thumbnail(\'home-thumbnail\'); ?></a>
            </div>
            <h2><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
        </div>
  <?php endwhile; ?>
  <?php wp_reset_postdata(); //VERY VERY IMPORTANT?>
资料来源:Sticky Posts

EDIT

从主查询中删除粘性帖子,您可以使用pre_get_posts 在执行主查询之前删除粘性帖子的操作。在函数中粘贴以下内容。php

add_action(\'pre_get_posts\', \'wpse161279_ignore_sticky_posts\');
// the function that does the work
function wpse161279_ignore_sticky_posts($query)
{
    if (!is_admin() && $query->is_main_query())
        $query->set(\'post__not_in\', get_option(\'sticky_posts\'));
}

EDIT 2

我还没有测试过这个,也不熟悉这个,但我认为您可以尝试做以下操作

add_action(\'pre_get_posts\', \'wpse161279_ignore_sticky_posts\');
// the function that does the work
function wpse161279_ignore_sticky_posts($query)
{
    if (!is_admin() && $query->is_main_query()) {
        $sticky = get_option( \'sticky_posts\' );
        $query->set( \'post__not_in\', array( $sticky[0] ) );
    }   
}

EDIT 3

将以下代码粘贴到问题中第一个代码块的第4行之后,然后发布结果

<pre><?php var_dump($wp_query->query_vars[\'post__not_in\']); ?></pre>    
<pre><?php var_dump(get_option( \'sticky_posts\' )); ?></pre>
<pre><?php var_dump($wp_query->query_vars[\'ignore_sticky_posts\']); ?></pre>
你应该得到比这些更熟悉的结果

enter image description here

EDIT 4

将以下内容添加到上述代码中。这将打印第一篇文章的ID。如果它与第二个结果的第二个值相匹配,则意味着您的粘性贴子实际上是按其应该的方式显示的

<pre><?php var_dump($wp_query->posts[0]->ID); ?></pre>

EDIT 5

仅供参考,这就是你的网站在我这边的样子。我刚刚删除了文本部分并保留了图像

enter image description here

SO网友:Diogo Gomes

有一种更简单、更轻的方法
根据定义,粘性帖子将首先出现在循环中
因此,在您的特色区域(在调用\\u post()之前),您可以放置:

<div>
   <h3>Special Featured Loop</h3>
   <?php the_post(); //this will get the first post, and generate all the tags the_title(), the_permalink(),... ?>  
   <h2 class="entry-title">
      <a href="<?php the_permalink(); ?>" rel="bookmark"><?php the_title(); ?></a>
   </h2>
</div>
不需要重置,因为您想忽略上一篇文章
要忽略粘性帖子,可以使用is\\u sticky()函数
在主循环上,可以放置以下内容:

<div>
    <h3>Loop ignoring the sticky posts</h3>
    <?php while ( have_posts() ) : the_post(); ?>
        <?php if(is_sticky()) continue; //ignore sticy posts?>
        <h2 class="entry-title">
            <a href="<?php the_permalink(); ?>" rel="bookmark"><?php the_title(); ?></a>
        </h2>
    <?php endwhile; // End the loop. Whew. ?>       
</div>
希望这对您有所帮助。

干杯

结束