Архивы даты для пользовательских типов сообщений

Я видел много вопросов / сообщений об этом, но еще не нашел достойного решения. В основном я пытаюсь сделать то, что делает 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 года, март 2014 года) и т. Д., И это замечательно, но щелчок по ссылкам идет только на 404. URL-адрес, созданный на каждой дате, равен / 2014/04 /, однако это должно быть что-то как / события / 2014/04 /.

Есть ли способ включить «события» в URL-адрес, чтобы можно было использовать шаблон archive-events.php, и есть ли причина, по которой ссылки в настоящее время генерируют 404?

Большое спасибо за любую помощь

В Интернете есть много примеров, похожих на ваш, но проблема в том, что, хотя wp_get_archive() создаст список пользовательских архивов типа post, ссылки по-прежнему указывают на тип сообщения по умолчанию. Это связано с тем, что WordPress не генерирует правила перезаписи для архивов настраиваемого типа сообщений, вам придется вручную их создать. Вот пример того, как создавать правила для годовых, ежемесячных и ежедневных архивов. Он также показывает, как конвертировать ссылки с фильтром get_archives_link . Не забудьте добавить 'has_archive' => true в register_post_type() и 'has_archive' => true правила перезаписи, посетив страницу settings->permalinks в admin.

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 );