我在主页上显示了数千篇帖子。我想控制帖子的数量,所以为此我使用posts_per_page
但这对我不起作用。所有其他参数都有效,但posts_per_page
不工作。我在这一页上分页,并且posts_per_page
适用于所有其他分页页面,但不适用于第一页(主页)。因此,出于测试目的,我创建了一个空白模板,它只有一个简单的WordPress循环,没有分页或任何其他只显示文章标题的内容,在这个模板中,我对文章的数量有限制,但是posts_per_page
甚至在此页上也不起作用。我尝试过禁用所有插件,但没有效果,所以我认为这个问题是与主题设置有关的posts_per_page
动态值。我还使用wp_reset_query();
并在中尝试了此代码functions.php
也
add_action( \'pre_get_posts\', \'set_posts_per_page\' );
function set_posts_per_page( $query ) {
global $wp_the_query;
$query->set( \'posts_per_page\', 12 );
return $query;
}
但对我来说没什么用。我尝试使用显示查询内容
var_dump($query->request)
在查询限制中是12条,但在页面上我仍然看到100多条帖子。在WordPress设置页面的主题设置页面上,帖子限制为12,但在前端,此限制不起作用。以下是此查询的结果。
string(489) "SELECT SQL_CALC_FOUND_ROWS wp_mdw75t47kk_posts.ID FROM wp_mdw75t47kk_posts INNER JOIN wp_mdw75t47kk_postmeta ON ( wp_mdw75t47kk_posts.ID = wp_mdw75t47kk_postmeta.post_id ) WHERE 1=1 AND ( wp_mdw75t47kk_postmeta.meta_key = \'_imwb_zonpress_post_ctr\' ) AND wp_mdw75t47kk_posts.post_type = \'post\' AND (wp_mdw75t47kk_posts.post_status = \'publish\' OR wp_mdw75t47kk_posts.post_status = \'private\') GROUP BY wp_mdw75t47kk_posts.ID ORDER BY wp_mdw75t47kk_postmeta.meta_value+0 DESC LIMIT 0, 12"
我也分享这个测试页面的url,如果有人想看到这个。
Test Page link您也可以在主页上看到此问题。对我来说,这是一个非常奇怪的问题,因为我已经尝试了谷歌的一切,但都没有对我有用
我正在使用covert store builder主题。任何建议都将不胜感激。非常感谢。
下面是此循环的完整代码。
wp_reset_query();
$args = Array(
\'posts_per_page\' => 12
);
$query = new WP_Query( $args );
<?php while ( $query->have_posts() ) : $query->the_post(); ?>
然后有一些代码来显示图片、标题和摘录,我认为这不会影响帖子的数量。在此之后,给出这些行
<?php
endwhile; ?>
但正如我所提到的,我已经在一个空白模板中尝试了这段代码,没有分页,但仍然是posts\\u per\\u页面不起作用。所以我认为外部挂钩设置了这个值。我试图在主题文件中找到这一点,但没有成功。我知道这只是因为这个主题。
SO网友:Rocketlaunch
您是否尝试在主参数和循环之前添加以下内容?
<!-- Modify pagination function for front page -->
<?php
global $paged, $wp_query, $wp;
$args = wp_parse_args($wp->matched_query);
if ( !empty ( $args[\'paged\'] ) && 0 == $paged ) {
$wp_query->set(\'paged\', $args[\'paged\']);
$paged = $args[\'paged\']; } ?>
然后添加分页,如下所示:
<?php
$args = array(
\'posts_per_page\' => 12,
\'paged\' => $paged ); ?>
$query = new WP_Query($args);
<?php if ($query->have_posts()) : $i = 1; ?>
<?php while ( $query->have_posts() ) : $query->the_post(); ?>
// Content Here
<?php $i++; endwhile; ?>
<?php else : ?>
<h2>Content not found!</h2>
<?php endif; ?>
//pagination code
在我的情况下,我使用的是WP pagenavi,因此我会使用:
<?php wp_pagenavi( array( \'query\' => $query )); ?>
<?php wp_reset_query(); ?>
SO网友:mopsyd
我怀疑您的主题绑定到了一个过滤器,该过滤器也在您的循环中重置查询,这导致了无休止的递归。如果是这种情况,您有三种选择:
您可以放弃主题,使用另一个主题。如果你在这方面投入了大量资金,那么这可能是一个糟糕的答案。
你可以破解主题,这也是一个糟糕的答案,因为当它更新时,你必须再次破解,或者你必须在一个子主题中重写它的一堆核心代码,这可能会变得非常混乱。
或者,你可以用快速而肮脏的方法,也就是用一个好的旧的for
循环而不是while
.
wp_reset_query();
$GLOBALS[\'my_counter\'] = 12;
$args = Array(
\'posts_per_page\' => $GLOBALS[\'my_counter\'];
);
$query = new WP_Query( $args );
<?php
for ( $i = 0; $i < $GLOBALS[\'my_counter\'], $i++ )
{
if (!$query->the_post())
{
break;
}
}
unset($GLOBALS[\'my_counter\']);
?>
这很难看,但它应该做你想做的事。这个
for
循环将只运行12次,无论是否有任何其他内容正在重置查询。如果看到重复的帖子,还可以在循环中放置断点并使用
debug_backtrace(1)
找出它发生的地方,这在
while
循环,除非您喜欢大约800万页调试代码的想法,并可能导致服务器崩溃。
如果这确实适用于您,请考虑寻找一个更优雅的解决方案,原因如下:
A) 全球化是不好的。
B) 用错误的方式做事通常会导致更多的人用错误的方式做事。我不能说什么是适合你特定主题的正确方式,但如果它提供了任何方式来实现你在主页上想要的,你应该这样做。如果它不提供任何类型的api,那就做你必须做的事情。