分页错误:输出的参数重复

时间:2019-07-02 作者:Beaniie

我一直在写一个习惯search.php 循环了一段时间,我遇到了一个奇怪的问题。我的php参数通过重复模板文件输出一些意外结果。

目前我有56 职位total 在我的自定义帖子类型中products

my $args array is configured as follows;

$search_query = get_search_query(); 

if ( get_query_var(\'paged\') ) {
    $paged = get_query_var(\'paged\');
} elseif ( get_query_var(\'page\') ) { 
    $paged = get_query_var(\'page\');
} else {
    $paged = 1;
}

$args = array(
    \'post_type\'         => \'products\',
    \'post_status\'       => \'published\',
    \'s\'                 => $search_query,
    \'paged\'             => $paged,
    \'posts_per_page\'    => 15
);

// DO NOT REMOVE
global $query_string;
wp_parse_str( $query_string, $search_query );
$search = new WP_Query( $args );
My Loop is configured as follows;

<?php $i = 1; 

    if ( $search->have_posts() ) : 

        while ( $search->have_posts() ) : 

            $search->the_post();
            get_template_part( \'loop-templates/content-catalogue\', get_post_format() ); 

            if($i % 3 == 0) {echo \'<!-- Open a new deck --></div><div class="card-deck d-block d-lg-flex card-lg-gutters-3" data-aos="fade-up" data-aos-delay="50"><!-- Open a new deck -->\';} $i++;

        endwhile; ?>

   <?php else : ?>

        <?php get_template_part( \'loop-templates/content\', \'none\' ); ?>

   <?php endif; ?>

   <?php understrap_pagination(); ?>
   <?php wp_reset_postdata(); ?>

My issue:

我应该只有4页分页。事实上,出于某种原因,我有12个页面,第四页之后的每个页面都显示了我的模板文件,没有找到帖子。一、 e。

<?php get_template_part( \'loop-templates/content\', \'none\' ); ?>

我被难住了;我也不知道到底出了什么问题。

See my full search.php file.

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

这是我在WordPress开发中看到的最常见错误的另一个例子。我认为这与下一个最常见的是什么都不接近。我很好奇,有哪些文档或教程教授这种查询方法,或者可以对官方文档做些什么来让这更清楚。

问题在于您使用的是分页函数,understrap_pagination() 它(正确地)使用主查询(全局$wp_query 对象)来确定要显示的页面,但您的模板正在使用您自己的自定义查询($search) 输出帖子。如果这些查询有不匹配的参数,每页的帖子数不同,或者当前的页码不同,那么您会遇到这样的奇怪情况。

所有主要WordPress模板,如index.php, archive.php, search.php, 已经根据URL请求为您查询了正确的帖子,并使其可以通过主循环访问:

if ( have_posts() ) : while( have_posts() ) : the_post();

endwhile; endif;
(注意这里没有使用任何对象变量)

分页和下一个/上一个链接等函数都是为了使用此查询生成准确的输出而构建的。如果使用单独的查询或错误地修改此查询,那么依赖于主查询状态的那些函数将给出看起来不正确的输出。分页是其中最常见的一种。

您的搜索。php循环需要如下所示:

$i = 1; 

if ( have_posts() ) : 
    while ( have_posts() ) : 
        the_post();

        get_template_part( \'loop-templates/content-catalogue\', get_post_format() ); 

        if( $i % 3 == 0 ) {
            echo \'<!-- Open a new deck --></div><div class="card-deck d-block d-lg-flex card-lg-gutters-3" data-aos="fade-up" data-aos-delay="50"><!-- Open a new deck -->\'; 
        }

        $i++;

    endwhile;
else : 
    get_template_part( \'loop-templates/content\', \'none\' );
endif;

understrap_pagination();
wp_reset_postdata();
请注意$search 没有在任何地方使用。这是因为您必须使用主查询循环。

这就引出了为什么$search 首先存在。从你的全面搜索中我可以看出。php模板,您有两个搜索表单:“全局”搜索和“目录”搜索,您使用$search 用户执行目录搜索时进行查询。创建单独的查询不是正确的方法。首先,这意味着无论用户执行哪个搜索,您都在执行两个搜索,这是无效的。其次,它导致了分页问题。

因此,您需要做的是使模板的目录版本和全局版本使用相同的主循环,正如我上面所述。那么您需要使用pre_get_posts 钩子以修改用户执行查询所基于的主查询。据我所知,你做的主要事情是更改每页的帖子数量,并将帖子类型限制为products. 您可以在主题函数中使用此代码来实现这一点。php文件:

function wpse_341991_catalogue_search( $query ) {
    if ( $query->is_search() ) {
        if ( \'catalogueSearch\' === $_GET[\'formName\'] ) {
            $query->set( \'post_type\', \'products\' );
            $query->set( \'posts_per_page\', 15 );
        }
    }
}
add_action( \'pre_get_posts\', \'wpse_341991_catalogue_search\' );
现在,每当用户使用您的目录搜索表单进行搜索时,主查询将显示您想要的结果,分页功能应该正常工作。

不过还有最后一件事。post_type 已是可以包含在搜索表单中的有效查询参数。因此,如果要更改表单搜索的帖子类型,只需添加一个名称设置为的隐藏字段post_type 以及设置为要搜索的帖子类型的值:

<input type="hidden" name="post_type" value="products">
这意味着您忽略了formName 输入,并减少pre_get_posts 功能到:

function wpse_341991_catalogue_search( $query ) {
    if ( $query->is_search() && \'products\' === $query->get( \'post_type\' ) ) {
        $query->set( \'posts_per_page\', 15 );
    }
}
add_action( \'pre_get_posts\', \'wpse_341991_catalogue_search\' );
在模板中,而不是检查:

if ( strcmp( $formIdentifier, \'globalSearch\' )) {
您可以检查:

if ( \'products\' !== get_query_var( \'post_type\' ) ) {