问题描述

我花了几天时间尝试学习如何最好地添加重写规则。到目前为止,我的理解是,添加简单规则的合适方法是使用 add_rewrite_rules(),非常感谢 Jan Fabry 在这个交换中谁的阐述是非常有用的。

虽然他提到 add_rewrite_tags(),但我还没有看到指南,它解释了什么时候有利于使用它,而不是添加重写规则的其他方法,或者其使用的任何好的例子。它似乎是一个更强大的工具,但这是我所有的可能。我发现食典中的例子也是 crypticincomplete 。有人可以详细阐述或指出一些资源吗?我在 Google 上发现没有用。

编辑:它的 Codex page 谈论’generally’ 使用它与 add_rewrite_rules(),但没有详细说明。类似地,add_rewrite_rules()Codex page 是指 add_rewrite_tags(),但是对信息也是非常稀疏的。何时以及如何使用这种组合?我发现的唯一的例子是 this answer by Rob Vermeer,我不明白。

最佳解决方案

根本区别是:

  • add_rewrite_rule()添加了一个解释的特定规则

  • add_rewrite_tag()添加了一个在 URL 结构中使用的占位符。然后,该占位符用于生成多个规则。

例如 – 假设你是在各个国家广告酒店的旅行社。你可能想要一个酒店的网址

  www.example.com/hotels/UK/Balmoral

在这个国家 (在这个例子中是英国) 是一个自定义的分类术语,而巴尔莫勒是一个酒店 (邮政类型) 。我们可以为此添加重写规则,但是我们必须生成一个规则:

  • 酒店自己

  • 酒店的附件

  • 适用于多个页面等的酒店 (帖子) 的规则

生成这些规则可能变得复杂。此外,我们可能会与 WordPress 自己的这个帖子类型的规则进行竞争 – 从我们在注册帖子类型时设置的 permastructure 生成。 (无论如何,让 WordPress 做的工作) 。

这个’permastructure’ – 类似于您在固定链接设置中设置的帖子 – 确定 WordPress 生成的重写规则。但是,由于我们想要一个包含一些未知 (国家) 的结构 – 我们需要解释 – 我们需要提供一个%country% 形式的占位符。 (几乎与%category% 相同) 。

例如:

add_action_init('init','wpse71305_register_types');

function wpse71305_register_types(){

     //You'll need to register the country taxonomy here too.

     //Add 'country' tag.
     add_rewrite_tag('%country%', '([^&/]+)'));

     //Register hotel post type with %country$ tag
    $args = array(
        ...
        'has_archive'=>true,
        'rewrite' => array(
            'slug'=>'hotels/%country%',
            'with_front'=> false,
            'feed'=> true,
            'pages'=> true
        )
        ...
    );
    register_post_type('hotel',$args);
}

注意:WordPress 不知道如何从%country% 标签生成 url – 您需要告诉它。 (我在下面链接的文章中介绍) 。

最后 WordPress 还将存储匹配的值,以便您可以通过 get_query_var()(不符合标准重写规则的东西) 来检索它。

您还可以创建要在帖子的永久性结构中使用的标签 (在固定链接设置页面中设置) 。

通过添加标签,我们可以在 permastructures 中使用它。 WordPress 然后知道

  • 期待什么

  • 如何解释 url(检查它匹配)

  • 如何解释该值 (即’UK’)

(作为参考看到这篇文章我写道:http://wp.tutsplus.com/tutorials/creative-coding/the-rewrite-api-the-basics/) 。

Edit

如上所述,上面的例子是比较差的,因为 register_taxonomy()其实是调用 add_rewrite_tag()

关于使用它们的食典文件’in combination’:这可能是误导的,因为它们都可以独立使用。但是,如上所述,add_rewrite_tag()将标签名称添加到 WordPress-understand ‘query variables’ 。实际上,您可以使用 get_query_var()检索该值。因此,当 add_rewrite_rule()add_rewrite_tag()一起使用时,该变量将由 WordPress 存储。但是还有其他的方法可以做到这一点 (参见 this answer – 还有 Rob Vermeer 的评论) 。

也相关:How to retrieve $_GET variables from rewritten URLs?

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。