使用QueryString重写Wordpress URL

时间:2017-11-07 11:19:08

标签: php wordpress .htaccess

我只是开始使用WordPress体验。我有一个网站使用开箱即用的WordPress搜索,以及我理解的默认行为,按惯例从请求中选择查询字符串s以执行实际搜索。

这意味着搜索后的网址看起来像domain/?s=whatever,就搜索而言,此工作正常。

但是,我希望搜索页面包含自己的网址,更像是domain/search?s=whatever

我尝试使用网址重写来尝试实现上述目标,并尝试了几种不同的htaccess配置,但似乎无法让它发挥作用。

RewriteEngine On
RewriteBase /base_whatever
RewriteCond %{QUERY_STRING} ^s=(.*)$
RewriteRule search ?? [NC,L]

以上配置是基准,我为??尝试的替代方案包括以下内容:

  • / base_whatever
  • / base_whatever?S =%1

我确信上面的大部分内容对于那些有Apache等经验的人来说似乎很有趣,但是你有它。我尝试了无数不同的更尴尬的变化,但在我的情况下,所有这些变量都会产生404响应。

由于实际搜索脚本(我的search.php文件)位于我的WordPress主题文件夹中,因此我将test.php文件放在同一位置,果然,我可以将请求重定向到一个很好:

  • RewriteRule search /base_whatever/wp-content/themes/foo/test.php - >成功

所以,我也尝试了search.php的完整路径,但这使得WordPress barf:

  • RewriteRule search /base_whatever/wp-content/themes/foo/search.php - >失败

似乎WordPress无法执行"内容包含内容"这样的上下文(功能不可用)。

顺便说一句,htaccess文件的其余部分是标准的WordPress / PHP内容,我想,如:

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /base_whatever/index.php [L]

希望有一种简单的方法来完成这项基本任务,但是你可以告诉我在实现它时遇到了一些问题。我检查了几个关于这个主题的博客,例如this one,这似乎是合理的,但仍然无法让它发挥作用,所以你们这些人和女孩能帮助我吗?

1 个答案:

答案 0 :(得分:0)

因为WordPress所做的大部分工作主要是从存储在数据库中的内容创建虚拟页面(即服务器上没有物理文件/页面,它会在内部处理大量的重定向内容。

因此,在htaccess中设置重写规则可能是一个真正令人头疼的情况。幸运的是,WP API有许多用于重写的钩子。在你的情况下,你需要使用''钩子。以下内容适合您,但相当简单,因此定制它应该不是问题。

选项1:

add_action( 'template_redirect', 'so47156599' ) );

function so47156599() {

    if ( is_search() and false === strpos( $_SERVER['REQUEST_URI'], '/search/' ) ) {
        wp_redirect( get_bloginfo( 'home' ) . '/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) );
        exit();
    }

}

选项2:

或者,您可以查看API options

选项3:

基于.htaccess的选择可能是:

# search redirection
RewriteCond %{QUERY_STRING} \\?s=([^&]+) [NC]
RewriteRule ^$ /search/%1/? [NC,R,L]

这应该包含查询字符串中的任何内容,减去任何无关的值,并将它们转换为干净的工作URL。您可能需要将其置于默认WordPress重写规则的上方(或下方),以使其正常工作。 (我现在无法测试它。)