多对多的分类或重写规则?

时间:2012-08-09 作者:chifliiiii

我正在为文章目录开发一个主题,我想以某种方式将分类法链接到分类法。我有一个自定义的帖子类型,叫做“company“含2个税种

Taxonomy #1 is category with terms(shops,workshops,churchs,shoppings,etc)

Taxonomy #2 is location with terms(New York, New jersey,Miami, etc)
使用分类法#1,我可以

local.dev/category/shops/ to list all shops
使用分类法#2,我可以

local.dev/location/miami/ to list all companies in miami
目前我的工作this answer 属于MikeSchinkel 以下是:

 local.dev/shops/
我也可以像这样使用它来检索我想要的结果:

local.dev/shops/?location=miami
但我想这样做

local.dev/shops/miami or 
local.dev/shops/new-york to list shops in different locations 
使所有URL看起来更好。这可能吗?My terms will be all unique 所以我确信它们不会与POST标签或SLUG或任何东西发生冲突

也许最好的办法是创建一个重写规则,对吗?请告诉我这件事,我有点迷路了。

3 个回复
最合适的回答,由SO网友:Matthew Boynes 整理而成

当然,如果有保留,您可以使用此代码执行任何操作:

add_action(\'init\', \'wpse_61376_rewrites\');
function wpse_61376_rewrites() {
    add_rewrite_rule(\'^([^/]*)/([^/]*)/?$\',\'index.php?category=$matches[1]&location=$matches[2]\',\'top\');
}
然后转到设置(&R);在wp admin中永久链接,然后单击“保存更改”刷新您的重写并激活此规则。

保留

没有前缀的问题是any 具有两个“部分”(site.com/section-1/section-2/)的永久链接将被此永久链接捕获,并且您有时会以不良行为结束。例如,一个有两个页面的条目,site。com/about/2或页面、站点的评论提要。com/page/feed/。长话短说,这是不明智的。

建议的解决方案

如果是我,我会添加一个静态底座以确保安全。您说过这是一个目录,所以这似乎是一个很好的基础:

add_action(\'init\', \'wpse_61376_rewrites\');
function wpse_61376_rewrites() {
    add_rewrite_rule(\'^directory/([^/]*)/([^/]*)/?$\',\'index.php?category=$matches[1]&location=$matches[2]\',\'top\');
}
您的URL将是,site。com/directory/shops/miami/,既直观又安全。

SO网友:eddiemoya

由于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,但它是什么并不重要,只要它是唯一的字符串。

SO网友:kaiser

基础知识只需使用get_terms() 结合get_site_url().

多站点要添加MU支持,只需在get_current_blog_id() 检索当前博客的ID。这将为您提供$blog_id, 它是单一站点设置中唯一的博客,因此也适用于非MU安装。

示例现在,让我们建立一个列表。

echo \'<ul>\';
foreach ( get_terms( "shops" ) ) as $shop )
{
    $site_url = get_site_url( get_current_blog_id() );
    echo "<li><a href=\'{$site_url}shops/{$shop->slug}\' title=\'{$shop->description}\'>{$shop->name}</a></li>";
}
echo \'</ul>\';
本例假设您只添加了站点url和分类术语slug。

http://example.com/shops/miami

结束

相关推荐