情報を追記している場合はありますが、古い情報を訂正はしていませんので、公開年月日を参照してください。プラグイン・タグ、いずれもワードプレス・PHPのバージョン等によって動作しない場合もあります。
イベントを開催日で予約投稿とし、月ごとに年月を見出しとして投稿の一覧を表示。
<?php
global $wpdb;
$limit = 0;
$year_prev = null;
$months = $wpdb->get_results( "SELECT DISTINCT MONTH( post_date ) AS month , YEAR( post_date ) AS year, COUNT( id ) as post_count FROM $wpdb->posts WHERE post_status = 'future' and post_date >= now( ) and post_type = 'event' GROUP BY month , year ORDER BY post_date ASC" );
foreach( $months as $month ) :
$year_current = $month->year;
if ( $year_current != $year_prev ) {
if ( $year_prev != null ) { ?>
<?php } ?>
<?php } ?>
<?php $args = array(
'posts_per_page' => -1,
'post_type' => 'event',
'post_status' => 'future',
'year' => $month->year,
'monthnum' => $month->month,
'order' => ASC,
);
$the_query = new WP_Query( $args );
?><?php if ($the_query->have_posts()) : ?>
<h2><?php echo $month->year; ?> / <?php echo date('n', mktime(0, 0, 0, $month->month, 1, $month->year)) ?></h2>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<div>
<h3 class="title"><?php the_title(); ?></h3>
<?php the_excerpt(); ?>
<a href="<?php the_permalink(); ?>">詳細ははこちら</a>
</div>
<?php endwhile; endif; wp_reset_query(); ?>
<?php $year_prev = $year_current;
endforeach;
?>
年の見出しもいる場合は if ( $year_prev != null ) { ~ } の後に。
何ヶ月分表示するかの制限がいる場合は endforeach; の前に if( ++$limit >= 数字 ) { break; }
予約投稿の表示はプラグインなりfunctions なりで。