每页的文章数没有限制


41

我想用返回所有帖子query_posts。我尝试将posts_per_page数字设置为非常高的值,但很query_posts奇怪,并且不返回任何帖子。没有限制地查询帖子的正确方法是什么?

$args = array(
    'post_type'      => 'post',
    'cat'            => '22,47,67',
    'orderby'        => 'name',
    'order'          => 'ASC',
    'hide_empty'     => 1,
    'depth'          => 1,
    'posts_per_page' => ?
    );

6
我已经搜索了一段时间,正在搜索WP Codex,但是我找不到这个简单问题的直接答案。我相信示例代码清楚地表达了我的问题,以及我的尝试是什么(为参数设置了很高的值)。我不是WP专家,所以这就是为什么我来这里问这个问题。甚至提供对您来说似乎微不足道的问题的答案也有助于发展这些Stack Exchange社区。我个人很喜欢在搜索结果中看到一个Stack Overflow链接,而不是一个糟糕的论坛的链接。
Banjer 2011年

另外,感谢您的回答。您应该将其发布为答案而不是评论,这样我才能接受。
Banjer 2011年

我的意思是您,我非常感谢您在编写问题时所付出的努力。我也同意,非专家问题可以证明自己在这个社区中很有价值。另一方面,太多这样的问题会阻止一些专家参与其中。我想这全都是某种平衡。无论如何,我是一个大推动者,所以我期待着您的下一个问题:)在WPSE上度过愉快的时光。
Michal Mau,

PS:你也想更换typepost_type(或者完全删除此行)。我将同时编辑Rutwick的答案和您的问题,以防止有人复制粘贴此小错误。
Michal Mau

@Maugly感谢您的纠正人...只专注于posts_per_page,因此复制了错字!;)
Rutwick Gangurde 2011年

Answers:


81

-1是您的答案!在posts_per_page 这里找。

$args = array(
'post_type'      => 'post',
'cat'            => '22,47,67',
'orderby'        => 'name',
'order'          => 'ASC',
'hide_empty'     => 1,
'depth'          => 1,
'posts_per_page' => -1
);

重要警告:可能导致非常庞大的查询,可能导致网站瘫痪。仅当您确定数据库可以处理它时,才执行此操作。不在公共主题或插件中。


6
重要警告:这可能导致非常庞大的查询,从而使网站瘫痪。仅当您确定数据库可以处理它时,才执行此操作。不在公共主题或插件中。
fuxia

@toscho添加您的评论作为答案的更新。
Rutwick Gangurde '16

你救了我的命!
达伦·迪特里里希

@DarlanDieterich很高兴我可以提供帮助!:)
Rutwick Gangurde

23

或者,您可以传递WP_Queryquery_posts使用的是)nopaging参数,该参数基本上执行相同的操作。

$args = array(
    'nopaging' => true
    // Your other args, etc..
);

它将完全相同,但是如果您以后要回头看却不记得自己在做什么,我个人觉得对您来说更清楚了,您打算在args中使用该参数是什么数组。

正如我所提到的,它们实际上都将达到相同的效果。

拥有不止一种方法很无伤大雅,分享您所知道的东西总是很高兴的,足以说这就是我回答的原因,尽管您已经有足够的方法了。.;)


3

从您的子主题功能文件中:

add_action( 'pre_get_posts', 'wpsites_no_limit_posts' );

function wpsites_no_limit_posts( $query ) {

if( $query->is_main_query() && !is_admin() && is_home() ) {

$query->set( 'posts_per_page', '-1' );
$query->set( 'order', 'ASC' );
$query->set( 'post_type', 'post' );
$query->set( 'cat', '22,47,67' );
$query->set( 'orderby', 'name' );
$query->set( 'order', 'ASC' );
$query->set( 'hide_empty', '1' );
$query->set( 'depth', '1' );

    }

}

1

正确的答案是'posts_per_page' => -1因为-1与其他用户一样,每页将返回无限制的帖子。

我只想在此问答中添加一个附件,

如果要从WordPress管理面板上的阅读设置获取每页的帖子数,则必须调用该get_option()函数并将其posts_per_page作为字符串传递给它。

$args = array(
    'post_type'      => 'post',
    'cat'            => '22,47,67',
    'orderby'        => 'name',
    'order'          => 'ASC',
    'hide_empty'     => 1,
    'depth'          => 1,
    'posts_per_page' => get_option('posts_per_page')
    );

我希望这个答案能对我有所帮助。快乐编码Stackexchange用户


这实际上是一个不错的补充!
Herbert Van-Vliet

1

要么..

function getAll($arg, $posts_per_page = 50)
{
    $data = array();
    $page = 1;

    do{
        $arg['paged'] = $page;
        $arg['posts_per_page'] = $posts_per_page;

        $query = new WP_Query($arg);

        foreach ($query->posts as $post){
            $data[] = $post;
        }

        $page++;

    }while(count($query->posts) === $posts_per_page);

    return $data;
}

2
您应该添加上下文以解释您的代码,以解决问题的想法。
bueltge

1

使用Ricardo进行一些修改:

static $paged;
$post_ids = [];
do {
    $paged++;
    $defaults = [
        'fields' => 'ids', // Only return the ID field to make this query faster.
        'post_type' => 'post',
        'posts_per_page' => 100,
        'no_found_rows' => false, // We need pagination & the count for all posts found.
        'paged' => $paged,
        'update_post_term_cache' => false,
        'update_post_meta_cache' => false,
    ];
    $query = new WP_Query($defaults);
    if ($query->have_posts()) {
        foreach ($query->posts as $id) {
            $post_ids[] = $id;
        }
    }
} while ($query->max_num_pages > $paged);

return $post_ids;

通过仅查询ID行并避免更新术语和元缓存,将大大增加查询时间。


真好!感谢分享。
里卡多·卡内拉斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.