替换/静音/停止搜索查询

时间:2020-06-14 作者:fat_mike

我正在尝试替换WP中的搜索功能。

我已经创建了search.php 包含我要显示的所有结果的模板。

我不想从WP数据库得到任何结果。我只想在search.php 使用本机searchform.php 还有本地人?s=keyword URL结构。

这样做是因为SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts ... 使用搜索内置查询非常耗费CPU。

所以在我的主题功能中。我添加的php:

add_action(\'pre_get_posts\', \'no_search_query\');
function no_search_query($query) {
    if($query->is_search() && $query->is_main_query() && get_query_var(\'s\', false)) {
        unset( $query->query_vars[\'s\'] );
        $query->set( \'post__in\', \'\' );
    }
}
并添加:

$is_search_query = ($_GET["s"]) ? ($_GET["s"]) : 0;
到我的搜索。php获取搜索关键字。

这实际上起到了作用,但仍在调用查询。

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts  WHERE 1=1  AND wp_posts.post_type IN ...
现在对数据库的调用消耗更少了(没有参数),但它仍然是对数据库的调用,我想消除它。

知道怎么做吗?

顺致敬意,

1 个回复
SO网友:mozboz

我对SQL\\u CALC\\u FOUND\\u行进行了快速grep,并找到了几个实例。我不确定在您的案例中调用的是哪一个,但这里有一个来自wp includes/class wp query的有趣的例子。php第2904行之后:

$found_rows = \'\';
if ( ! $q[\'no_found_rows\'] && ! empty( $limits ) ) {
  $found_rows = \'SQL_CALC_FOUND_ROWS\';
}

$old_request   = "SELECT $found_rows $distinct $fields FROM {$wpdb->posts} $join WHERE 1=1 $where $groupby $orderby $limits";
$this->request = $old_request;

if ( ! $q[\'suppress_filters\'] ) {
  /**
   * Filters the completed SQL query before sending.
   *
   * @since 2.0.0
   *
   * @param string   $request The complete SQL query.
   * @param WP_Query $this    The WP_Query instance (passed by reference).
   */
  $this->request = apply_filters_ref_array( \'posts_request\', array( $this->request, &$this ) );
}
重要的是这里有一个过滤器,您可以从中获取SQL并对其进行自己的检查。看起来您无法停止查询的运行,但至少您可以将SQL更改为不影响您的内容;-)

我不知道这里的suppress\\u filters标志是什么,所以您需要确保没有设置它。