将默认搜索查询限制为POST_TITLE

时间:2018-02-13 作者:Slam

在最近的历史中,WordPress将默认搜索查询从仅标题更改为标题、摘录和帖子内容。这在小型网站上效果很好,但在有许多帖子或很长帖子内容的网站上,搜索时间可能长得令人无法接受。

那么,我们如何修改默认的WordPress搜索,将其限制为仅搜索帖子标题,而不搜索帖子摘录或内容呢?

例如,在我目前有100000篇文章的项目中,搜索需要32秒才能运行。我还使用了ACF关系字段,而typeahead搜索速度非常慢。问题似乎是的默认查询/?s 哪个搜索post_title, post_excerpt, 和post_content.

我发现了许多关于扩展查询的文章和SE帖子,例如包括post\\u元字段,但没有任何关于将其限制为post\\u标题搜索的结论。

如果插件更改所有查询(包括ACF关系查询)的搜索函数,则解决方案可以是自定义函数或插件。

在股票WordPress 4.9搜索中,查询监视器按如下方式报告查询:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts 
WHERE 1=1 
AND (((wp_posts.post_title LIKE \'%foo%\')
OR (wp_posts.post_excerpt LIKE \'%foo%\')
OR (wp_posts.post_content LIKE \'%foo%\'))
AND ((wp_posts.post_title LIKE \'%bar%\')
OR (wp_posts.post_excerpt LIKE \'%bar%\')
OR (wp_posts.post_content LIKE \'%bar%\'))) 
AND wp_posts.post_type IN (\'post\', \'page\', \'attachment\')
AND (wp_posts.post_status = \'publish\'
OR wp_posts.post_author = 1
AND wp_posts.post_status = \'private\') 
ORDER BY (CASE
WHEN wp_posts.post_title LIKE \'%foo bar%\'
THEN 1
WHEN wp_posts.post_title LIKE \'%foo%\'
AND wp_posts.post_title LIKE \'%bar%\'
THEN 2
WHEN wp_posts.post_title LIKE \'%foo%\'
OR wp_posts.post_title LIKE \'%bar%\'
THEN 3
WHEN wp_posts.post_excerpt LIKE \'%foo bar%\'
THEN 4
WHEN wp_posts.post_content LIKE \'%foo bar%\'
THEN 5
ELSE 6 END), wp_posts.post_date DESC
LIMIT 0, 10
我得到的最接近的答案是修改pre_get_post, 但法典没有解释如何更改搜索的字段。我还发现this solution 但这根本不起作用。

编辑:越来越近。这是我需要在中修改的行wp-includes/class-wp-query.php:

$search .= $wpdb->prepare( "{$searchand}(({$wpdb->posts}.post_title $like_op %s) $andor_op ({$wpdb->posts}.post_excerpt $like_op %s) $andor_op ({$wpdb->posts}.post_content $like_op %s))", $like, $like, $like );

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

在搜索了20多篇博客文章后,我将多种方法结合起来,使之奏效。

function my_search_by_title_only( $search, $wp_query ) {
  if ( ! empty( $search ) && ! empty( $wp_query->query_vars[\'search_terms\'] ) ) {
    global $wpdb;
    $q = $wp_query->query_vars;
    $n = ! empty( $q[\'exact\'] ) ? \'\' : \'%\';
    $search = array();
    foreach ( ( array ) $q[\'search_terms\'] as $term )
    $search[] = $wpdb->prepare( "$wpdb->posts.post_title LIKE %s", $n . $wpdb->esc_like( $term ) . $n );
    if ( ! is_user_logged_in() )
    $search[] = "$wpdb->posts.post_password = \'\'";
    $search = \' AND \' . implode( \' AND \', $search );
  }
  return $search;
}
add_filter( \'posts_search\', \'my_search_by_title_only\', 10, 2 );
与其他较旧的解决方案不同,这不会对菜单或最新博客帖子页面等产生不利影响。

这将只匹配帖子标题中的搜索词,从而大大加快了在有大量帖子的网站上的搜索速度。这适用于前端和管理,因此在ACF关系字段查找非常慢的情况下也很有用。

结束

相关推荐

Search Media by taxonomy

如何根据前端的分类法搜索媒体?以下查询显示我希望通过搜索返回的内容:$args = array( \'post_type\' => \'attachment\', \'post_status\' => \'inherit\', // for PDFs \'post_mime_type\' => \'application/pdf\', // if you need PDFs from a specific media c

将默认搜索查询限制为POST_TITLE - 小码农CODE - 行之有效找到问题解决它

将默认搜索查询限制为POST_TITLE

时间:2018-02-13 作者:Slam

在最近的历史中,WordPress将默认搜索查询从仅标题更改为标题、摘录和帖子内容。这在小型网站上效果很好,但在有许多帖子或很长帖子内容的网站上,搜索时间可能长得令人无法接受。

那么,我们如何修改默认的WordPress搜索,将其限制为仅搜索帖子标题,而不搜索帖子摘录或内容呢?

例如,在我目前有100000篇文章的项目中,搜索需要32秒才能运行。我还使用了ACF关系字段,而typeahead搜索速度非常慢。问题似乎是的默认查询/?s 哪个搜索post_title, post_excerpt, 和post_content.

我发现了许多关于扩展查询的文章和SE帖子,例如包括post\\u元字段,但没有任何关于将其限制为post\\u标题搜索的结论。

如果插件更改所有查询(包括ACF关系查询)的搜索函数,则解决方案可以是自定义函数或插件。

在股票WordPress 4.9搜索中,查询监视器按如下方式报告查询:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts 
WHERE 1=1 
AND (((wp_posts.post_title LIKE \'%foo%\')
OR (wp_posts.post_excerpt LIKE \'%foo%\')
OR (wp_posts.post_content LIKE \'%foo%\'))
AND ((wp_posts.post_title LIKE \'%bar%\')
OR (wp_posts.post_excerpt LIKE \'%bar%\')
OR (wp_posts.post_content LIKE \'%bar%\'))) 
AND wp_posts.post_type IN (\'post\', \'page\', \'attachment\')
AND (wp_posts.post_status = \'publish\'
OR wp_posts.post_author = 1
AND wp_posts.post_status = \'private\') 
ORDER BY (CASE
WHEN wp_posts.post_title LIKE \'%foo bar%\'
THEN 1
WHEN wp_posts.post_title LIKE \'%foo%\'
AND wp_posts.post_title LIKE \'%bar%\'
THEN 2
WHEN wp_posts.post_title LIKE \'%foo%\'
OR wp_posts.post_title LIKE \'%bar%\'
THEN 3
WHEN wp_posts.post_excerpt LIKE \'%foo bar%\'
THEN 4
WHEN wp_posts.post_content LIKE \'%foo bar%\'
THEN 5
ELSE 6 END), wp_posts.post_date DESC
LIMIT 0, 10
我得到的最接近的答案是修改pre_get_post, 但法典没有解释如何更改搜索的字段。我还发现this solution 但这根本不起作用。

编辑:越来越近。这是我需要在中修改的行wp-includes/class-wp-query.php:

$search .= $wpdb->prepare( "{$searchand}(({$wpdb->posts}.post_title $like_op %s) $andor_op ({$wpdb->posts}.post_excerpt $like_op %s) $andor_op ({$wpdb->posts}.post_content $like_op %s))", $like, $like, $like );

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

在搜索了20多篇博客文章后,我将多种方法结合起来,使之奏效。

function my_search_by_title_only( $search, $wp_query ) {
  if ( ! empty( $search ) && ! empty( $wp_query->query_vars[\'search_terms\'] ) ) {
    global $wpdb;
    $q = $wp_query->query_vars;
    $n = ! empty( $q[\'exact\'] ) ? \'\' : \'%\';
    $search = array();
    foreach ( ( array ) $q[\'search_terms\'] as $term )
    $search[] = $wpdb->prepare( "$wpdb->posts.post_title LIKE %s", $n . $wpdb->esc_like( $term ) . $n );
    if ( ! is_user_logged_in() )
    $search[] = "$wpdb->posts.post_password = \'\'";
    $search = \' AND \' . implode( \' AND \', $search );
  }
  return $search;
}
add_filter( \'posts_search\', \'my_search_by_title_only\', 10, 2 );
与其他较旧的解决方案不同,这不会对菜单或最新博客帖子页面等产生不利影响。

这将只匹配帖子标题中的搜索词,从而大大加快了在有大量帖子的网站上的搜索速度。这适用于前端和管理,因此在ACF关系字段查找非常慢的情况下也很有用。

相关推荐

如何将变量传递给Get_Search_Form()?

是否可以将变量传递给get_search_form()? 我在两个地方使用它:一个在标题中,另一个在内容的搜索页面上。后者必须具有附加类,例如。search--full. 我试着用is_search() 但尽管它在其他页面上运行良好,但在搜索页面上,两种表单都有search--full 班