WordPressで指定した期間の投稿を表示する方法

WordPressでadd_filterとquery_postsを用いて指定した期間の投稿を抽出して表示する方法です。

WordPress3.3標準テーマの「Twenty Eleven」を使用しての例をご紹介します。

  

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

photo credit: Andrea_R via photopin cc

検証バージョン

  • WordPress 3.3

テーマ Twenty Elevenindex.php のソースコードの一部を抜粋。
ハイライトの部分が自分で挿入したコードになります。

1〜10日前の投稿を表示

<?php if ( have_posts() ) : ?>

	<?php twentyeleven_content_nav( 'nav-above' ); ?>

	<?php
 	/*
 	 * 1~10日前の投稿を取得
 	 */
 	add_filter( 'posts_where', 'filter_where' );
 	function filter_where( $where = '' ) {
 		$where .= " AND DATE(post_date) >= '" . date( 'Y-m-d', strtotime( '-10 days' ) ) . "'";
		$where .= " AND DATE(post_date) <= '" . date( 'Y-m-d', strtotime( '-1 days' ) ) . "'";
		return $where;
 	}
	global $query_string;
 	query_posts( $query_string );
 	?>

	<?php /* Start the Loop */ ?>
	<?php while ( have_posts() ) : the_post(); ?>

		<?php get_template_part( 'content', get_post_format() ); ?>

	<?php endwhile; ?>

	<?php twentyeleven_content_nav( 'nav-below' ); ?>

	<?php wp_reset_query(); ?>

<?php else : ?>

分かりにくいかも知れないので処理のフローを書いておきます。

  • filter_where() で条件文を追加
  • query_posts() で投稿を絞り込み
  • while ( have_posts() ) は該当投稿数分ループする
  • the_post() で投稿データをロードする
  • get_template_part() で投稿データの詳細表示
  • ページネーション表示
  • wp_reset_query() でクエリをリセット (※重要)

注意点

日付の比較

post_date はデータベース上で datetime型 で定義されていますので 2012-01-13 > 13:25:59 のような感じで 時:分:秒 のデータも持っています。
ですから 年-月-日 時:分:秒 > 年-月-日 みたいな比較をしてしまうと、期待したデータを取得できなかったりします。。
 -- post_date > date('Y-m-d')
2012-01-13 13:25:59 > 2012-01-13

例えば上記のような比較になってしまうと、左の値のほうが大きくなってしまうから。
1月13日より大きい日付のものを取ってきたいのに1月13日のデータも含まれてしまう!なんてことに陥ってしまいます

DATE(post_date)とかして 時:分:秒 のところを省いて比較するかとか何かしら対応したほうが良いかもしれません。
DATEMySQL(データベース) の関数です。PHPじゃなくてこれはデータベースへ命令を投げるものなのでSQL文になります。

Cannot redeclare filter_where()

以下のループの中にfilter_where()関数を書いてしまうと、
「Fatal error: Cannot redeclare filter_where() (previously declared in ~」とエラーが出てしまいます。

<?php while ( have_posts() ) : the_post(); ?>
	<?php /*ループ内にfunctionは書いたらダメ(´・ω・`)*/ ?>
<?php endwhile; ?>

これはループの中で何度もfilter_where()関数が定義されてしまうので、重複してるよって怒られてしまいます。

参考

  

共有やブックマークなど