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

WordPress如何获取标题、标签或分类含指定关键词的文章?

解决get_posts()同时匹配标题、内容和标签的问题

默认情况下,WordPress的get_posts()函数的's'参数仅搜索文章的标题、内容和摘要,不会覆盖标签这类分类法字段。要让搜索范围包含标签,需要通过posts_where钩子修改查询的SQL条件。

方法一:全局修改搜索行为

在主题的functions.php或自定义插件中添加以下代码,让所有前台搜索自动包含标签匹配:

function search_include_tags($where, $wp_query) {
    global $wpdb;
    
    // 仅在前台搜索且存在关键词时生效
    if ( !is_admin() && $wp_query->is_search && $wp_query->get('s') ) {
        $search_term = $wp_query->get('s');
        // 拼接标签关联的查询条件,避免SQL注入
        $where .= " OR EXISTS (
            SELECT 1 FROM $wpdb->term_relationships tr
            JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
            JOIN $wpdb->terms t ON tt.term_id = t.term_id
            WHERE tr.object_id = $wpdb->posts.ID
            AND tt.taxonomy = 'post_tag'
            AND t.name LIKE '%{$wpdb->esc_like($search_term)}%'
        )";
    }
    return $where;
}
add_filter('posts_where', 'search_include_tags', 10, 2);

之后你的原有代码无需修改,'s'参数会同时匹配标题、内容和标签:

$args = array(
    'numberposts' => 99,
    's' => 'sunflower'
); 
$postslist = get_posts( $args );  

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

如果不想全局修改搜索逻辑,可以给get_posts()添加自定义标记,仅指定查询包含标签搜索:

首先修改钩子函数:

function search_include_tags($where, $wp_query) {
    global $wpdb;
    
    // 仅当查询包含自定义参数include_tags时生效
    if ( !is_admin() && $wp_query->get('include_tags') && $wp_query->get('s') ) {
        $search_term = $wp_query->get('s');
        $where .= " OR EXISTS (
            SELECT 1 FROM $wpdb->term_relationships tr
            JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
            JOIN $wpdb->terms t ON tt.term_id = t.term_id
            WHERE tr.object_id = $wpdb->posts.ID
            AND tt.taxonomy = 'post_tag'
            AND t.name LIKE '%{$wpdb->esc_like($search_term)}%'
        )";
    }
    return $where;
}
add_filter('posts_where', 'search_include_tags', 10, 2);

然后调用get_posts()时加上自定义参数:

$args = array(
    'numberposts' => 99,
    's' => 'sunflower',
    'include_tags' => true // 标记该查询需要包含标签搜索
); 
$postslist = get_posts( $args );  

补充说明

  • 若需要同时匹配分类(category),可在SQL条件中添加OR tt.taxonomy = 'category';
  • 必须使用$wpdb->esc_like()处理搜索关键词,避免SQL注入风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:09:14