更改 WordPress 的搜索结果页面的URL地址
在 WordPress 中,设置可读性好 URL 地址结构非常简单。只有搜索页面尚未受到该设置的影响,它的默认语法是带有搜索参数 “s
“。但有一种方法可以随心所欲地更改搜索结果显示页面的url网址。
下面的示例显示,即设定了永久链接结构,wordpress 和 consulting 这两个搜索关键词的 URL 也是这样的:www.webhek.com/?s=wordpress+consulting&submit=Search
。通过一个与重定向的小修改,可以调整搜索结果页面的 URL。在我的例子中,使用以下函数后,带有两个搜索关键词的 URL 是这样的: www.webhek.com/search/wordpress+consulting。
在 WP 里的 wp_redirect 中,我进行了修改,即搜索词将被添加到 home url 中。调整 URL 的方式有很多。
function fb_change_search_url_rewrite() { if ( is_search() && !is_admin() && strpos( $_SERVER['REQUEST_URI'], "/{$search_base}/" ) === false ) { wp_redirect( home_url( "/{$search_base}/" . urlencode( get_query_var( 's' ) ) ) ); exit(); } } add_action( 'template_redirect', 'fb_change_search_url_rewrite' );
是的,也可以通过 htacces 规则来实现,但源代码是一个在重定向上自定义解决方案的示例。
# search redirect # this will take anything in the query string, minus any extraneous values, and turn them into a clean working url RewriteCond %{QUERY_STRING} \\?s=([^&]+) [NC] RewriteRule ^$ /search/%1/? [NC,R,L]
我建议将该功能放在插件或主题的 functions.php
中。还有其他更好的办法吗?请在评论区告诉我们。
阅读余下内容
简单而有效。谢谢
尝试了脚本,但失败了:
页面重定向不正确
Firefox 已检测到服务器正在以一种永远无法完成的方式重定向对该地址的请求。
有时禁用或拒绝接受 Cookie 也会导致这一问题。
删除此脚本后,本机搜索可完美运行。
为了防止新手破坏自己的 wordpress,你应该设置一个条件,观察是否用 .NET Framework 启用了永久链接:
if ( get_option(‘permalink_structure’) != ” ) {
// 这里的函数
// 这里的操作
}
我在 forrst 上转发了这个片段(注明了你的名字),有人提出了一个很好的观点:….你为什么不直接使用 htaccess 并发出一个 http 请求,而要用这个函数呢?
RewriteRule ^search/([^/]+)$ /search?s=$1 [NC]
查克:这是可行的,但关键是要在 URL 栏中向最终用户显示一个漂亮的 URL,除非使用 javascript 搜索表单,否则很难从表单机制中做到这一点。
不过,公平地说,.htaccess 是处理此类问题的好方法。这段代码可能更能满足人们的需求:
RewriteCond %{QUERY_STRING} s=(.*)
RewriteRule ^$ /search/%1?[R,L]
它将透明地将 ?s=foo 改为 /search/foo。如果您使用的是非默认的永久链接,WordPress 的 /search/ 规则应该可以让搜索正常进行。
另一种方法是在搜索表单中添加一个 onsubmit Javascript 处理程序,只需执行 location.href = ‘/search/’ .URIComponentEncode(this.value); 或类似操作。
该 .htaccess 规则看起来也不起作用,需要将 ?s=xx 重定向到 /search/$1。
斜线和撇号也会带来问题,我相信 get_query_var() 会返回斜线形式,这可能会在给出的重定向代码中剥离/断开……
首先,感谢您的反馈和讨论!很高兴看到大家阅读我们的文章并讨论解决方案!同时也要感谢那些优秀的读者,他们在 WordPress 中都享有很高的声誉。
是的,为了实现重写搜索网址的目标,使用 htaccess 方法也是可行的;但这个片段也是为了让大家了解 WordPress 中使用小源代码和核心功能的可能性;同时也是对一种新可能性的简短看法,也许是根据自己的要求定制功能的开始。
这个小例子的另一个好处是,您可以为源代码添加关键字,WordPress 默认为搜索关键字创建源代码;例如:上面例子中的关键字源代码是:bueltge.de/search/wordpress+consulting/feed/。
感谢您提供的酷代码段!到目前为止,我使用得很好。我想知道是否可以使用此功能重新格式化自定义帖子类型 url?
例如,我有一个网站,其中有一个自定义帖子类型 “歌曲”。因此网址是/?song=song_name
最好是这样:/song/song_name
我尝试使用 post_type_exists(‘song’),而不是 is_search(),但这导致了无休止的重定向循环,页面无法加载。
另一个问题是,这只能检查特定的帖子类型,而不能转换所有帖子类型的 url。
在这种情况下该怎么办?
谢谢你,弗兰克,很好的片段。
遗憾的是,像 “Hello world”(带双引号)这样的搜索短语已经不起作用了。
有什么建议吗?
@Nicholas:我认为,一种可能的方法是为您的 CPT 设置新的变量 $wp_rewrite;通过 var_dump()检查该变量,您就能找到您的 CPT。本帖搜索字符串的示例如下:
function fb_set_search_base() {
$GLOBALS[‘wp_rewrite’] -> search_base = ‘my_search’; // 设置新字符串
}
add_action( ‘init’, ‘fb_set_search_base’ );
@Peter: 我认为搜索短语在 WP 默认搜索中找不到结果,但也可以过滤这个,然后就可以了。
@Frank
示例字符串 “易于激活”(带双引号)。
这样就可以了:
https://wpengineer.com/?s=%22easy+to+activate%22
这样不行:
https://wpengineer.com/search/%22easy+to+activate%22
为什么?
@Frank
我用这个函数解决了问题:
函数 pcl_urldecode_s($query) {
if ( is_search() ){
$query->query_vars[‘s’] = urldecode( $query->query_vars[‘s’] );
}
返回 $query;
}
add_filter(‘parse_query’, ‘pcl_urldecode_s’);
我试试在 bueltge.de 上搜索 “humschdibums*”。
于是我看到了一个错误 404 => 合乎逻辑
我为什么要对错误 404 进行批量生产,并将它们连同漂亮的永久链接一起发送给谷歌?
robots.txt
禁止:/?s*
是搜索结果的最佳方式
@Peter: 该代码段在 WPEngineer 上未激活,只是一个关于此解决方案的帖子。
@Monika: 谢谢,不过你也可以在我的德国 GLOB 上发表评论。
我在 robots.txt 中加入了字符串
我知道,弗兰克、
我想用我的例子说明一下、
有 “漂亮的搜索结果永久链接 “的可能性是好的–但谁需要这个呢?
但谁需要这个呢?
对许多网站来说,向谷歌或雅虎发送搜索结果并不是最好的办法,一段时间后,谷歌索引中就会有成千上万个网站–但这些网站并不总是 “优质网站”=>”熊猫 “才是关键。
嗨,弗兰克
好文章。我最近研究了一下,发现您可以使用 WordPress 重写 API (/wp-includes/rewrite.php) 来实现类似的功能:
`
函数 custom_search_url( $search_rewrite ) {
if( !is_array( $search_rewrite ) ){ return $search_rewrite; }
$new_array = array();
foreach( $search_rewrite as $pattern => $s_query_string ) {
$new_array[ str_replace( ‘search/’, ‘my-search-url/’, $pattern ) ] = $s_query_string;
}
$search_rewrite = $new_array;
unset( $new_array );
返回 $search_rewrite;
}
add_filter(“search_rewrite_rules”, “custom_search_url”);
`
不过,这不会重定向”?s=”URL。它会自定义搜索 URL,这样,访问”/search/”的人就会被定向到”/my-search-url/”。
@Andrew:非常感谢;不使用 htaccess 想法的解决方案不错。感谢您的评论和解决方案。
@otto
我认为您需要在 htaccess 中加入以下内容
RewriteCond %{QUERY_STRING} s=(.+)&
RewriteRule ^$ /search/%1/?[R,L]
删除附加的”&submit=Search”,并添加最后的 /。
现在就能正常工作了!
感谢你们提供的好建议!
谢谢你的代码,它在我的博客上运行得很好。我喜欢你的网站。
Whats up very nice blog!! Man .. Beautiful ..
Wonderful .. I’ll bookmark your site and take the feeds also?
I am satisfied to search out a lot of helpful info right here in the submit, we
need work out extra strategies on this regard, thank you for
sharing. . . . . .