WordPress不随POSTS_PER_PAGE变化的帖子数

时间:2018-03-14 作者:wplearner

我在主页上显示了数千篇帖子。我想控制帖子的数量,所以为此我使用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页面不起作用。所以我认为外部挂钩设置了这个值。我试图在主题文件中找到这一点,但没有成功。我知道这只是因为这个主题。

5 个回复
SO网友:Asrsagar

你试过这个吗?

<?php 
    $blogpost  =  new WP_Query(array(         
       \'post_type\'      => \'post\',
       \'posts_per_page\' => 6
        ));
?>
<?php while($blogpost->have_posts()) : $blogpost->the_post(); ?>
// Writhe your Blog article Here.
<?php endwhile; ?>

SO网友:mad2kx

你试过这个吗?

function posts_on_homepage( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( \'posts_per_page\', 10 );
    }
}
add_action( \'pre_get_posts\', \'posts_on_homepage\' );

SO网友:Dunder

尝试在查询参数之前添加此参数。

    if (get_query_var(\'paged\')) {
        $paged = get_query_var(\'paged\');
    } elseif (get_query_var(\'page\')) {
        $paged = get_query_var(\'page\');
    } else {
        $paged = 1;
    }
在争论中,提出\'paged\' => $paged

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,那就做你必须做的事情。

结束

相关推荐

WP_QUERY参数以显示来自特定定制分类的帖子

我已经为我的帖子创建了一个名为“Regions”的自定义分类法我已经用这些区域标记了2个帖子。我想做的是列出任何带有区域标记的帖子,但由于某些原因,它不起作用。下面是我注册自定义分类法的函数:function region_taxonomy() { $labels = array( \'name\' => _x( \'Regions\', \'taxonomy general name\' ), \'singular_name