»

“知更鸟”WordPress主题在搜索结果URL伪静态设置时出现的问题

    WordPress网站建设  
腾讯云加速重定向伪静态七牛建站访客CDNHTTP标头网络安全web.config又拍云CDNWp Super CacheWordPress插件IIShtaccess缓存网站优化cookies前端百度云加速wordpress插件工作CDN的问题windows主机

在 WordPress 主题中,一般使用主题自带的搜索时,搜索结果都会出现  ?s= 这样的动态参数,例如 http://www.baidu.com/?s=keyword 。如果我们做网站静态存储或者其他网址都做了伪静态设置,唯有这个搜索后的网址有个问号,是不是很不爽?不仅不利于SEO、不利于静态存储,也对完美主义者构成了挑战。

所以一定要纠正这个不是问题的问题呀!

张戈在他的博客中就给出了这样的答案,代码如下:

  1. //默认搜索伪静态  
  2. function wp_search_url_rewrite() {  
  3.     if ( is_search() && ! empty( $_GET['s'] ) ) {  
  4.         wp_redirect( home_url( "/search/" ) . urlencode( get_query_var( 's' ) ) . "/");  
  5.         exit();  
  6.     }  
  7. }  
  8. add_action( 'template_redirect', 'wp_search_url_rewrite' );  

 

将上述代码放入自己主题的functions.php 文件中即可。

但是,知更鸟主题有个问题:调用这个函数后,英文可以搜索,但是中文就完蛋鸟~~~出现如下图的情况:

search-1

 

明明“工签”这个词,搜到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 传递了什么值呢?且看下图:

search-2

 

中间的空格由 %20 的 URL编码 变成了 %2B 。这个 %2B 是  + 号,而不是空格。而这个 加号堂而皇之跑到了搜索结果的URL地址中,变成了“。。。。/search/work+permit/”!

 

如果搜索“工签”一词,显示如下对比结果:

search-3

 

在往 functions.php 里添加函数后,工签 一词被两次编码。

 

这样的结果正是  urlencode( get_query_var( 's' ) ) 这个函数语句导致的。而且编码结果传递给了 search.php  里的变量 $query_string 。也就是说,中文查询字符串被两次编码,而英文查询的词组中间的空格变成了加号,导致最终将数值错误传递了 $query_string。

 

所以,我们应该先着手把这个加号改回正常的空格的编码形式,将最初的伪静态函数改成如下形式:

  1. //默认搜索伪静态  
  2. function wp_search_url_rewrite() {  
  3.     if ( is_search() && ! empty( $_GET['s'] ) ) {  
  4.         $back_to_space = str_replace( '+', '%20', urlencode( get_query_var( 's' ) )  );  
  5.         wp_redirect( home_url( "/search/" ) . $back_to_space . "/");  
  6.         exit();  
  7.     }  
  8. }  
  9. 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  变量回归正常状态。

 

通过以上代码的设置,最终问题就解决了。

也许有更好的办法解决这个问题,本人能力有限,希望高手指点。

时光在路上扫码阅读、分享
  • 版权声明:该文章由 时光在路上 发表,共 2007字。除非特别标注来源,否则为原创。详见《版权声明》部分。
  • 转载请注明:文章标题和文章链接 - 时光在路上 - 也可直接“复制本文链接” 或 使用右边二维码分享本文 →