这是我在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\' ) ) {