是否自定义搜索不起作用?

时间:2016-03-06 作者:Ho Thanh Cyberdelia Nhan

我有一个WoodPress网站,安装了WooCommerce插件。

有一个问题我不明白为什么我在搜索产品时没有显示任何搜索结果?

带有搜索查询的网站URL:

http://www.v-tac.hr/?s=round&post_type=product

网站URL(我在左侧蓝色侧栏上使用搜索-顶部栏搜索尚未配置):

http://www.v-tac.hr/

I have edited default search.php of WordPress theme, code here:

<?php get_header(); ?>
<?php
$search = get_query_var("s");
$mySearch =& new WP_Query("s=$search&showposts=-1");
$num = $mySearch->post_count;
?>
Search results for <?php the_search_query(); ?> - <?php echo $num; ?> results
<?php
$argss = array ( 
    \'orderby\' => \'date\',
    \'s\' => $search,
    \'order\' => \'DESC\', 
    \'showposts\' => 25, // 12
    \'no_found_rows\' => true,
    \'post_type\'=>\'product\',
    \'post_status\' => \'publish\',
    \'cache_results\' => false,
    \'update_post_term_cache\' => false,
    \'update_post_meta_cache\' => false
);
$querya = new wp_query($argss); 
if ($querya->have_posts()) :
    $row_count=0; 
while ($querya->have_posts()) :
    $row_count++;
    $querya->the_post();
    global $product;
    the_title(); ?>
<?php endwhile; endif; ?>
<?php get_footer(); ?>
我还尝试使用页面模板(相同代码)添加新页面,URL:

http://www.v-tac.hr/rezultati-pretrazivanja/

我的wp配置。php文件已在调试时进行调试。日志文件为空,未显示任何PHP错误:

define(\'WP_DEBUG\', true);
define(\'WP_DEBUG_LOG\', true);
define(\'SAVEQUERIES\', true);
define(\'WP_DEBUG_DISPLAY\', true);
有什么建议吗?想法?

谢谢

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

你完全做错了。您不应该在主查询的位置运行自定义查询。请参见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_pageWP_Query

您不应该设置cache_results 为false。因为您将使用模板标记(likethe_title()the_content()),您可能会运行大量额外的db查询来获取您已经拥有的数据。这几乎从来都不是一个好主意cache_results 为false。

设置之前update_post_term_cacheupdate_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点击量。这会告诉你你在做什么,是好是坏