WordPress 年別の月別記事一覧を表示する方法

Last update 
/ Posted by Takumi Hirashima

WordPress で年別の月別記事一覧を表示する方法を紹介します。
例えば、企業サイトで沿革やリリース情報などを表示したい時に便利な方法です。

  1. 年別の月別記事一覧を表示
  2. 年度別記事一覧を表示

年別の月別記事一覧を表示

年別の月別記事一覧を表示する方法を紹介します。
次のコードを archive.php に追加してください。

<?php // 投稿の取得
  foreach((get_post()) as $date) { // 最新記事の年を取得
    $postsYear = date('Y',get_post_time());
    break ;
  }
  $myPosts = get_posts( array(
  'post_type' => 'post', // 任意のポストタイプを指定
  'posts_per_page' => -1, // 最大投稿数の指定
    'date_query' => array(
      array(
        'year' => $postsYear,
      ),
    ),
  ));
  $monthlyPosts = array(); // 初期設定用の配列(月別の連想配列を入れる)
?>
<?php if( !empty( $myPosts )): // 投稿があれば表示 ?>
<?php 
  foreach( $myPosts as $post ): 
    setup_postdata( $post );
    $date = get_post_time('m月'); // この値が月の表示
    // 既に年月用の配列はあるので、該当する月の配列に入れていく
    $monthlyPosts[$date][get_the_ID()] = array(
      'time' => get_post_time('Y.m.d'), // 記事の時間
      'url' => esc_url( apply_filters('the_permalink',get_permalink())), // 記事のURL
      'title' => esc_html( get_the_title()), // 記事のタイトル
    );
    $monthlyPlus = array('12月'=>array(),'11月'=>array(),'10月'=>array(),'09月'=>array(),'08月'=>array(),'07月'=>array(),'06月'=>array(),'05月'=>array(),'04月'=>array(),'03月'=>array(),'02月'=>array(),'01月'=>array());
  endforeach;
?>
<?php $monthlyPosts = $monthlyPosts + $monthlyPlus; ?>
<?php krsort($monthlyPosts); // 配列をキーで逆順にソートする ?>
年別リンク
  <ul>
<?php wp_get_archives('type=yearly&post_type=campaign'); ?>
  </ul>
月別ページ内リンク
  <ul>
<?php $x=1; foreach( $monthlyPosts as $title => $monthlyPost ): // 月別ページ内リンクを表示 ?>
<?php if(!empty($monthlyPost)): ?>
    <li><a href="#monthly<?php echo $x; ?>"><?php echo $title; ?></a></h3>
<?php else: ?>
    <li><?php echo $title; ?></h3>
<?php endif; ?>
<?php $x++; endforeach; ?>
  </ul>
月別記事一覧
  <ul>
<?php $x=1; foreach( $monthlyPosts as $title => $monthlyPost ): //月別記事一覧を表示 ?>
<?php if(!empty($monthlyPost)): ?>
    <li id="monthly<?php echo $x; ?>"><h3><?php echo $title; ?></h3>
      <ul>
<?php foreach( $monthlyPost as $list ) : ?>
        <li><?php echo $list['time']; ?><a href="<?php echo $list['url']; ?>"><?php echo $list['title']; ?></a></li>
<?php endforeach; ?>
      </ul>
    </li>
<?php endif; ?>
<?php $x++; endforeach; ?>
  </ul>
<?php else: // 該当する年度に投稿がない場合 ?>
本年度の記事はありません
<?php endif; ?>

コード内の post_type は任意のポストタイプを指定してください。

年度別記事一覧を表示

最初に紹介して方法は年別でしたが、学校などでは年度別に表示させたい場合もあると思います。
年度別にする場合は date_query で、対象とする期間を細かく指定することで年度別記事一覧を表示することができます。
次のコードを、最初に紹介したコードの $myPosts の部分と差し替えてください。

...省略...
$myPosts = get_posts( array(
  'post_type' => 'post', // 任意のポストタイプを指定
  'posts_per_page' => -1, // 最大投稿数の指定
  'date_query' => array(
    array(
      'after' => array(
      'year' => $postsYear-1, // 去年の年
      'month' => 4,
      'day' => 1,
    ),
    'before' => array(
      'year' => $postsYear, // 現在の年
      'month' => 3,
      'day' => 31,
    ),
    'inclusive' => true,
    ),
  ),
));
...省略...

しかしこの方法だと、1〜3月や4〜12月で表示内容が変わってしまうため、現在の日付を基準に取得内容を切り替える必要があります。
次のコードを、最初に紹介したコードの投稿の取得の部分と差し替えてください。

<?php // 投稿の取得
  foreach((get_post()) as $date) { // 最新記事の年月日を取得
    $postsYear = date('Y',get_post_time()); // 最新記事の年を取得
    $postsDate = date('Ymd',get_post_time()); // 最新記事の月を取得
    break ;
  }
  $base_time = $postsYear.'0401'; // 比較用の年月
  if( $base_time <= $postsDate || is_year() ) { // 4月以降なら 又は 年別アーカイブページなら
    $myPosts = get_posts( array(
      'post_type' => 'post', // 任意のポストタイプを指定
      'posts_per_page' => -1,
      'date_query' => array(
    		array(
    			'after' => array(
    				'year' => $postsYear, // 現在の年
    				'month' => 4,
    				'day' => 1,
    			),
    			'before' => array(
    				'year' => $postsYear + 1, // 来年の年
    				'month' => 3,
    				'day' => 31,
    			),
    			'inclusive' => true,
    		),
    	),
    ));
  } else { // 4月以前なら
    $myPosts = get_posts( array(
      'post_type' => 'post', // 任意のポストタイプを指定
      'posts_per_page' => -1,
      'date_query' => array(
    		array(
    			'after' => array(
    				'year' => $postsYear - 1, // 去年の年
    				'month' => 4,
    				'day' => 1,
    			),
    			'before' => array(
    				'year' => $postsYear, // 現在の年
    				'month' => 3,
    				'day' => 31,
    			),
    			'inclusive' => true,
    		),
    	),
    ));
    $postsYear = $postsYear - 1; // 見出しように年度を取得
  } 
  $monthlyPosts = array(); // 初期設定用の配列(月別の連想配列を入れる)
?>
...以下省略...

年別アーカイブページでも archive.php を使う場合は、日付による分岐は不要なので、日付の分岐部分に is_year() を加えています。

まとめ

WordPress で年別の月別記事一覧を表示する方法を紹介しました。
この投稿では以下のサイトを参考にさせていただきました。合わせてご覧ください。
WordPressで様々な値を取得する
【修正版】WordPressの記事一覧を月別に表示させる方法

私が続けて読みたい関連記事

スポンサーリンク