主题里的搜索页:结果为空、关键词高亮和那个总也搜不到的问题

· zblog · 阅读 12
摘要

搜索页看着简单,出问题的地方特别多。 基本结构。 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,所以通常不用手动管。但如果你自己拼链接,一定得带上。

无结果页。

别只写「没有找到」。给三个动作:换个词试试、看看热门标签、回首页。用户搜不到是最容易流失的时刻。

你站上的搜索,是只搜标题摘要,还是也搜正文?