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' => ?
);
#1 楼
-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
);
重要警告:这可能会导致非常庞大的查询,可能会使网站瘫痪。仅在确定数据库可以处理时才执行此操作。不在公共主题或插件中。
评论
重要警告:这可能导致非常庞大的查询,从而使网站瘫痪。仅在确定数据库可以处理时才执行此操作。不在公共主题或插件中。
– fuxia♦
16年8月11日在17:25
@toscho添加您的评论作为答案的更新。
–Rutwick Gangurde
16年11月23日在6:25
你救了我的命!
–达伦·迪特里希(Darlan Dieterich)
19-10-11的2:14
@DarlanDieterich很高兴我可以提供帮助! :)
–Rutwick Gangurde
19-10-14在7:19
#2 楼
或者,您也可以传递WP_Query
(这是query_posts
的用法)nopaging
参数,该参数基本上具有相同的作用。如果您以后必须回头看它并且不记得自己在做什么,我个人觉得对您来说更清楚了,您打算在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' );
}
}
#4 楼
使用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行并避免更新术语和元缓存来大大增加查询时间。
评论
真好!感谢分享。
–里卡多·卡内拉斯(Ricardo Canelas)
19-10-18在22:25
#5 楼
对于您的问题,正确的答案是'posts_per_page' => -1
,因为-1
每页将返回无限制的帖子,就像其他用户回答的一样。 br />如果要从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
17-12-29 at 0:59
#6 楼
或..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;
}
评论
您应该添加上下文以解释您的代码,以解决问题的想法。
– Bueltge
17-2-22在12:25
评论
我已经搜索了一段时间,并搜索了WP Codex,但是我找不到这个简单问题的直接答案。我相信示例代码清楚地表达了我的问题,以及我的尝试是什么(为参数设置了很高的值)。我不是WP专家,所以这就是为什么我来这里问这个问题。甚至提供对您似乎微不足道的问题的答案也有助于发展这些Stack Exchange社区。我个人很喜欢在搜索结果中看到一个Stack Overflow链接,而不是一个糟糕的论坛的链接。另外,感谢您的回答。您应该将其发布为答案而不是评论,以便我接受。
我已表达您的观点,并且感谢您在编写问题时所付出的努力。我也同意,非专家问题可以证明自己在这个社区中很有价值。另一方面,太多这样的问题会阻止一些专家参与其中。我想这全都是某种平衡。无论如何,我都是一个很大的支持者,所以我期待着您的下一个问题:)在WPSE上度过愉快的时光。
PS:您还想用post_type替换type(或完全删除此行)。我将同时编辑Rutwick的答案和您的问题,以防止有人复制粘贴此小错误。
@Maugly感谢您的纠正人...只专注于posts_per_page,因此复制了错字! ;)