WordPress自定义REST API端点WP_Query多关键词搜索问题排查
问题分析
原代码存在三个核心问题导致多关键词搜索失效:
compare参数直接放在WP_Query主参数中无效,它仅适用于meta_query或tax_query的子条件sentence => true会强制将搜索词作为完整短语匹配,要求多关键词必须同时全部出现在内容/标题中才会命中- WP_Query默认将搜索词的空格、逗号解析为AND逻辑,无法直接实现OR匹配
修复方案
替换原WP_Query参数逻辑,通过posts_search过滤器修改SQL查询,实现多关键词OR匹配:
// Register new REST API route add_action('rest_api_init', function () { register_rest_route('fx-product-search', '/products/search', array( 'methods' => 'GET', 'callback' => 'search_products', 'permission_callback' => '__return_true', )); }); function search_products($request) { $terms = $request->get_param('term'); if (empty($terms)) { return rest_ensure_response(array('message' => 'No search term provided.')); } // 分割关键词并清理前后空格 $terms_array = array_map('trim', explode(',', $terms)); // 过滤空关键词 $terms_array = array_filter($terms_array); if (empty($terms_array)) { return rest_ensure_response(array('message' => 'Invalid search terms.')); } // 临时过滤器:修改搜索SQL为OR逻辑 add_filter('posts_search', function($search, $wp_query) use ($terms_array) { global $wpdb; if (empty($search) || !$wp_query->is_search()) { return $search; } // 构造每个关键词的搜索条件 $search_conditions = []; foreach ($terms_array as $term) { $term = esc_sql($wpdb->esc_like($term)); $search_conditions[] = "({$wpdb->posts}.post_title LIKE '%{$term}%' OR {$wpdb->posts}.post_content LIKE '%{$term}%')"; } // 替换原搜索SQL为OR连接的条件 $search = ' AND (' . implode(' OR ', $search_conditions) . ')'; return $search; }, 10, 2); $args = array( 'post_type' => 'fx-product', 'posts_per_page' => -1, 'suppress_filters' => false, // 必须开启过滤器生效 'post_status' => 'publish' // 限定发布状态,避免查询草稿等 ); $query = new WP_Query($args); // 移除临时过滤器,避免影响后续查询 remove_filter('posts_search', '__return_empty_string', 10); $results = []; if ($query->have_posts()) { while ($query->have_posts()) { $query->the_post(); $content = get_field('content', get_the_ID()); $thumbnail_id = get_post_meta(get_the_ID(), 'product_image', true); $thumbnail_url = wp_get_attachment_url($thumbnail_id); $results[] = array( 'id' => get_the_ID(), 'title' => get_the_title(), 'link' => get_permalink(), 'content' => $content, 'thumbnail' => $thumbnail_url, ); } } wp_reset_postdata(); if (empty($results)) { return rest_ensure_response(array('message' => 'No results found.')); } else { return rest_ensure_response($results); } }
关键修改说明
- 移除无效的
s、compare、sentence参数,改用posts_search过滤器直接修改SQL查询 - 对关键词数组做清理:去除前后空格、过滤空值,避免无效查询
- 临时添加过滤器,构造每个关键词匹配标题或内容的OR条件,替换默认的AND逻辑
- 设置
suppress_filters => false确保过滤器能生效 - 查询后立即移除过滤器,防止干扰其他WP_Query操作
测试验证
使用原多关键词测试URL:.../products/search?term=Public Product 500,Copier 5000,Quick Print 400i
现在会返回匹配任意一个关键词的fx-product文章。
内容的提问来源于stack exchange,提问作者O. Abrahim
相关产品推荐
相关产品推荐

