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

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(); ?>

修复说明

  1. 标题搜索修复:通过posts_search过滤直接针对post_title字段做模糊匹配,确保能正确检索文章标题。
  2. Query Var修复:把错误的.=改成=,确保查询变量正确注册。
  3. 分类筛选修复:统一用slug作为匹配字段,同时使用WordPress内置的selected()函数处理下拉框选中状态,逻辑更可靠。
  4. 安全优化:添加esc_attr()和esc_html()转义输出,避免XSS风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:32:32