按年分类存档,支持永久链接/分类/YYYY

时间:2011-10-18 作者:Scott

我目前正在考虑在WordPress中创建一种新类型的网站存档,允许用户按类别和年份进行筛选,而不是按默认类别或年份进行筛选。

我希望构建一个边栏小部件来创建界面,但我正在寻找关于创建自定义permalink设置的想法和建议。理想情况下,归档文件将与URL一起工作,包括:

/类别/年份/

/1类/年/

我并没有要求过滤深度超过一年。我发现this snippet of code 但它并没有像预期的那样工作。

谢谢

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

根据@StephenHarris的建议,我进一步开发了代码,并得出以下结论:

add_action(\'generate_rewrite_rules\', \'my_rewrite_rules\');
function my_rewrite_rules( $wp_rewrite ) {

    // handles paged/pagination requests
    $new_rules = array(\'news/(.+)/year/(.+)/page/?([2-9][0-9]*)\' => \'?category_name=\'.$wp_rewrite->preg_index(1).\'&year=\'.$wp_rewrite->preg_index(2).\'&paged=\'.$wp_rewrite->preg_index(3));

    // handles standard requests
    $new_rules1 = array(\'news/(.+)/year/(.+)\' => \'?category_name=\'.$wp_rewrite->preg_index(1).\'&year=\'.$wp_rewrite->preg_index(2));

    // Add the new rewrite rule into the top of the global rules array
    $wp_rewrite->rules = $new_rules + $new_rules1 + $wp_rewrite->rules;
}
这允许站点支持如下URL:

/新闻/我的类别/年份/2011/第页/2

以及

/新闻/我的类别/年份/2011

我的网站的帖子/博客部分以“news”作为前缀,因此您可能希望调整正则表达式的第一部分并删除“news”一词。

如果要使用它,请确保通过访问永久链接设置页面刷新重写规则。

SO网友:chrisguitarguy

你要找的是endpoint. 其中已经有几个内置的:/feed/some-feed/ 对于提要或/trackback/ 在立柱上。这两个都是端点。

幸运的是,WordPress提供了一个方便的功能,可以很容易地添加自己的endpionts。add_rewrite_endpoint

以下是使您的年度类别档案工作所需的全部代码:

<?php
add_action( \'init\', \'wpse31422_init\' );
function wpse31422_init()
{
    add_rewrite_endpoint( \'year\', EP_CATEGORIES );
}
作为插件:https://gist.github.com/1296860

它的工作原理与斯蒂芬·哈里斯的答案一模一样,你可以通过访问yoursite.com/category/some-cat-slug/year/2011/.

添加端点将创建与add_rewrite_endpoint 作用在这种情况下,year. 因为这个查询var已经存在于WP中(用于处理基于数据的归档),所以我们实际上不需要在这里做任何特殊的事情。

SO网友:Stephen Harris

这没有经过测试,但请尝试(添加代码后,需要转到“设置”>“永久链接”,然后单击“保存”以使其生效):

add_action(\'generate_rewrite_rules\', \'my_rewrite_rules\');
function my_rewrite_rules( $wp_rewrite ) {
  $new_rules = array(
     \'(.+)/year/(.+)\' => \'?category_name=\'.$wp_rewrite->preg_index(1).\'&year=\'.$wp_rewrite->preg_index(2),
       );

  // Add the new rewrite rule into the top of the global rules array
  $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
这需要:http://yourwebsite.com/foobar/year/2011 并在2011年返回foobar类别的结果。

我不确定结构是最好的方式。为了避免不必要的问题,我建议使用:http://yourwebsite.com/category/foobar/year/2011 并改用:

\'category/(.+)/year/(.+)\' => \'?category_name=\'.$wp_rewrite->preg_index(1).\'&year=\'.$wp_rewrite->preg_index(2)
希望这有帮助!

SO网友:vlatkorun

我通过使用斯蒂芬·哈里斯(StephenHarris)和斯科特(Scott)的解决方案并稍加修改,成功地实现了这一目标:

function add_events_by_year_rewrite_rules($wp_rewrite){
    // handles paged/pagination requests
    $new_rules_with_pagination = array(\'c/(.+)/year/(.+)/page/?([2-9][0-9]*)\' => \'index.php?category_name=\'.$wp_rewrite->preg_index(1).\'&year=\'.$wp_rewrite->preg_index(2).\'&paged=\'.$wp_rewrite->preg_index(3));

    // handles standard requests
    $new_rules_without_pagination = array(\'c/(.+)/year/(.+)\' => \'index.php?category_name=\'.$wp_rewrite->preg_index(1).\'&year=\'.$wp_rewrite->preg_index(2));

    // Add the new rewrite rule into the top of the global rules array
    $wp_rewrite->rules = $new_rules_with_pagination + $new_rules_without_pagination + $wp_rewrite->rules;

    return $wp_rewrite->rules;
}

add_filter(\'generate_rewrite_rules\', \'add_events_by_year_rewrite_rules\');
请注意index.php 在重写规则定义中添加。

结束