WEBOPIXEL

WordPressで年度別記事一覧を表示する

Posted: 2014.03.25 / Category: WordPress 

WordPressでコーポレートサイトを構築するとき、年度別リンクとか記事一覧を表示したいときがまれにありますのでご紹介します。

Sponsored Link

年度別アーカイブリスト

「・2014年度・2013年度・・・」のリンクの表示ですね。
最初に「functions.php」に下記を追加して。

functions.php

                function get_archives_by_fiscal_year( $args = '' ) {
                    global $wpdb, $wp_locale;
                    $defaults = array (
                        'post_type' => 'post',
                        'limit' => '',
                        'format' => 'html',
                        'before' => '',
                        'after' => '',
                        'show_post_count' => false,
                        'echo' => 1
                    );
                    $r = wp_parse_args( $args, $defaults );
                    extract ( $r, EXTR_SKIP );
                    if ( '' != $limit ) {
                        $limit = absint( $limit );
                        $limit = ' LIMIT ' . $limit;
                    }
                    $arcresults = (array) $wpdb->get_results(
                        "SELECT YEAR(ADDDATE(post_date, INTERVAL -3 MONTH)) AS `year`, COUNT(ID) AS `posts`
                        FROM $wpdb->posts
                        WHERE post_type = '$post_type' AND post_status = 'publish'
                        GROUP BY YEAR(ADDDATE(post_date, INTERVAL -3 MONTH))
                        ORDER BY post_date DESC
                        $limit"
                    );
                    return $arcresults;
                }
                

あとは「sidebar.php」とか表示したい部分に下記を追加します。

sidebar.php

                <ul>
                <?php
                $archives = get_archives_by_fiscal_year();
                foreach($archives as $archive):
                ?>
                <li><a href="<?php echo home_url() ?>/date/<?php echo esc_html($archive->year) ?>"><?php echo esc_html($archive->year) ?>年度</a></li>
                <?php
                endforeach;
                ?>
                </ul>
                

この部分は下記サイトを参考(というかそのままです)にさせていただきました。

[WordPress] 年度別(4月から始まる)アーカイブリストを表示する | 制作メモ | 560DESIGNS

年度別記事一覧

先ほどのアーカイブリストのリンク先は「/date/2013」という感じになっいて、アクセスすると2013年4月から2014年3月までの投稿を表示するようにしてみます。
とりあえず「archive.php」に下記を記述します。

archive.php

                <?php
                $year = get_query_var('year');
                $args = array(
                'post_status' => 'publish'
                );
                if ($year) {
                $start_date = $year.'/4/1';
                $end_date = ($year+1).'/3/31 23:59:59';
                $args += array('date_query' => array (
                'compare' => 'BETWEEN',
                'after' => $start_date,
                'before' => $end_date,
                'inclusive' => true
                ));
                }
                $query = new WP_Query($args);
                echo '<table>';
                if ($query->have_posts()) : while ($query->have_posts() ) : $query->the_post(); ?>
                <tr>
                <th><span><?php echo get_the_date('Y.m.d'); ?></span></th>
                <td><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></td>
                </tr>
                <?php endwhile; endif;
                echo '</table>';
                wp_reset_query();
                ?>
                

これで基本的には表示できるのですが、「archive.php」で作成すると問題があります。
たとえば「2012年2月」は「/date/2011」に表示されますが、「2011年」の記事がない場合、本来の年の処理が優先されて「404.php」や「index.php」などが優先して読み込まれます。

フックとかを使えば対応できそうな気がしますが、独立したPHPファイルを作成して、$yearの部分をURLから引っ張ってきた方が早いかもしれません。

                $year = if (isset($_GET['year'])) intval($_GET['year']);
                

リンク部分

                <li><a href="<?php echo home_url() ?>/hoge.php?year=<?php echo esc_html($archive->year) ?>"><?php echo esc_html($archive->year) ?>年度</a></li>
                

COMMENTS

しん 2020-01-23 19:21 

まさにこのことをやろうと思っていて、参考にさせていただいております。
ありがとうございます m(___)m

申し訳ないですが…1つ質問があり..もしわかれば教えていただいてもよいでしょうか。
サイドバーのアーカイブから飛ぶ場合は問題ないですが、
デフォルトでニュース一覧をクリックしたときは、その年度を表示したい場合は $yearのところをどのように改良すればよいでしょうか。

2020年1月が、2019年度になるので、月をみて、1~3月の場合は、year = date(‘Y’) – 1 をしたりする以外は方法ないでしょうか。

if(get_query_var(‘year’)){
$year = get_query_var(‘year’);
}
else {
$mth = date(‘m’);
echo “mth=$mth”;
if( ($mth = 1)) {
$year = date(‘Y’) – 1;
}
else {
$year = date(‘Y’);
}
}

LEAVE A REPLY

コードを書く場合は<pre>で囲んでください。