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的搜索行为。
场景验证
- 不存在"human"分类但有标题含"human"的文章:此时
tax_exists为false,查询仅执行标题搜索,保留所有符合的文章,完全符合要求; - 存在"human"分类且有标题含"human"的文章:两个条件同时生效,返回所有属于该分类的文章 + 所有标题含关键词的文章(WP_Query会自动去重,不用担心重复内容)。
内容的提问来源于stack exchange,提问作者Darkering
相关产品推荐
相关产品推荐

