【问题标题】:Wordpress - extra 'pretty' parameter on the URL string. Mod_rewrite?Wordpress - URL 字符串上的额外“漂亮”参数。 Mod_rewrite?
【发布时间】:2013-09-14 17:23:31
【问题描述】:

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

这是我目前拥有的...

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

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

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

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

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

我们将不胜感激。 谢谢!

【问题讨论】:

  • 为什么不直接使用带有自定义规则的内置Permalink 功能?
  • 那不提供正确的功能。

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


【解决方案1】:

您无需对 .htaccess 或 mod_rewrite 执行任何操作,因为您使用的是 Wordpress。 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,而不是 page 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() 在自定义模板中处理您的查询。

【讨论】:

  • 嗨,马修。将在早上尝试这第一件事。似乎它可能会起作用。这是否在functions.php文件中?鉴于我发布的示例,正​​确的功能是什么?我是一个正则表达式。
  • 是的,您可以将此代码放在您的functions.php 文件中。有关更多信息,请参阅我对答案的更新。
  • 嗨,马修。刚刚测试了你的建议。我昨晚发布的 URL 示例是错误的。如果您再看一遍,我已经编辑了帖子以反映正确的 URL 结构。此外,此问题不涉及页面 ID,因为您在技术上是在发布项目上。例如:www.site.com/joe-smith/?path=visual 是一个帖子
  • 在意识到我的问题的总负责人之后,我在这里创建了一个新问题:stackoverflow.com/questions/18759170/…
猜你喜欢
  • 2011-01-22
  • 2021-03-15
  • 1970-01-01
  • 2012-08-30
  • 2023-04-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 2011-03-09
相关资源
最近更新 更多