在最近的历史中,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 );
最合适的回答,由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关系字段查找非常慢的情况下也很有用。