博客 / WordPress/ WordPress 实现只搜索文章标题的完整方法(更新)

WordPress 实现只搜索文章标题的完整方法(更新)

WordPress 实现只搜索文章标题的完整方法(更新)

WordPress 默认搜索的局限性

WordPress 默认的搜索功能会同时检索文章的标题、内容、标签等多个字段。这虽然覆盖面广,但有时会导致搜索结果不够精确,出现大量与关键词相关度不高的文章,影响用户体验。

解决方案:修改搜索逻辑

通过向主题的 functions.php 文件添加自定义代码,我们可以修改 WordPress 的搜索查询,将其限定为只匹配文章标题。这是最直接有效的方法。

核心代码实现

将以下代码添加到您当前使用主题的 functions.php 文件末尾:

/**
 * 修改 WordPress 搜索,使其仅搜索文章标题
 *
 * @param string   $search   SQL 查询中的搜索 WHERE 子句。
 * @param WP_Query $wp_query WP_Query 对象。
 * @return string 修改后的 WHERE 子句。
 */
function wp_search_by_title_only($search, $wp_query) {
    global $wpdb;

    // 如果搜索词为空,则跳过处理
    if (empty($search)) {
        return $search;
    }

    $query_vars = $wp_query->query_vars;
    // 判断是否为精确匹配,决定是否使用通配符
    $wildcard_prefix = empty($query_vars['exact']) ? '{5cc1b29162d549a8071384de182cc9fc6e6a0fd85e7907f22fd9e18cff4269c3}' : '';
    $search_terms = $query_vars['search_terms'];

    $title_search = '';
    $search_and = '';

    // 遍历所有搜索词,构建针对标题的 LIKE 查询
    foreach ((array) $search_terms as $term) {
        // 使用 $wpdb 方法安全地处理字符串,防止 SQL 注入
        $escaped_term = $wpdb->esc_like($term);
        $title_search .= $search_and . "($wpdb->posts.post_title LIKE '" . $wildcard_prefix . $escaped_term . $wildcard_prefix . "')";
        $search_and = ' AND ';
    }

    if (!empty($title_search)) {
        // 将构建好的标题搜索条件替换原搜索条件
        $search = " AND (" . $title_search . ") ";

        // 可选:为非登录用户过滤掉受密码保护的文章
        if (!is_user_logged_in()) {
            $search .= " AND ($wpdb->posts.post_password = '')";
        }
    }

    return $search;
}
// 添加过滤器,优先级设为 500 以确保在其他插件之后执行
add_filter('posts_search', 'wp_search_by_title_only', 500, 2);

代码说明与注意事项

  • 函数名:将原代码中的 __search_by_title_only 改为 wp_search_by_title_only,避免使用双下划线开头(在 PHP 中通常为魔术方法保留)。
  • 安全性:使用 $wpdb->esc_like() 替代已废弃的 like_escape() 函数,确保查询安全。
  • 逻辑清晰:优化了变量命名和代码结构,增加了详细的注释。
  • 生效方式:代码添加并保存后,立即生效。您网站的所有前端搜索都将只匹配文章标题。
  • 适用范围:此修改会影响网站的所有搜索表单(包括小工具和 get_search_form() 生成的表单)。

替代方案:使用搜索插件

如果您不习惯修改代码,或者希望有更灵活的配置选项(如同时搜索标题和特定自定义字段),可以考虑使用专业的搜索插件,例如:

  • Relevanssi
  • SearchWP
  • WP Extended Search

这些插件通常提供后台界面,让您可以轻松配置搜索权重和范围,功能更为强大。

总结

通过上述代码修改,您可以快速将 WordPress 的搜索功能精确到文章标题,从而提升搜索结果的相关性和用户体验。在实施前,建议先备份您的 functions.php 文件,或使用子主题进行操作,以确保安全。

发表评论

您的邮箱不会公开。必填项已用 * 标注。