搜百分号、下划线或者带单引号的内容,页面要么报数据库错误,要么干脆把全站文章都列出来,非常影响体验。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
global $wpdb; $like = '%' . $wpdb->esc_like($kw) . '%'; $sql = 'SELECT ID FROM wp_posts WHERE post_title LIKE %s'; $sql = $wpdb->prepare($sql, $like);
关键词直接拼进 LIKE 语句,通配符和引号没有转义,百分号被当成匹配任意字符,等于什么内容都能被搜出来了,结果完全不可控。这一点先确认清楚,后面就不用反复试。
「搜索词特殊字符」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
改完隔一天再看一次,当场正常不代表能稳住。
具体做法是,先用 esc_like 处理好百分号和下划线这一类的通配字符;SQL 语句统一走 prepare 传参,别再把关键词直接拼进字符串;输出到页面之前再转义一次,避免把标签带出来。
改完照着核一遍,特殊字符只当普通文本处理,不再报错也不再返回全量结果。
