修复扩展WP搜索的自定义WP_Query函数无法检索文章内容问题
WordPress搜索扩展函数修复方案
问题根源
原函数在构建SQL查询条件时直接重置了$search变量,完全覆盖WordPress原生生成的包含文章内容(post_content)匹配的查询逻辑,仅保留了文章标题、分类法名称的匹配规则,因此启用后无法检索文章正文内容。同时原函数存在分类法关联表缺失、未做SQL转义的隐患。
修正后代码
/** * 扩展WordPress搜索范围,支持标题、正文、分类法术语(含产品属性)匹配 */ function and_extend_search( $search, &$wp_query ) { global $wpdb; // 空搜索直接返回原生结果 if ( empty( $search ) ) { return $search; } $search_terms = $wp_query->query_vars['s']; $term_arr = explode( ' ', trim( $search_terms ) ); // 关键词拆分失败时使用完整关键词 if ( $term_arr === false || count( $term_arr ) === 0 ) { $term_arr = [ $search_terms ]; } $search = ''; foreach ( $term_arr as $term ) { // 转义特殊字符,避免SQL注入 $like_term = '%' . $wpdb->esc_like( $term ) . '%'; $search .= $wpdb->prepare( " AND ( -- 匹配文章标题 ({$wpdb->posts}.post_title LIKE %s) -- 匹配文章内容(恢复原生检索能力) OR ({$wpdb->posts}.post_content LIKE %s) -- 匹配分类法/属性术语名称 OR EXISTS ( SELECT * FROM {$wpdb->term_relationships} INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->term_relationships}.term_taxonomy_id = {$wpdb->term_taxonomy}.term_taxonomy_id INNER JOIN {$wpdb->terms} ON {$wpdb->term_taxonomy}.term_id = {$wpdb->terms}.term_id WHERE {$wpdb->terms}.name LIKE %s AND {$wpdb->term_relationships}.object_id = {$wpdb->posts}.ID ) )", $like_term, $like_term, $like_term ); } return $search; } // 挂载到搜索查询过滤器,优先级设为999避免被其他逻辑覆盖 add_filter( 'posts_search', 'and_extend_search', 999, 2 );
关键修改点
- 在查询条件中新增
post_content字段匹配规则,保留WordPress原生的文章内容检索能力 - 补全分类法查询缺失的
term_taxonomy表关联,修复原函数术语ID匹配错误问题,可正常支持所有公开分类法(包括WooCommerce产品属性) - 加入
$wpdb->esc_like()与$wpdb->prepare()做关键词转义,消除SQL注入风险 - 对搜索关键词做首尾空白裁剪,避免空字符串导致的无效匹配
内容的提问来源于stack exchange,提问作者user17098947
相关产品推荐
相关产品推荐

