在 WordPress 主题中,一般使用主题自带的搜索时,搜索结果都会出现 ?s=
这样的动态参数,例如 http://www.baidu.com/?s=keyword 。如果我们做网站静态存储或者其他网址都做了伪静态设置,唯有这个搜索后的网址有个问号,是不是很不爽?不仅不利于SEO、不利于静态存储,也对完美主义者构成了挑战。
所以一定要纠正这个不是问题的问题呀!
张戈在他的博客中就给出了这样的答案,代码如下:
- //默认搜索伪静态
- function wp_search_url_rewrite() {
- if ( is_search() && ! empty( $_GET['s'] ) ) {
- wp_redirect( home_url( "/search/" ) . urlencode( get_query_var( 's' ) ) . "/");
- exit();
- }
- }
- add_action( 'template_redirect', 'wp_search_url_rewrite' );
将上述代码放入自己主题的functions.php 文件中即可。
但是,知更鸟主题有个问题:调用这个函数后,英文可以搜索,但是中文就完蛋鸟~~~出现如下图的情况:
明明“工签”这个词,搜到39篇相关文章,但是显示“没有您要找的文章!”。而且搜索页面出现了 %E5%B7%A5%E7%AD%BE
这种“乱码”(URL编码)。看着头疼。
打开主题根目录下的 search.php 文件,发现了这样一个语句:<?php $posts = query_posts($query_string . '&orderby=date&posts_per_page=20');?>
。
$query_string
是个什么东东?这个变量可以保留现有的查询参数,也就是你通过搜索表单提交的查询参数。如果你想保留原来的查询参数作为当前查询的一部分,然后添加或重写一些参数,你可以在 query_posts()
中使用该变量。
测试了一下,如果不使用的话,查询中文关键词的结果能正常显示了,但是查询结果的页面不能翻页鸟~~。所以还真的得保留这个参数。
当我提交查询关键词时候,到底给 $query_string 传递了什么值呢?且看下图:
中间的空格由 %20
的 URL编码 变成了 %2B
。这个 %2B 是 + 号,而不是空格。而这个 加号堂而皇之跑到了搜索结果的URL地址中,变成了“。。。。/search/work+permit/
”!
如果搜索“工签”一词,显示如下对比结果:
在往 functions.php 里添加函数后,工签 一词被两次编码。
这样的结果正是 urlencode( get_query_var( 's' ) ) 这个函数语句导致的。而且编码结果传递给了 search.php 里的变量 $query_string
。也就是说,中文查询字符串被两次编码,而英文查询的词组中间的空格变成了加号,导致最终将数值错误传递了 $query_string。
所以,我们应该先着手把这个加号改回正常的空格的编码形式,将最初的伪静态函数改成如下形式:
- //默认搜索伪静态
- function wp_search_url_rewrite() {
- if ( is_search() && ! empty( $_GET['s'] ) ) {
- $back_to_space = str_replace( '+', '%20', urlencode( get_query_var( 's' ) ) );
- wp_redirect( home_url( "/search/" ) . $back_to_space . "/");
- exit();
- }
- }
- add_action( 'template_redirect', 'wp_search_url_rewrite' );
用 %20
替换掉 +
。这样设置后,查询字符串就回归正常了。
回到 search.php
文件。
由于把网址进行伪静态设置,重写了URL地址,导致“提交了两次表单”,查询字符串被重复编码,数值传给了 $query_string
。
所以,应在 <?php $posts = query_posts($query_string . '&orderby=date&posts_per_page=20');?>
这段语句的上面添加如下语句进行纠正:
<?php $query_string = urldecode( $query_string ); ?>
,里面用了一次 urldecode()
函数进行解码,让 $query_string
变量回归正常状态。
通过以上代码的设置,最终问题就解决了。
也许有更好的办法解决这个问题,本人能力有限,希望高手指点。