Wordpress - URL字符串上的额外“漂亮”参数。 mod_rewrite的?

时间:2013-09-10 20:45:07

标签: wordpress mod-rewrite parameters get friendly-url

我目前正在开发一个具有不寻常分类标准的WordPress网站。为了解决某些问题,我需要在URL的末尾添加一个参数。我有这个工作,但我需要一些方法来使用mod_rewrite使参数漂亮。

这是我现在拥有的......

www.site.com /('director-name'或'project-name')/?path =('visual'或'production')

例如:www.site.com/joe-smith/?path=visual

我使用$ _GET来访问此变量以获取我的功能,并且它工作正常。问题是我想让URL读取...

www.site.com/joe-smith/visual OR www.site.com/art/production

我读过在WordPress中弄乱.htaccess并不是解决这个问题的最佳方法。

非常感谢帮助。 谢谢!

1 个答案:

答案 0 :(得分:1)

由于您使用的是Wordpress,因此无需对.htaccess或mod_rewrite执行任何操作。 Wordpress有一个用于处理重写规则的内置系统。您还可以在功能中设置URL参数。函数是add_rewrite_rule(),并且codex中的示例非常好。不过,我可以引导你完成它,所以你可以确切地看到发生了什么。

从示例中获取以下重写规则:

add_rewrite_rule('^nutrition/([^/]*)/([^/]*)/?','index.php?page_id=12&food=$matches[1]&variety=$matches[2]','top');

首先,让我们回顾一下函数参数。第一个参数是您重写的regex。如果此正则表达式在当前URL上找到匹配项,则重写将启动。任何URL参数都将加载到$matches数组中,以便稍后在函数的第二个参数中使用。

第二个参数是将被重写的实际URL。请注意,此处使用的是page_id,而不是页面slug。重要的是,您使用此参数的页面ID而不是slug,因为slug本身是重写。后面的参数是您传递给处理程序的查询字符串的值。

如您所知,Wordpress中的所有页面都通过index.php文件进行路由。如果您熟悉MVC,这非常类似于前端控制器。因此,所有重写应该在开头包含index.php文件。这反映在此函数的第二个参数中。您可以使用其他文件进行自定义重写,但为了简单起见,我们假设您使用的是标准的Wordpress index.php文件。

最后一个参数是队列中应该放置重写的位置。您可以使用“顶部”或“底部”。在Wordpress重写之前加载顶部,然后底部加载。

使用此功能,Wordpress将在运行中为您的htaccess添加行,并根据当前页面更新它们。这绝对是在Wordpress中重写的最佳方式!希望这有帮助!

基于评论的更新

您可以将此代码放在functions.php文件中。您应该将其包装在函数中并将其挂钩到在重写规则之前触发的操作。以下示例符合您的确切问题:

add_action('init', 'my_custom_rewrite_function');
function my_custom_rewrite_function() {
    $director_category_id = 5; // Change to correct id
    $project_category_id = 6; // Change to correct id
    $handler_page_id = 25 // The page ID for the handler

    add_rewrite_rule('^director/([^/]*)/([^/]*)/?','index.php?page_id=$handler_page_id&category=$director_category_id&name=$matches[1]&path=$matches[2]','top');
    add_rewrite_rule('^project/([^/]*)/([^/]*)/?','index.php?page_id=$handler_page_id&category=$project_category_id&name=$matches[1]&path=$matches[2]','top');

    flush_rewrite_rules(); // This will make sure that the rewrite rules are added
}

然后,您可以通过为每个查询字符串参数执行get_query_var()来处理自定义模板中的查询。