如何为多个深度而不是一个特定深度重写自定义POST类型URL

时间:2012-12-07 作者:jochem

我得到了这段代码,可以重写自定义PostType的url。它只适用于第五部分的标题深度。如何调整它以使其接受多个深度?

e、 g.:

http://www.mydomain.com/post_type/category1/postname/
http://www.mydomain.com/post_type/category1/child1/postname/
http://www.mydomain.com/post_type/category1/child1/child2/postname/
http://www.mydomain.com/post_type/category1/child1/child2/child3/postname/
我尝试添加:

$newRules[\'product/(.+)/(.+)/(.+)/?$\'] = \'index.php?products=$matches[3]\';
但这不起作用,因为在上面的示例结构中浏览child3深度时,它会出现404错误。

当前代码:

function mmp_rewrite_rules($rules) {
$newRules  = array();
$newRules[\'product/(.+)/(.+)/(.+)/(.+)/?$\'] = \'index.php?products=$matches[4]\';
// The above structure only works if the postname is the 5th uri segment
// e.g. http://www.mydomain.com/post_type/category1/child1/child2/child3/postname/
$newRules[\'product/(.+)/?$\']                = \'index.php?pcategory=$matches[1]\'; 

return array_merge($newRules, $rules);
}
[更新1]

如果我将代码更改为if\'s和elseif\'s With,它也不会起作用elseif 只添加了最重要的规则,因此我只能浏览posttitle是url中第5段的产品。具有if 添加了所有规则,但我无法浏览深度为2,3和4的类别,但您可以在url位于3,4和5段的深度浏览产品

function mmp_rewrite_rules($rules) {
$newRules  = array();
if (\'index.php?products=$matches[4]\'){
$newRules[\'product/(.+)/(.+)/(.+)/(.+)/?$\'] = \'index.php?products=$matches[4]\';
} 
elseif (\'index.php?products=$matches[3]\'){
$newRules[\'product/(.+)/(.+)/(.+)/?$\'] = \'index.php?products=$matches[3]\';
}
elseif (\'index.php?products=$matches[2]\'){
$newRules[\'product/(.+)/(.+)/?$\'] = \'index.php?products=$matches[2]\';
}
// The above structure only works of the postname is the 5th uri segment
$newRules[\'product/(.+)/?$\']                = \'index.php?pcategory=$matches[1]\'; 

return array_merge($newRules, $rules);
}

2 个回复
最合适的回答,由SO网友:jochem 整理而成

在测试了无数不同的结构后,我想出了这个。这是手动指定每个类别的工作,但给了我更多的控制。

如果有人提出更好的解决方案,请告诉我。

function mmp_rewrite_rules($rules) {

//Product structure
$newRules[\'product/(.+)/(.+)/(.+)/(.+)/?$\'] = \'index.php?products=$matches[4]\';
//The above structure only works of the postname is the 5th uri segment

//It\'s more flexible to confugure the depths for each category below
$newRules[\'product/televisies/(.+)/(.+)/(.+)/?$\'] = \'index.php?products=$matches[3]\';
$newRules[\'product/sports/(.+)/?$\'] = \'index.php?products=$matches[1]\';

//Category rule
$newRules[\'product/(.+)/?$\']                = \'index.php?pcategory=$matches[1]\'; 

return array_merge($newRules, $rules);
}

SO网友:David Kemp

您的正则表达式有问题:

product/(.+)/(.+)/(.+)/(.+)/?$
The.+ part表示要尽可能多地匹配任何内容。任何东西都可以包括/\'.

如果你用了

product/([^/]+/)+([^/]+)/?$
对此,我们有:

  • product/ 哪个匹配product/
  • ([^/]+/)+? - 尽可能少的匹配,但至少1个,slug/ 元素(The[^/] part表示匹配任何不是/ )
  • ([^/]+)/?$slug, 可能后面跟着/, 在该行的末尾(这是$ 手段
然后,帖子类型将以$匹配为单位[2]

结束

相关推荐

widgetlogic and permalinks

我试图使用widgetlogic在某些页面上有条件地显示菜单。每个菜单都使用如下标记is_page(array(\"Page Name\", \"Page Name 2\" ...)), 在我尝试更改permalinks之前,它一直工作得很好(因此所有菜单都会从各自的页面中消失)。我做错什么了吗?是否有解决方法?