我正在尝试替换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 ...
现在对数据库的调用消耗更少了(没有参数),但它仍然是对数据库的调用,我想消除它。
知道怎么做吗?
顺致敬意,
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标志是什么,所以您需要确保没有设置它。