WordPress搜索慢问题求助:仅标题搜索过滤代码及优化方案
解决WordPress大站点搜索慢的方案
一、限制搜索范围为仅标题的代码实现
不要直接修改wp-includes/class-wp-query.php核心文件(WordPress更新会覆盖修改),使用pre_get_posts钩子实现全局搜索范围限制,同时覆盖前台、后台文章搜索及图库(附件)搜索场景:
function restrict_search_to_title_only( $query ) { // 仅处理搜索请求,排除管理员后台非搜索类内部查询 if ( $query->is_search && ! is_admin() || ( is_admin() && isset( $_GET['s'] ) && ( isset( $_GET['post_type'] ) && ( $_GET['post_type'] === 'post' || $_GET['post_type'] === 'attachment' ) ) ) ) { // 重置搜索字段为仅标题 $query->set( 'search_columns', array( 'post_title' ) ); } return $query; } add_action( 'pre_get_posts', 'restrict_search_to_title_only' );
将上述代码添加到当前主题的functions.php文件,或自定义插件中。
代码说明:
- 同时覆盖前台公开搜索、后台文章列表搜索、后台图库(attachment类型)搜索三个场景;
- 通过
search_columns参数指定仅检索post_title字段,替代默认的多字段检索逻辑; - 避开管理员后台的非搜索类内部查询,避免干扰其他功能正常运行。
二、额外优化方案(进一步降低查询耗时)
1. 给post_title字段添加数据库索引
登录MariaDB管理工具(如phpMyAdmin),执行以下SQL语句给wp_posts表的post_title字段添加全文索引:
ALTER TABLE wp_posts ADD FULLTEXT INDEX ft_post_title (post_title);
(注意:将wp_posts替换为你的实际数据库表前缀)
2. 启用MariaDB查询缓存
在MariaDB配置文件(如my.cnf/my.ini)中添加以下配置:
query_cache_type = 1 query_cache_size = 64M query_cache_limit = 2M
修改后重启MariaDB服务生效。
3. 缓存搜索结果页面
安装并配置缓存插件(如WP Rocket、W3 Total Cache),将搜索结果页面加入缓存规则,重复搜索请求直接返回缓存内容,避免重复查询数据库。
4. 替换为专业搜索插件
如果仅限制标题仍无法满足性能需求,可使用专门的搜索插件(如ElasticPress、Relevanssi),这类插件基于优化的查询逻辑或全文搜索引擎,能大幅提升大站点的搜索速度。
内容的提问来源于stack exchange,提问作者Ali Kiani
相关产品推荐
相关产品推荐

