You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修复扩展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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:36:22