自定义帖子类型的日期存档

时间:2014-04-30 11:18:24

标签: php wordpress custom-post-type

我已经看过很多关于这方面的问题/帖子,但尚未找到合适的解决方案。基本上我正在努力做wp_get_archives所做的事情,但对于自定义帖子类型(我个人不确定为什么wp_get_archives不支持自定义帖子类型!)。

我目前使用的代码如下

的functions.php

function Cpt_getarchives_where_filter( $where , $r ) {
  $post_type = 'events';
  return str_replace( "post_type = 'post'" , "post_type = '$post_type'" , $where );
}

边栏-events.php

add_filter( 'getarchives_where' , 'Cpt_getarchives_where_filter' , 10 , 2 );
wp_get_archives();
remove_filter('getarchives_where' , 'Cpt_getarchives_where_filter' , 10 );

此代码显示日期(例如2014年4月,2014年3月)等,这很棒,但点击链接只会转到404.在每个日期链接上创建的URL是/ 2014/04 /,但是它应该像/ events / 2014/04 /.

有没有办法包含'事件'在URL中,以便可以使用archive-events.php模板,是否有任何理由为什么链接当前生成404?

非常感谢您的帮助

1 个答案:

答案 0 :(得分:8)

互联网上有许多与您类似的示例,但问题是虽然wp_get_archive()将创建自定义帖子类型档案列表,但链接仍指向默认的帖子类型。这是因为Wordpress不会为自定义帖子类型的存档生成重写规则,您必须手动创建它们。以下是如何为年度,月度和日常归档生成规则的示例。它还显示了如何使用get_archives_link过滤器转换链接。请务必将'has_archive' => true添加到register_post_type()参数数组,并通过访问admin中的settings->permalinks页面来刷新重写规则。

<强>的functions.php

add_filter( 'getarchives_where', 'getarchives_where_filter', 10, 2 );
add_filter( 'generate_rewrite_rules', 'generate_events_rewrite_rules' );

function getarchives_where_filter( $where, $args ) {

    if ( isset($args['post_type']) ) {      
        $where = "WHERE post_type = '$args[post_type]' AND post_status = 'publish'";
    }

    return $where;
}

function generate_events_rewrite_rules( $wp_rewrite ) {

    $event_rules = array(
        'events/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$' => 'index.php?post_type=events&year=$matches[1]&monthnum=$matches[2]&day=$matches[3]',
        'events/([0-9]{4})/([0-9]{1,2})/?$' => 'index.php?post_type=events&year=$matches[1]&monthnum=$matches[2]',
        'events/([0-9]{4})/?$' => 'index.php?post_type=events&year=$matches[1]' 
    );

    $wp_rewrite->rules = $event_rules + $wp_rewrite->rules;
}

function get_archives_events_link( $link ) {

    return str_replace( get_site_url(), get_site_url() . '/events', $link );

};

sidebar.php示例

add_filter( 'get_archives_link', 'get_archives_events_link', 10, 2 );

wp_get_archives( array( 'post_type' => 'events' ) );            
wp_get_archives( array( 'post_type' => 'events', 'type' => 'yearly' ) );
wp_get_archives( array( 'post_type' => 'events', 'type' => 'monthly' ) );
wp_get_archives( array( 'post_type' => 'events', 'type' => 'daily' ) );

remove_filter( 'get_archives_link', 'get_archives_events_link', 10, 2 );