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

WP_Query自定义文章类型:标题/自定义分类OR过滤实现咨询

实现自定义文章类型的OR条件搜索(标题关键词 + 自定义分类)

嘿,这个需求我熟!咱们可以通过WP_Query的组合参数轻松实现「标题含关键词」或者「属于指定自定义分类」的OR逻辑搜索,还能完美覆盖你提到的两种场景,下面一步步来:

核心思路

要达成标题包含目标关键词 OR 归属于指定自定义分类的效果,我们需要结合WP_Query的tax_query(处理分类筛选)和search(处理标题搜索)参数,再通过设置relation为OR来让两个条件满足任意一个即可。同时要确保指定正确的自定义文章类型。

完整可复用代码示例

假设你的自定义文章类型是custom_post_type,自定义分类法是custom_taxonomy,直接套用下面的代码就行:

// 定义你的搜索关键词、自定义文章类型和分类法
$search_term = 'human';
$target_post_type = 'custom_post_type';
$target_taxonomy = 'custom_taxonomy';

// 先检查目标分类是否存在
$tax_term = get_term_by('name', $search_term, $target_taxonomy);
$tax_exists = $tax_term ? true : false;

// 构建WP_Query基础参数
$args = array(
    'post_type' => $target_post_type,
    'posts_per_page' => -1, // 显示所有符合条件的文章,可按需改为固定数字
    'relation' => 'OR', // 关键:设置两个条件为「或」关系
    's' => $search_term, // 传入搜索关键词
);

// 如果分类存在,添加分类筛选条件
if ($tax_exists) {
    $args['tax_query'] = array(
        array(
            'taxonomy' => $target_taxonomy,
            'field'    => 'slug', // 用slug比名称更稳定,也可以换成'id'
            'terms'    => $tax_term->slug,
        ),
    );
}

// 过滤搜索范围:让WP_Query只搜索文章标题(默认会搜内容、摘要等)
add_filter('posts_search', function($search, $wp_query) use ($search_term) {
    global $wpdb;
    
    if (empty($search_term)) {
        return $search;
    }
    
    // 构建仅搜索标题的SQL片段
    $search = " AND {$wpdb->posts}.post_title LIKE '%{$wpdb->esc_like($search_term)}%'";
    
    return $search;
}, 10, 2);

// 执行查询
$custom_query = new WP_Query($args);

// 移除过滤器,避免影响后续其他查询
remove_filter('posts_search', '__return_empty_string', 10);

// 输出结果循环
if ($custom_query->have_posts()) {
    while ($custom_query->have_posts()) {
        $custom_query->the_post();
        // 这里替换成你需要的文章输出格式
        echo '<article>';
        echo '<h3><a href="' . get_permalink() . '">' . get_the_title() . '</a></h3>';
        echo '<p>' . get_the_excerpt() . '</p>';
        echo '</article>';
    }
    wp_reset_postdata(); // 重置文章数据,避免干扰全局查询
} else {
    echo '<p>没有找到符合条件的文章</p>';
}

关键细节拆解

  • 分类存在性判断:用get_term_by检查目标名称的分类是否存在,这直接对应你提到的两种场景:
    • 如果分类不存在,tax_query不会被添加,查询只会返回标题含关键词的文章;
    • 如果分类存在,分类筛选和标题搜索会同时生效,且满足任意一个条件就会被返回。
  • OR关系设置:'relation' => 'OR'是实现「或逻辑」的核心,一定要放在参数数组里,否则默认是「且逻辑」。
  • 仅搜索标题:通过posts_search过滤器重写搜索逻辑,让WP_Query只在标题中匹配关键词,完全符合你的需求。
  • 清理过滤器:执行完查询后必须移除自定义过滤器,不然会影响后续所有WP_Query的搜索行为。

场景验证

  1. 不存在"human"分类但有标题含"human"的文章:此时tax_exists为false,查询仅执行标题搜索,保留所有符合的文章,完全符合要求;
  2. 存在"human"分类且有标题含"human"的文章:两个条件同时生效,返回所有属于该分类的文章 + 所有标题含关键词的文章(WP_Query会自动去重,不用担心重复内容)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:02:43