WordPress无插件实现搜索仅匹配标题与specialites分类法
WordPress无插件实现clients类型仅匹配标题+specialites分类法搜索
直接通过WordPress原生查询过滤器改写搜索SQL即可实现,不需要依赖任何搜索插件,也不会影响你现有表单的自动补全、定位筛选等自定义功能。
实现逻辑
- 仅在前端发起
clients自定义文章类型的搜索请求时生效,不干扰后台搜索、其他页面的查询逻辑 - 移除原生搜索对文章正文
post_content字段的匹配规则,仅保留文章标题post_title的匹配 - 关联分类法相关数据表,追加
specialites分类法的术语匹配规则,匹配逻辑为「标题命中 或 specialites分类法绑定术语命中」 - 自动对结果去重,避免关联多分类术语时出现重复文章
完整代码
将以下代码放入当前主题的functions.php文件,或者自定义功能插件中即可:
// 改写搜索核心匹配条件:移除正文匹配,仅保留标题匹配 add_filter( 'posts_search', function( $search, $wp_query ) { global $wpdb; // 生效范围判断:非后台、是搜索页、查询文章类型包含clients if ( is_admin() || !$wp_query->is_search() || !in_array('clients', (array)$wp_query->get('post_type')) ) { return $search; } $keyword = $wp_query->get('s'); if (empty($keyword)) return $search; $like_pattern = '%' . $wpdb->esc_like($keyword) . '%'; $search = $wpdb->prepare(" AND ({$wpdb->posts}.post_title LIKE %s) ", $like_pattern); return $search; }, 10, 2 ); // 关联specialites分类法数据表 add_filter( 'posts_join', function( $join_sql, $wp_query ) { global $wpdb; if ( is_admin() || !$wp_query->is_search() || !in_array('clients', (array)$wp_query->get('post_type')) ) { return $join_sql; } $keyword = $wp_query->get('s'); if (empty($keyword)) return $join_sql; // 关联分类关系、分类taxonomy、分类术语三张表,仅关联specialites分类法 $join_sql .= " LEFT JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id LEFT JOIN {$wpdb->term_taxonomy} ON {$wpdb->term_relationships}.term_taxonomy_id = {$wpdb->term_taxonomy}.term_taxonomy_id AND {$wpdb->term_taxonomy}.taxonomy = 'specialites' LEFT JOIN {$wpdb->terms} ON {$wpdb->term_taxonomy}.term_id = {$wpdb->terms}.term_id "; return $join_sql; }, 10, 2 ); // 追加specialites分类术语匹配条件 add_filter( 'posts_where', function( $where_sql, $wp_query ) { global $wpdb; if ( is_admin() || !$wp_query->is_search() || !in_array('clients', (array)$wp_query->get('post_type')) ) { return $where_sql; } $keyword = $wp_query->get('s'); if (empty($keyword)) return $where_sql; $like_pattern = '%' . $wpdb->esc_like($keyword) . '%'; // 追加OR条件:命中specialites分类术语也返回结果 $where_sql .= $wpdb->prepare(" OR {$wpdb->terms}.name LIKE %s ", $like_pattern); // 开启查询去重,避免同文章绑定多个术语时重复返回 $wp_query->set('distinct', true); return $where_sql; }, 10, 2 );
补充说明
- 你现有的搜索表单不需要做任何修改,表单里隐藏传入
post_type[]=clients的逻辑可以被代码正常识别 - 代码仅修改搜索的匹配范围,不会改动原有查询的参数结构,你之前写的自动补全、搜索建议、定位筛选等功能可以正常运行
- 如果需要额外匹配分类法的别名(slug)或者术语描述,可以在
posts_where的匹配条件里追加对应字段判断即可 - 所有SQL匹配值都做了转义处理,不存在SQL注入风险
内容的提问来源于stack exchange,提问作者kkqe
相关产品推荐
相关产品推荐

