【问题标题】:Date archives for custom post type自定义帖子类型的日期存档
【发布时间】:2014-06-16 16:37:04
【问题描述】:

我已经看到很多关于此的问题/帖子,但还没有找到合适的解决方案。基本上我正在尝试做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 );
}

sidebar-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 是否有任何原因?

非常感谢您的帮助

【问题讨论】:

    标签: php wordpress custom-post-type


    【解决方案1】:

    网上有很多和你类似的例子,但问题是虽然wp_get_archive()会创建一个自定义帖子类型档案的列表,但链接仍然指向默认的帖子类型。这是因为 Wordpress 不会为自定义帖子类型的档案生成重写规则,您必须手动创建它们。以下是如何为年度、每月和每日归档生成规则的示例。它还展示了如何使用get_archives_link 过滤器转换链接。请务必将'has_archive' => true 添加到register_post_type() 参数数组,并通过访问管理员中的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 );
    

    【讨论】:

    • 这太棒了!我花了几个小时寻找这个解决方案。谢谢。
    • 很好的解决方案。试图让分类术语与日期存档一起使用,请告知。 @丹尼尔
    • 存在分页问题,​​例如/events/page/2/返回404?
    猜你喜欢
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 2017-11-21
    • 2021-02-09
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多