WordPress自定义文章类型归档页:标题搜索功能故障排查
问题分析与修复方案
核心问题1:标题搜索用错查询方式
你在pre_get_posts里用meta_query搜索post_title是错误的——post_title是文章表的原生字段,不属于自定义字段,所以meta_query根本找不到对应数据,导致标题搜索失效。
核心问题2:Query Var添加语法错误
add_query_vars_filter里用了$vars[] .= "organization";和$vars[] .= "r_name";,这里的.=是字符串拼接操作,会把数组元素和字符串拼接,导致注册的查询变量格式错误,虽然organization功能暂时正常,但这是潜在bug。
次要问题:分类筛选的字段不匹配
归档模板里下拉框传递的是分类slug,但tax_query里设置的field是term_id,两者不匹配,虽然你说organization功能正常,大概率是巧合,需要统一字段类型。
修复后的完整代码
1. 修正后的functions.php
/** * 注册自定义查询变量 */ function add_query_vars_filter($vars) { // 正确添加查询变量,使用=而非.= $vars[] = "organization"; $vars[] = "r_name"; return $vars; } add_filter("query_vars", "add_query_vars_filter"); /** * 重写研究者归档查询 */ function researcher_archive($query) { if ( $query->is_archive("researcher") && $query->is_main_query() && !is_admin() ) { $category_slug = get_query_var("organization", false); $search_title = get_query_var("r_name", false); // 处理标题搜索:精准匹配文章标题 if ($search_title) { add_filter('posts_search', function($search, $wp_query) use ($search_title) { global $wpdb; $escaped_title = $wpdb->esc_like($search_title); $search = " AND {$wpdb->posts}.post_title LIKE '%{$escaped_title}%'"; return $search; }, 10, 2); } // 处理分类筛选:统一用slug匹配 $tax_query_array = []; if ($category_slug) { $tax_query_array = [ [ "taxonomy" => "organization", "field" => "slug", "terms" => $category_slug, ] ]; } if (!empty($tax_query_array)) { $query->set("tax_query", $tax_query_array); } $query->set('posts_per_page', 12); $query->set('orderby', 'wpse_last_word'); $query->set('order', 'ASC'); } } add_action("pre_get_posts", "researcher_archive");
2. 修正后的archive-researcher.php
主要修复下拉框的选中判断逻辑,同时添加安全转义:
<?php /** * 模板名称:研究者归档 * 描述:展示研究者列表的自定义模板 */ get_header(); ?> <div id="primary" class="content-area"> <main id="main" class="site-main"> <section> <div class="container"> <h1>研究者</h1> <form method="GET" action="<?php echo get_post_type_archive_link("researcher"); ?>"> <?php $categories = get_terms([ "taxonomy" => "organization", "hide_empty" => false, ]); ?> <div> <input type="text" name="r_name" id="r_name" placeholder="搜索研究者姓名" value="<?php echo esc_attr(get_query_var("r_name", "")); ?>"> </div> <div> <select name="organization" id="organization"> <option value="">选择机构</option> <?php foreach ($categories as $category): ?> <option value="<?php echo esc_attr($category->slug); ?>" <?php echo selected(get_query_var("organization", ""), $category->slug, false); ?>> <?php echo esc_html($category->name); ?> </option> <?php endforeach; ?> </select> </div> <div> <button>搜索</button> <a href="<?php echo get_post_type_archive_link("researcher"); ?>">重置</a> </div> </form> <div class="row"> <?php while (have_posts()): the_post(); ?> <div class="col-12 col-lg-4 d-flex"> <?php get_template_part('template/card', 'researcher'); ?> </div> <?php endwhile; ?> </div> <?php the_posts_pagination(); ?> </div> </section> </main> </div> <?php get_footer(); ?>
修复说明
- 标题搜索修复:通过
posts_search过滤直接针对post_title字段做模糊匹配,确保能正确检索文章标题。 - Query Var修复:把错误的
.=改成=,确保查询变量正确注册。 - 分类筛选修复:统一用
slug作为匹配字段,同时使用WordPress内置的selected()函数处理下拉框选中状态,逻辑更可靠。 - 安全优化:添加
esc_attr()和esc_html()转义输出,避免XSS风险。
内容的提问来源于stack exchange,提问作者JimboNeutronbo
相关产品推荐
相关产品推荐

