我如何才能允许发布粘性帖子,但将查询限制为1个帖子?

时间:2017-02-21 作者:mikemike

我有一个部分,我呼吁各地的网站在不同的点。此部分仅显示最新帖子。

看起来是这样的:

<?php
$args = array(
    \'posts_per_page\'    => 1,
    \'order\'             => \'desc\'
);
query_posts($args);

if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        if (has_post_thumbnail( $post->ID ) ){
            $featured_image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), \'home-news-thumbnail\' );
        }
        ?>
        <a href="<?php echo get_the_permalink(); ?>"><h3><?php echo get_the_title(); ?></h3></a>
        <?php if(!empty($featured_image)): ?>
        <a href="<?php echo get_the_permalink(); ?>">
            <img src="<?php echo $featured_image[0]; ?>" alt="" width="250" class="pull-left">
        </a>
        <?php endif; ?>
        <p>
            <?php echo get_the_excerpt(); ?>
        </p>
        <a href="<?php echo get_the_permalink(); ?>" class="btn btn-brand-dark">more</a>
        <div class="clearfix"></div>
<?php
    endwhile;
endif;

wp_reset_postdata();
?>
在我“粘贴”帖子之前,这一切都很好。然后我得到2个帖子,而不是1个。

如何修改所有查询以便posts_per_page 是否有所需的帖子数量,无论帖子是否粘帖?

在上面的例子中,我现在得到2 帖子(尽管要求1),但我想要最新的帖子,不管那是不是一篇粘滞的帖子。

我知道ignore_sticky_posts 参数,但这将忽略粘性帖子,我不想这样做。如果有一个粘帖,它应该是第一个。

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

这里有一种方法posts_per_page 中的值WP_Query, 无论是粘性贴子还是自定义贴子注入:

$args = [
    \'posts_per_page\'        => 1,
    \'_exact_posts_per_page\' => true   // <-- our custom input argument
];
使用我们的自定义_exact_posts_per_page 输入参数。

我相信这之前已经实现了很多次,但我现在还没有找到,所以让我们尝试用这个演示插件来实现它:

<?php
/**
 *  Plugin Name:   Exact Posts Per Pages 
 *  Description:   Activated through the \'_exact_posts_per_page\' bool argument of WP_Query 
 *  Plugin URI:    http://wordpress.stackexchange.com/a/257523/26350 
 */

add_filter( \'the_posts\', function( $posts, \\WP_Query $q )
{
    if( 
        wp_validate_boolean( $q->get( \'_exact_posts_per_page\' ) )
        && ! empty( $posts ) 
        && is_int( $q->get( \'posts_per_page\' ) ) 
    )
        $posts = array_slice( $posts, 0, absint( $q->get( \'posts_per_page\' ) ) );

    return $posts;

}, 999, 2 ); // <-- some late priority here!
这里我们使用the_posts 过滤以切片阵列,无论它是否包含粘性帖子。

这个the_posts 如果suppress_filters 的输入参数WP_Querytrue.

Note 那个query_posts() 不建议在插件或主题中使用。查看代码参考中的许多警告here.

希望您能进一步测试,并根据您的需要进行调整!

SO网友:David Lee

如果你想让你的查询忽略某个帖子是粘性的,并且没有将其放在有序查询的顶部,请执行以下操作:

//$args = array(
//    \'posts_per_page\' => 1,
//    \'order\'          => \'desc\'
//    \'ignore_sticky_posts\' => 1 //set this
//);
这样,粘性帖子将不会被忽略,而被忽略的是它们的状态sticky, 你的结果中仍然会出现粘性帖子,什么\'ignore_sticky_posts\' 就是告诉查询,如果你在排序,不要将粘性的帖子放在顶部

EDIT:

如果只需要1,请删除While循环逻辑:

<?php
$args = array(
    \'posts_per_page\'    => 1,
    \'order\'             => \'desc\'
);
query_posts($args);

if ( have_posts() ) :

        if (has_post_thumbnail( $post->ID ) ){
            $featured_image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), \'home-news-thumbnail\' );
        }
        ?>
        <a href="<?php echo get_the_permalink(); ?>"><h3><?php echo get_the_title(); ?></h3></a>
        <?php if(!empty($featured_image)): ?>
        <a href="<?php echo get_the_permalink(); ?>">
            <img src="<?php echo $featured_image[0]; ?>" alt="" width="250" class="pull-left">
        </a>
        <?php endif; ?>
        <p>
            <?php echo get_the_excerpt(); ?>
        </p>
        <a href="<?php echo get_the_permalink(); ?>" class="btn btn-brand-dark">more</a>
        <div class="clearfix"></div>
<?php

endif;

wp_reset_postdata();
?>
您甚至可以删除\'posts_per_page\' => 1 输出将是第一个。

SO网友:Ted

尝试使用if(!is\\u sticky())

<?php
$args = array(
    \'posts_per_page\'    => 1,
    \'order\'             => \'desc\'
);
query_posts($args);

if ( have_posts() ) :
    while ( have_posts() ) : the_post();
    if(! is_sticky()) {
        if (has_post_thumbnail( $post->ID ) ){
            $featured_image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), \'home-news-thumbnail\' );
        }
        ?>
        <a href="<?php echo get_the_permalink(); ?>"><h3><?php echo get_the_title(); ?></h3></a>
        <?php if(!empty($featured_image)): ?>
        <a href="<?php echo get_the_permalink(); ?>">
            <img src="<?php echo $featured_image[0]; ?>" alt="" width="250" class="pull-left">
        </a>
        <?php endif; ?>
        <p>
            <?php echo get_the_excerpt(); ?>
        </p>
        <a href="<?php echo get_the_permalink(); ?>" class="btn btn-brand-dark">more</a>
        <div class="clearfix"></div>
<?php } 
    endwhile;
endif;

wp_reset_postdata();
?>
请注意,这将完全防止出现任何粘性帖子。

SO网友:Paul \'Sparrow Hawk\' Biron

我刚刚注意到你的评论,你想通过一个过滤器来实现这一点,所以你走吧(这基本上阐述了我对你最初问题的评论,以及@DavidLee\'s answer).

以下内容将导致1个且仅1个帖子,而不考虑粘性。如果最近发布的帖子is 粘性,你会得到它的。如果最新发布的帖子is not sticky,你仍然会得到它。而且,你将不会收到其他帖子,无论是粘性帖子还是其他帖子。

add_filter (\'pre_get_posts\', \'get_only_one_post\') ;

function
get_only_one_post ($wp_query)
{
    if (is_admin () || !$wp_query->is_main_query ()) {
        // we\'re not in the Main Loop, so return the query unmodified
        return ($wp_query) ;
        }

    // order by most recently published 1st
    // this isn\'t really necesary (since it is the default),
    // but include it just in case some other filter has modified that default
    $wp_query->set (\'orderby\', \'date\') ;
    $wp_query->set (\'order\', \'DESC\') ;

    // limit to 1 post, not counting stickies
    $wp_query->set (\'posts_per_page\', 1) ;

    // disable the special processing of sticky posts.
    // without this, ALL sticky posts will be returned, whether they match
    // the rest of the query_vars or not
    $wp_query->set (\'ignore_sticky_posts\', true) ;

    return ($wp_query) ;
}
解释无\'ignore_sticky_posts\' => true完成以下操作:

根据查询变量检索帖子,包括尊重posts_per_pageorderby

  • 任何与查询变量匹配的粘性帖子都将包含在结果中
    • 将结果中包含的粘性帖子移动到列表的前面
    • 检索all 不在结果中的粘滞帖子会预先发送到列表中。正是这一步骤可能导致结果包含超过posts_per_page 正在返回的帖子请参见Lines 2966-2979, of the source for WP_Query

    \'ignore_sticky_posts\' => true

    完成以下操作:

    根据查询变量检索帖子,包括尊重posts_per_pageorderby

    • 任何匹配查询变量的粘性帖子都将包含在结果中
        1. 编辑:其他答案

          确定,请尝试以下操作:

          add_filter (\'pre_get_posts\', \'set_posts_per_page_on_front_end_main_query\') ;
          add_filter (\'the_posts\', \'respect_posts_per_page\') ;
          
          function
          respect_posts_per_page ($posts, $wp_query)
          {
              return (array_slice ($posts, 0, $wp_query->get (\'posts_per_page\', count ($posts)))) ;
          }
          
          function
          set_posts_per_page_on_front_end_main_query ($wp_query)
          {
              if ( is_admin () || !$wp_query->is_main_query ()) {
                  return ($wp_query) ;
                  }
          
              $wp_query->set (\'posts_per_page\', 1) ;
          
              return ($wp_query) ;
          }
          

相关推荐

apply_filters() function

我用过apply_filters() 从WordPress帖子中检索内容时,如:$content=$query_val->post_content; $content = apply_filters( \'the_content\', $content ); 当我使用apply_filters() 这个apostrophe( \' ) 在我的文本中显示了一些字符。在我移除后apply_filters() 它显示正确。所以请解释清楚!!它在做什么?我已引用此链接Referal_lin