主题里的搜索页:结果为空、关键词高亮和那个总也搜不到的问题
搜索页看着简单,出问题的地方特别多。 基本结构。 search.php 里,$zbp->search 拿当前搜索词,$zbp->GetArticleList 那个搜索,或者更常见的是直接遍历 $articles。参数里的 'search
搜索页看着简单,出问题的地方特别多。
基本结构。
search.php 里,$zbp->search 拿当前搜索词,$zbp->GetArticleList 那个搜索,或者更常见的是直接遍历 $articles。参数里的 'search' 是关键,不传这个参数就变成拉全部文章了。
关键词为空的时候要单独处理。用户直接访问 search.php 不带参数,$q 是空字符串,这时搜索会返回全站文章——看着像「搜索功能坏了,什么都搜得到」。
正确做法是空词时显示提示,不查库。
高亮。
结果里把命中的词标红,是最基本的体验。
实现是用 str_replace 把关键词包成 <mark>。但这行代码有三个前提:
一,关键词要做 HTML 转义,不然用户搜 <script> 就注入了。
二,替换要在内容截断之后做。先截断再替换,否则可能把标签切断。
三,str_replace 大小写敏感,中文没事,英文搜索会有「SEO 搜不到 seo」的问题。得用 str_ireplace。
这第三条我踩过。搜小写的词,标题里大写的命中不了,用户直接说搜索不准。
搜不到,几种原因。
第一种最常见:搜的是正文里的词,但 GetArticleList 的 search 参数只查标题和摘要,不查正文。得改成查 Content 字段,或者接受这个限制并在页面上写清楚「仅搜索标题与摘要」。
第二种:伪静态开了,但 search 的规则没配。search.html?q=xxx 请求根本没到 PHP,nginx 直接 404 了。这时 search.php 本身是好的,坏的是入口。
第三种:状态过滤。草稿、私密文章不参与搜索,这是对的,但作者自己搜不到自己刚写的草稿,会以为坏了。
分页。
搜索结果的分页,URL 里要保留关键词。search.html?q=xxx&page=2,少拼那一段,点第二页就变成搜空词了。
用框架的 PageBar 生成时,它会自动带上当前 query string,所以通常不用手动管。但如果你自己拼链接,一定得带上。
无结果页。
别只写「没有找到」。给三个动作:换个词试试、看看热门标签、回首页。用户搜不到是最容易流失的时刻。
你站上的搜索,是只搜标题摘要,还是也搜正文?