首先,重写处理可能会很快变得非常复杂,尤其是当您想要的结构与WordPress的默认行为冲突时。最好的建议可能是避免此类冲突,而不是试图解决它们。这是不可能的
WordPress从各种来源生成重写规则:从注册的帖子类型、插件手动添加的规则以及“标签”(默认/插件添加)。标签是%year%
, %author%
等,您可以在自定义permalink结构中使用。它还具有自动生成的重写规则:这些规则包括日期结构(请参见source). e、 g。
www.example.com/2012 => www.example.com?year=2012
www.example.com/2012/05 => www.example.com?year=2012&monthnum=05
这些规则比页面规则更具体,因为它们只适用于(在regex中)
([0-9]{4})
- 这是像2012年一样的4位数。(第二条规则仅适用于
([0-9]{4})/([0-9]{2})
e、 g.2012年5月。
有两种解决方案:
更改%year%
如上所述,更改%年%标签的日期重写规则%year%
标记需要一个4位数字,而相应的规则只有在满足此条件时才会出现。您可以更改此规则,使其仅匹配date/([0-9]{4})
- 也就是说,它匹配date/[four-digit-number]
. 为此:
add_action(\'init\',\'wpse56448_change_year_tag\');
function wpse56448_change_year_tag(){
add_rewrite_tag(\'%date%\',\'(date/[0-9]{4})\');
}
Warning: 这意味着
%year%
使用标记(例如在自定义永久链接结构中)-永久链接中的年份必须以
date/
. 值得注意的变化包括
www.example.com/2012/05
不再指向2012年5月的档案。相反,您必须使用:
www.example.com/date/2012/05
(与日期档案类似)。
因此,您可能更喜欢使用方法2。
更改日期重写规则生成日期重写规则时,会对其进行筛选(请参阅source) 使用date_rewrite_rules
过滤器。
更具体地说,是表单的数组regex=>query
已筛选。一个数组,其中键是正则表达式,值是如何将其解释为查询)。E、 g.:
Array
(
[([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]
[([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]
[([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&paged=$matches[4]
[([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]
[([0-9]{4})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]
[([0-9]{4})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]
[([0-9]{4})/([0-9]{1,2})/page/?([0-9]{1,})/?$] => index.php?year=$matches[1]&monthnum=$matches[2]&paged=$matches[3]
[([0-9]{4})/([0-9]{1,2})/?$] => index.php?year=$matches[1]&monthnum=$matches[2]
[([0-9]{4})/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&feed=$matches[2]
[([0-9]{4})/(feed|rdf|rss|rss2|atom)/?$] => index.php?year=$matches[1]&feed=$matches[2]
[([0-9]{4})/page/?([0-9]{1,})/?$] => index.php?year=$matches[1]&paged=$matches[2]
[([0-9]{4})/?$] => index.php?year=$matches[1]
)
这是导致问题的最后一条规则。因此,您可以删除它,然后添加替换(如果需要):
add_filter(\'date_rewrite_rules\',\'wpse56448_date_rewrite_rules\');
function wpse56448_date_rewrite_rules( $rules ){
//Remove year rewrite rule:
unset($rules[\'([0-9]{4})/?$\']);
//Replace it with something else
$rules[\'year/([0-9]{4})/?$\'] = \'index.php?year=$matches[1]\';
return $rules;
}
现在
www.example.com/2012
转到您的页面。和
www.example.com/year/2012
指向年份档案。而月份档案保持不变。e、 g.:
www.example.com/date/2012/05
仍然指向2012年5月的档案。
Warning: 很明显,如果您的2012页有一个名为“05”的子页,则会出现另一个冲突。如果使用“page”、“feed”、“atom”等,也会出现类似的问题(请参见上面的重写规则)。此方法要求您手动删除/替换每个需要更改的规则。这可能会很快变得一团糟,这就是为什么最好不要将其用作页面名称的原因。
总结First of all: any changes won\'t take effect until you flush the rewrite rules. Do this (only) by going to Settings > Permalinks and clicking save.
方法2可能更可取,因为方法1可能“做得太多”。然而,方法2有点“脏”——您正在“微调”数据永久结构,您可能会发现需要进一步调整它。
例如,使用方法2,如果您的2012页有一个子页05-它的永久链接将被解释为2012年5月的存档。然后,您需要修改月份归档的重写规则。深入到三个层次,通过一个名为“01”的页面,您将获得2012年5月1日的档案。在每一个级别上,如果有名为“页面”或“提要”之类的页面,您也会遇到问题。如前所述,最好尽量避免使用此类名称。