页面固定链接与日期冲突

时间:2012-06-25 作者:salocin

我需要访问一个名为2011的页面。麻烦的是,WP认为我正在阅读2011年我博客上的帖子。

目前唯一可行的方法是将我2011年页面的永久链接更改为mypage-2011。

我是否可以制作/强制WP使用2011作为2011页的永久链接,以便通过www.site查看。com/2011

thxs型

1 个回复
最合适的回答,由SO网友:Stephen Harris 整理而成

首先,重写处理可能会很快变得非常复杂,尤其是当您想要的结构与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日的档案。在每一个级别上,如果有名为“页面”或“提要”之类的页面,您也会遇到问题。如前所述,最好尽量避免使用此类名称。

结束

相关推荐

the_date() not working

我正在使用wordpress 3.2,我做了一个如下的查询帖子:<?php query_posts(\"posts_per_page=1post=type&page=post_parent=10\");?> 然后我试着重复我这样询问的这篇文章的日期。<?php echo the_date(); ?> 它给了我这篇文章的标题、摘录和永久链接,但没有日期。你认为问题是什么。我肯定这是件很尴尬的事。以下是我的视频页面模板文件中的代码: <?php