由于WordPress 3.1,您可以通过URL中的多种分类法进行即时查询,而无需任何开发。这只适用于默认的查询字符串,并且需要添加自定义重写规则才能以非常持久的方式工作。
开箱即用
local.dev/company/?category=shops&location=new-york
这很好用,并且将抓住任何具有
shops
类别和
new-york
地方显然,您希望它能够与相当长的永久链接一起运行,因此我们需要创建一些自定义重写规则。
我们需要做的第一件事就是弄清楚这个多分类permalink结构需要什么样的模式。在你的问题中,你使用了/shop/new-york
. 这是可行的,但也有很多问题。
分类学基础all WordPress前端的URL被“重写”,并最终作为请求index.php
. 不是索引。php在您的主题中,而不是在核心应用程序中。诸如帖子段塞、类别名称、标记等,它们都会被发送,从而得到查询变量。重写规则是/foo/bar
进入index.php?foo=bar
或者需要构建的任何查询字符串。
因为您的示例没有“分类基础”,/shops
将与共享slug的任何post类型的任何post发生冲突。此外,由于我们根本不使用任何类别库,因此要让重写规则知道某个URL何时/<cat-term>/<location-term>
或者应该是/<cat-term>/<post-slug>
. 如果我们使用/category/shops/location/new-york
, 然后可以编写正则表达式来查找/category/<cat-term>/location/<location-term>
, 并且毫不含糊地这样做。
尽管你要求/<cat-term>/<location-term>
, 我将使用/category/<cat-term>/location/<location-term>
.
Post类型库与分类法库一样,我的示例假设您company
设置为“公司”自定义帖子类型的slug,这当然是可选的,您可以选择不使用。只需注意,如果该职位类型库不存在,那么查询将不会按职位类型公司进行筛选,生成的存档将显示符合分类标准的任何职位类型的任何职位。
“重写规则”(Rewrite Rules)
有几个选项可供选择,根据您的需要,这些选项具有不同程度的灵活性。我要创造两个极端,一个是一切都是僵硬的,另一个是完全灵活的。您必须注释掉其中一个,否则如果按原样运行,它们会相互覆盖。挑一个你最喜欢的,或者修改它们,让它们在在中间的某个地方相遇。
function multiple_taxonomy_rewrite_rules( $rules ){
/**
* This is very strict. Only allows category first,
* and location must be second.
*
* This is also an example of how to make this rule
* only work for the "company" post type.
* Notice the hard-coded "post_type=company" string
* at the end.
*
* This will only work with the following structure...
* * /company/category/<term>/location/<term>
*/
$newrules[\'company/category/(.+)/location/(.+)/?$\'] = \'index.php?=category=$matches[1]&location=$matches[2]&post_type=company\';
/**
* This is a very flexible version. Allowing for
* almost any permutation of the structure.
*
* This will work with...
* * /<any-post-type>/category/<term>/location/<term>
* * /<any-post-type>/location/<term>/category/<term>
* * /category/<term>/location/<term> (no post type base - meaning query doesnt filter by post type)
* * /location/<term>/category/<term> (no post type base - meaning query doesnt filter by post type)
*/
$newrules[\'(.+)?/?(category|location)/(.+)/(category|location)/(.+)/?$\'] = \'index.php?=post_type=$matches[1]&$matches[2]=$matches[3]&$matches[4]=$matches[5]\';
return $newrules + $rules;
}
add_action(\'rewrite_rules_array\', \'multiple_taxonomy_rewrite_rules\');
希望这会有所帮助。
编辑:
要澄清的是,有关分类法或post类型库的问题并不是严格的技术限制,而是警告。不太独特的图案在不同程度上是可以的,但越不独特,碰撞的可能性就越大。您只需了解任何特定模式的后果。
我在评论中解释说,也可以使用唯一的slug作为这个特定模式的前缀。你可以使用。。。
\'company/(.+)/(.+)/?$\' = \'index.php?category=$matches[1]&location=$matches[2]&post_type=company\';
请记住,在这个场景中,我只使用示例分类法,这样就可以很容易地用类别和区域或您喜欢的任何一对分类法替换它们。-此外,我使用的前缀是company,但它是什么并不重要,只要它是唯一的字符串。