我已经看过很多关于这方面的问题/帖子,但尚未找到合适的解决方案。基本上我正在努力做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?
非常感谢您的帮助
答案 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 );