WordPressで現在の週の投稿を表示する

以前書いた「WordPressで指定した期間の投稿を表示する方法」に引き続き、現在の週の投稿を表示するサンプルコードを書いてみました。

  
この記事は2年以上前に書かれたものです。
情報が古い可能性があります。

例えば今日は木曜日なので、週の始まりの設定を管理画面で月曜日にしていた場合、月曜日から今日木曜日までの投稿を抽出して表示といった感じです。

そもそもフォーラムで回答などされてるまがりんさん(@jim0912)という偉い方がフォーラムの質問を元に用意して下さったお題で、元々は別の方が先に取り掛かっており、既にヒントもかなりあったので割りと直ぐに終わりました。

※WordPress3.7で追加された date_query を使うと、驚くほど簡単にできるようになったみたいです。

検証WordPressバージョン

3.3.1

ソースコード

WP_Queryオブジェクトの比較を行わないとメインループに影響が出てしまうらしいので、オブジェクトが一致したときのみクエリ文字列を生成しています。

テーマのfunctions.php

<?php
/**
 * 現在の週の投稿を表示するためのWHERE文を生成
 *
 * @param   string  $where      抽出クエリ条件文
 * @param   object  $wp_query   WP_Queryオブジェクト
 */ 
add_filter( 'posts_where', 'filter_where', 10, 2 ); // WP_Queryオブジェクト比較の為、引数を2に指定
function filter_where( $where, $wp_query ) 
{
    global $my_current_week_posts;

    // 呼び出したWP_Queryのオブジェクトを比較して、呼び出し元と同じ場合のみクエリーを改変
    if ( $wp_query === $my_current_week_posts ) 
    {
        // 現在のローカルタイムでの曜日の番号を取得(0:日~6:土)
        $weekno = date_i18n( 'w' );

        // 管理画面の[設定]->[一般設定]で設定されている週の始まりの番号を取得(0:日~6:土)
        $start_of_week =  get_option( 'start_of_week' );

        // 曜日と週の始まりの差分を計算
        $diff = ( $weekno - $start_of_week );

        /*
         * 差分から今週の始まりが何日前なのかを算出
         * 差分が0未満または0以上で分岐する
         *
         *   差分が0未満   |  差分が0以上
         * --------------------------------
         *   差分 : ○日前 |  差分 : ○日前
         * --------------------------------
         *   -6  : -1     |   0  :  0
         *   -5  : -2     |   1  : -1
         *   -4  : -3     |   2  : -2
         *   -3  : -4     |   3  : -3
         *   -2  : -5     |   4  : -4
         *   -1  : -6     |   5  : -5
         *                |   6  : -6
         */
        if( $diff < 0 )  // 差分が0未満
        {
            $result_day = ( $diff ) + ( 7 );
        }
        else // 差分が0以上
        { 
            $result_day = ( $diff ) * ( -1 ) ;
        }

        // strtotimeに渡す文字列を組む(例:'-1 days')
        $days = $result_day . ' days';

        //strtotimeの第2引数には、current_timeを使って現在のローカルタイムのタイムスタンプを指定
        $timestamp = strtotime( $days , current_time( 'timestamp' ) );

        //WHERE句(条件文を)生成。現在の週の始まり以降の投稿日付の投稿を取得する
        $where .= " AND DATE(post_date) >= '" . date( 'Y-m-d', $timestamp ) . "'";
    }

    //条件文を返す
    return $where;
}

テーマのindex.php

<?php
//get_template_partで呼び出されるとスコープが異なってしまうため、念のためglobal宣言
global $my_current_week_posts;

// オブジェクト比較のために、WP_Queryのインスタンスを生成
$my_current_week_posts = new WP_Query(); 

// 全件取得。日数制限はフック側でコントロール。先頭に固定表示の投稿は無視
$my_current_week_posts->query( 'posts_per_page=-1&ignore_sticky_posts=1' );
?>

<?php if( $my_current_week_posts->have_posts() ) : ?>
    <?php while ( $my_current_week_posts->have_posts() ) : $my_current_week_posts->the_post(); ?>

    <!-- post -->
    <div class="post">
        <h2 class="title">
            <a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>">
                <?php the_title(); ?>
            </a>
        </h2>
        <ul>
            <li><?php the_time('Y年m月d日') ?></li>
        </ul>

        <?php the_content(); ?>

    </div><!-- /.post -->
    <?php 
    endwhile; 
    wp_reset_postdata();    //改変した$postをはじめとしたグローバル変数を元に戻す。
    ?>
<?php else : ?>
    <p>記事が見つかりません</p>
<?php endif; ?>
  

共有やブックマークなど