子比主题使用PHP结巴分词实现模糊搜索(其它WordPress站也可借鉴)

WordPress站长的朋友们大概率都有过这样的困扰:明明站点里有相关内容,用户却因为关键词输入不精准、多字少字、语序不同等问题,搜不到想要的结果。而WordPress是没有模糊搜索的,主题的搜索逻辑也不一定自带。模糊搜索的本质就是将搜索内容的词进行分词处理,用每个词去搜索,最后拼在一起。但目前即便有模糊插件可以实现,那它可能也不支持中文分词,不过我们可以借用PHP中文结巴分词开源项目实现这一点。

以上是项目介绍,及使用,你可以看看

结巴分词库部署(适用于所有wordpress站)

下面是子比主题接入结巴分词搜素的简单教程

下载地址:https://github.com/fukuball/jieba-php/releases

你将得到一个压缩包,将压缩包中的src文件夹复制

图片[1]-子比主题使用PHP结巴分词实现模糊搜索(其它WordPress站也可借鉴)-王先生笔记

将其src文件夹放在/wp-content/文件夹下,重命名为jieba

图片[2]-子比主题使用PHP结巴分词实现模糊搜索(其它WordPress站也可借鉴)-王先生笔记

打开主题目录,在主题function.php添加以下代码(子比主题请直接在主题目录下创建func.php文件首行为<?php)

图片[3]-子比主题使用PHP结巴分词实现模糊搜索(其它WordPress站也可借鉴)-王先生笔记

以上会创建一个分词函数,方便调用,避免再造轮子。当然除了搜索可以用,还可以应用到敏感词拦截,避免误拦截。

为wordpress创建分词逻辑

搜索时会触发功能,会将搜索内容转为:分词内容之间加空格(实现多关键词),搜索内容超过7字不分词处理(避免多次查询),增加分词开关功能按钮

依旧添加在function.php

图片[4]-子比主题使用PHP结巴分词实现模糊搜索(其它WordPress站也可借鉴)-王先生笔记

子比主题适配PHP结巴分词

下面就开始涉及修改子比主题函数了

为子比主题插入分词搜索按钮开关及修改搜索结果

上面已经创建了分词开关按钮函数,将分词按钮函数wxs_get_segmentation_switch_link()插入搜索页面指定位置即可,同时重构子比主题的搜索结果和搜索提示,我只演示子比主题怎么做

使用remove_filter将原本的主题钩子卸载,修改钩子名并重新挂载修改后的函数,实现替换的效果

图片[5]-子比主题使用PHP结巴分词实现模糊搜索(其它WordPress站也可借鉴)-王先生笔记

给按钮加个CSS样式吧(这个不能直接放在function.php,我就放在主题自定义里吧)

图片[6]-子比主题使用PHP结巴分词实现模糊搜索(其它WordPress站也可借鉴)-王先生笔记
/*分词按钮*/
.segmentation-switch {
    display: inline-block;
    margin: 10px 0;
    padding: 4px 8px;
    color: #0073aa;
    text-decoration: none;
    border: 1px solid #0073aa;
    border-radius: 4px;
    font-size: 14px;
}

.segmentation-switch:hover {
    background-color: #0073aa;
    color: white;
    text-decoration: none;
}

分词开关按钮实际效果为:

图片[7]-子比主题使用PHP结巴分词实现模糊搜索(其它WordPress站也可借鉴)-王先生笔记

重构子比主题搜索逻辑(核心修改)

重构子比主题的搜索逻辑,但请注意,我移除了筛选功能,所以会出现非文章搜索不到的问题

图片[8]-子比主题使用PHP结巴分词实现模糊搜索(其它WordPress站也可借鉴)-王先生笔记

效果为:

图片[9]-子比主题使用PHP结巴分词实现模糊搜索(其它WordPress站也可借鉴)-王先生笔记

以空格作为分割多关键词搜索核心逻辑(供其它非子比主题的wordpress参考)

核心搜索逻辑:

//WordPress 多关键词搜索改为OR匹配(空格分隔)
//作用:搜索词含空格(≥2个关键词)时,匹配任一关键词即可返回结果
function custom_multi_keyword_search_or_logic($query) {
    // 仅作用于前台主搜索查询(排除后台/非主查询)
    if ($query->is_search() && $query->is_main_query() && !$query->is_admin) {
        $search_term = $query->get('s'); // 获取当前搜索关键词
        
        // 检查是否是多关键词(含空格,且拆分后≥2个非空关键词)
        if (!empty($search_term) && strpos($search_term, ' ') !== false) {
            $keywords = array_filter(explode(' ', $search_term)); // 拆分空格并过滤空值(如连续空格)
            if (count($keywords) >= 2) {
                // 高优先级添加posts_search过滤器(覆盖主题/原生逻辑)
                add_filter('posts_search', function($search_sql, $wp_query) use ($keywords) {
                    global $wpdb;
                    // 仅作用于当前主搜索查询,避免影响其他查询
                    if (!$wp_query->is_main_query() || !$wp_query->is_search()) {
                        return $search_sql;
                    }
                    
                    // 构建每个关键词的匹配条件(标题/内容含该关键词)
                    $conditions = [];
                    foreach ($keywords as $keyword) {
                        $escaped_keyword = $wpdb->esc_like($keyword); // 安全转义LIKE特殊字符(%/_)
                        // 单个关键词:标题包含 OR 内容包含
                        $conditions[] = "($wpdb->posts.post_title LIKE '%{$escaped_keyword}%' OR $wpdb->posts.post_content LIKE '%{$escaped_keyword}%')";
                    }
                    
                    // 组合所有关键词为OR关系(匹配任一关键词即可)
                    return ' AND (' . implode(' OR ', $conditions) . ')';
                }, 60, 2); // 优先级60(高于多数主题默认的过滤器,确保生效)
            }
        }
    }
}
// 挂载到pre_get_posts钩子(WordPress查询构建前触发)
add_filter('pre_get_posts', 'custom_multi_keyword_search_or_logic', 99);

让搜索成为内容的导航仪

通过适配PHP结巴分词的方案,我们仅用几行代码和简单部署,就解决了原生搜索的中文适配痛点,既让用户能模糊输入精准找到,也让辛苦创作的内容被更多人发现。

这套方案的核心价值在于低成本、高适配:无需购买商业搜索插件,也不用部署复杂的搜索引擎服务,仅靠PHP结巴分词和WordPress钩子机制,就能实现媲美专业搜索的体验。无论是子比主题用户,还是其他WordPress站长,都可以跟着本文步骤动手尝试,让站点搜索真正成为内容的导航仪。

评论后可接收该文章的更新邮箱通知
友情赞助

如果你喜欢我的内容,可以赞助我哦!你的一点点心意,是我不断前进的动力!

原文链接(非王先生笔记发布均为盗版):https://wxsnote.cn/6953.html

温馨提示: 本文最后更新于2025-12-07 21:47:43,某些文章具有时效性,若有错误或已失效,请在下方留言或加入QQ群: 399019539 联系群主反馈。注意一些链接无法访问可能是你网络的原因,如Github,并非资源地址失效。
© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
相关推荐
评论 共4条

请登录后发表评论

    请登录后查看评论内容

王先生笔记