如何在WP_Query中根据多个文章标题进行搜索
解决WP_Query多标题查询的问题
你的代码里直接将数组传给WP_Query的s参数是无效的,因为该参数仅支持单个字符串,无法处理数组。下面提供两种可行的解决方案:
方案一:使用posts_search过滤器修改SQL查询
通过过滤器替换默认的搜索条件,将多个标题用OR连接,实现多标题模糊匹配:
$post_title = array('book', 'car', 'bike'); // 转义每个标题,防止SQL注入 $search_terms = array_map(function($term) { return esc_sql(wp_unslash($term)); }, $post_title); // 构建多标题OR查询条件 $search_clauses = array_map(function($term) { global $wpdb; return "($wpdb->posts.post_title LIKE '%$term%')"; }, $search_terms); $search_condition = implode(' OR ', $search_clauses); // 添加过滤器修改搜索逻辑 add_filter('posts_search', function($search, $wp_query) use ($search_condition) { global $wpdb; // 仅对当前自定义类型的查询生效 if (!empty($wp_query->query_vars['post_type']) && $wp_query->query_vars['post_type'] === 'custom') { // 替换默认的搜索条件 $search = preg_replace("/AND \(.*?post_title LIKE.*?\)/", "AND ($search_condition)", $search); } return $search; }, 10, 2); // 构建查询参数(无需再传`s`参数) $conditions = array( 'posts_per_page' => 9, 'paged' => $paged, 'post_type' => 'custom', 'order' => 'DESC', 'post_status' => "publish", ); $the_query = new WP_Query($conditions); // 移除过滤器,避免影响后续查询 remove_filter('posts_search', '__return_empty_string', 10);
方案二:先获取匹配标题的文章ID,再用post__in查询
先通过数据库查询拿到符合标题的文章ID,再将ID数组传给post__in参数:
$post_title = array('book', 'car', 'bike'); $post_ids = array(); global $wpdb; foreach ($post_title as $title) { // 查询匹配标题的文章ID $id = $wpdb->get_var($wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title LIKE %s AND post_type='custom' AND post_status='publish'", '%' . esc_sql($title) . '%' )); if ($id) { $post_ids[] = $id; } } // 去重,避免重复ID $post_ids = array_unique($post_ids); $conditions = array( 'posts_per_page' => 9, 'paged' => $paged, 'post_type' => 'custom', 'order' => 'DESC', 'post_status' => "publish", 'post__in' => $post_ids, 'orderby' => 'post__in' // 保持标题数组的查询顺序 ); $the_query = new WP_Query($conditions);
注意事项
- 两种方案都做了SQL注入防护,务必保留
esc_sql或$wpdb->prepare的使用; - 若需要精确匹配标题,将
LIKE '%$term%'替换为= '%s'即可; - 方案一中的过滤器使用后记得移除,防止干扰其他
WP_Query实例。
内容的提问来源于stack exchange,提问作者Muzammil Dafedar
相关产品推荐
相关产品推荐

