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

如何让WP_Query仅搜索文章标题而非内容?

只让WP_Query搜索文章标题的解决方案

嘿,这个需求我之前刚好碰到过!默认的WP_Query s 参数确实会同时检索post_title和post_content,要实现只搜标题不碰内容,咱们可以借助WordPress的posts_search过滤器来修改底层的查询逻辑,具体操作如下:

方法一:全局生效的标题搜索

如果希望整个站点的搜索都只针对文章标题,把下面的代码添加到你的主题functions.php文件或者自定义插件里:

function search_only_post_title( $search, $wp_query ) {
    global $wpdb;

    // 如果没有搜索关键词,直接返回原查询
    if ( empty( $search ) ) {
        return $search;
    }

    $query_vars = $wp_query->query_vars;
    // 处理是否精确匹配的逻辑
    $wildcard = ! empty( $query_vars['exact'] ) ? '' : '%';

    // 构建仅匹配post_title的SQL片段
    $search = " AND ({$wpdb->posts}.post_title LIKE '{$wildcard}" . $wpdb->esc_like( $query_vars['s'] ) . "{$wildcard}') ";

    return $search;
}
add_filter( 'posts_search', 'search_only_post_title', 10, 2 );

添加后,你原来的WP_Query代码完全不用改,依然像之前那样调用就行:

$args = array( 's' => 'Keyword' );
$the_query = new WP_Query( $args );

方法二:仅针对特定查询生效

如果你不想全局修改搜索逻辑,只想让某一次WP_Query只搜标题,可以在查询前后临时添加和移除过滤器:

// 先添加过滤器
add_filter( 'posts_search', 'search_only_post_title', 10, 2 );

// 执行你的查询
$args = array( 's' => 'Keyword' );
$the_query = new WP_Query( $args );

// 查询完成后移除过滤器,避免影响其他查询
remove_filter( 'posts_search', 'search_only_post_title', 10, 2 );

// 别忘了把上面的search_only_post_title函数也加到functions.php里哦

代码说明

这个过滤器的作用是替换掉WordPress默认的搜索SQL片段,把原本同时匹配标题和内容的逻辑,改成只针对post_title字段进行模糊匹配。同时代码里用了$wpdb->esc_like()来处理搜索关键词,避免出现SQL注入的风险,安全性拉满~

内容的提问来源于stack exchange,提问作者aslamdoctor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:58:38