你完全做错了。您不应该在主查询的位置运行自定义查询。请参见this post 就这个问题进行深入讨论。您应该首先返回没有自定义查询的默认搜索页面。您应该拥有的只是默认循环。
它应该如下所示
<?php get_header(); ?>
<?php
$num = $GLOBALS[\'wp_query]->post_count;
?>
Search results for <?php the_search_query(); ?> - <?php echo $num; ?> results
if ( have_posts() ) :
$row_count=0;
while ( have_posts() ) :
$row_count++;
the_post();
global $product;
the_title(); ?>
<?php endwhile;
endif; ?>
<?php get_footer(); ?>
现在已经排序好了,我们可以通过在主查询执行之前调整查询变量来调整主查询
pre_get_posts
.
在我们做之前,请注意几点showposts
支持的地方posts_per_page
, 所以用它来代替。showposts
仍然有效,但已转换为posts_per_page
在WP_Query
班
您不应该设置cache_results
为false。因为您将使用模板标记(likethe_title()
和the_content()
),您可能会运行大量额外的db查询来获取您已经拥有的数据。这几乎从来都不是一个好主意cache_results
为false。
设置之前update_post_term_cache
和update_post_meta_cache
要想虚假,你需要VERY VERY SURE 你会的not 需要自定义字段或学期后信息。如果您要使用任何post term信息或自定义字段信息,那么每个post都会进行大量的db调用,因为这些信息没有存储在它们的相对缓存中。
回想起get_the_post_thumbnail()
(由使用the_post_thumbnail()
)使用存储在中的自定义字段数据_thumbnail_id
获取当前帖子的帖子缩略图。如果update_post_meta_cache
设置为false时,您将在每篇文章中进行额外的db调用以获取该信息,因此25篇文章将意味着额外的25 db调用。如果要显示帖子所属的术语,则同样适用于帖子术语,并且update_post_term_cache
设置为false时,您将在每页加载时多运行25个db查询
因此,在将这两个参数设置为false之前,请务必非常确定。在主查询循环中,将这些设置为false几乎总是一个坏主意,因为通常需要自定义字段信息,如缩略图,并且需要显示帖子/产品所属的术语
如果要使用分页,请确保删除no_found_rows
. 此参数设置为true时,将合法中断分页
您应该使用正确的命名约定。课程是WP_Query
, 不wp_query
. 在第一个循环中,您使用WP_Query
还有下一个wp_query
. 在代码中保持一致,并使用类的专有名称
显示数字所需的所有内容都已在主查询中,因此您可以使用它
如果使用参数的默认值,可以从参数数组中省略它。不要浪费时间和空间把它们写出来
让我们看看pre_get_posts
修改主查询的操作CORRECTLY
add_action( \'pre_get_posts\', function ( $q )
{
if ( !is_admin() // Only target front end queries
&& $q->is_main_query() // Only target the main query
&& $q->is_search() // Only target search pages
) {
$q->set( \'post_type\', \'product\' );
$q->set( \'posts_per_page\', 25 );
$q->set( \'no_found_rows\', true ); // See note above
$q->set( \'update_post_term_cache\', false ); // See note above
$q->set( \'update_post_meta_cache\', false ); // See note above
}
});
这应该可以解决你的问题
编辑几个数字。以下内容在我的主页上测试了6篇帖子,其中使用了帖子术语和帖子元。
默认值为7 db queries
带有cache_results
设置为false,我录制12 db queries
带有update_post_term_cache
设置为false,我录制33 db queries
带有update_post_meta_cache
设置为false,我录制11 db queries
当所有三个都设置为false时,我录制了38 db queries
因此,正如您所看到的,在将这些参数设置为false之前,请确保它确实是您所需要的。添加总是一个好主意echo get_num_queries();
在页面上的某个位置监视页面的db点击量。这会告诉你你在做什么,是好是坏