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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:10:57