はじめに (対象読者・この記事でわかること)
この記事は、WordPressサイトの運営者、PHPエンジニア、そしてブログのSEOやユーザー体験を向上させたいWeb担当者を対象としています。常に新鮮な情報を提供したいと考えているものの、どのように更新された記事を効率的に表示すれば良いか悩んでいる方もいるかもしれません。
この記事を読むことで、WordPressの強力なクエリ機能であるWP_Queryを用いて、更新日が過去90日以内の記事を動的に取得・表示する具体的なPHPコードと手順を習得できます。これにより、常に新鮮なコンテンツをユーザーに提供し、サイトの魅力を高める方法が理解できるようになります。古くなった情報を表示することなく、常に「今」役立つ記事を前面に出せるようになりましょう。
前提知識
この記事を読み進める上で、以下の知識があるとスムーズです。
- PHPの基本的な構文(変数、配列、関数、クラスの概念)
- WordPressの基礎知識(投稿、ページ、テーマ、プラグインの概念)
- WordPressテーマのファイル構造(functions.php、テンプレートファイルなど)
- HTML/CSSの基本的な知識
WordPressサイトにおける「更新日」の重要性
WordPressでコンテンツを管理していると、時間の経過とともに記事の鮮度が落ちていくことがあります。特に技術系ブログや情報サイトでは、情報のアップデートが頻繁に行われるため、常に最新の情報を提供することが非常に重要です。では、なぜ記事の更新日が重要なのでしょうか。
1. ユーザー体験 (UX) の向上
訪問者は常に最新の情報やトレンドを求めています。古い日付の記事が表示されていると、情報が古くて役に立たないかもしれないという印象を与え、サイトを離脱する原因になりかねません。更新日が新しい記事を優先的に表示することで、訪問者は「このサイトは常に情報が更新されている」と感じ、信頼性や満足度が向上します。
2. 検索エンジン最適化 (SEO) への影響
Googleをはじめとする検索エンジンは、コンテンツの「鮮度」をランキング要因の一つとして重視しています。特にニュース性や時事性が高いトピックでは、新しい情報が掲載されているページが上位表示されやすい傾向にあります。定期的にコンテンツを更新し、その更新日を適切に表示することで、検索エンジンからの評価を高め、オーガニック検索からの流入を増やすことが期待できます。
3. サイトの信頼性向上
定期的にコンテンツが更新されているサイトは、運営が活発であるという印象を与え、訪問者からの信頼を得やすくなります。逆に、何年も更新されていない記事ばかりが並んでいるサイトは、情報の提供が終わっているのではないか、といった不安を抱かせることがあります。
WordPressには、投稿の取得を柔軟に制御するための強力なクラスWP_Queryが用意されています。これを利用することで、標準のWordPressループでは難しい複雑な条件での記事取得も可能になります。今回はこのWP_Queryと日付指定のためのdate_queryを使って、上記の課題を解決する方法を見ていきましょう。
WP_Queryとdate_queryで90日以内の記事を取得する実践ガイド
ここからは、実際にWordPressのWP_Queryクラスとdate_query引数を使って、更新日が90日以内の記事を取得し、テーマファイルに表示する具体的な方法を解説します。
ステップ1: WP_Queryの基礎とdate_queryパラメータの理解
まず、WP_Queryとは何か、そしてその中でも日付に関するクエリを扱うdate_queryについて理解しましょう。
WP_Queryは、WordPressのデータベースから投稿や固定ページ、カスタム投稿タイプなどを取得するためのメインとなるクラスです。これを使えば、カテゴリ、タグ、著者、キーワード、そして日付など、さまざまな条件で投稿をフィルタリングできます。
今回使用するdate_queryは、WP_Queryの引数の一つで、日付に基づいて投稿をフィルタリングするための非常に強力なパラメータです。特定の年、月、日、または特定の期間内の投稿を取得できます。
過去90日以内の条件指定
過去90日以内の記事を取得するためには、date_queryの中でafterというパラメータを使用します。afterは「特定の日付以降」の投稿を取得する際に使われます。
重要なポイントとして、WordPressの投稿には主に2つの日付があります。
- post_date: 記事が最初に公開された日時。
- post_modified: 記事が最後に更新された日時。
今回の要件は「更新日が90日以内」なので、post_modifiedを基準にする必要があります。これをdate_queryのcolumn引数で指定します。
それでは、具体的なWP_Queryの引数を見てみましょう。
Php<?php // 現在から90日前の日付を計算 $ninety_days_ago = date('Y-m-d H:i:s', strtotime('-90 days')); $args = array( 'post_type' => 'post', // 取得する投稿タイプ('post'は通常の投稿) 'posts_per_page' => 10, // 表示する記事の数(-1で全て取得) 'orderby' => 'post_modified', // 更新日でソート 'order' => 'DESC', // 新しい順(降順) 'post_status' => 'publish', // 公開済みの記事のみ 'date_query' => array( array( 'column' => 'post_modified', // 基準とする日付カラムを 'post_modified' に指定 'after' => $ninety_days_ago, // この日付以降の投稿を取得 'compare' => '>=', // `after`で指定した日付も含む ), ), ); // WP_Queryインスタンスの生成 $recent_posts_query = new WP_Query( $args ); // 以降、取得した記事を表示するループ if ( $recent_posts_query->have_posts() ) { // 記事がある場合の処理 } else { // 記事がない場合の処理 } ?>
コードの説明:
- 'post_type' => 'post': 投稿(通常のブログ記事)を取得します。カスタム投稿タイプの場合は、そのスラッグを指定します。
- 'posts_per_page' => 10: 取得する記事の数を10件に制限します。全ての記事を取得したい場合は-1を指定します。
- 'orderby' => 'post_modified': 記事を更新日(post_modified)でソートします。
- 'order' => 'DESC': ソート順を降順(新しいものが先頭)にします。
- 'post_status' => 'publish': 公開されている記事のみを取得します。
- 'date_query': 日付によるフィルタリングを行うための配列です。
- 'column' => 'post_modified': フィルタリングの基準となる日付カラムをpost_modified(最終更新日)に指定します。
- 'after' => $ninety_days_ago: $ninety_days_agoで計算された日付以降の投稿を取得します。strtotime('-90 days')は、現在時刻から90日前のUnixタイムスタンプを返します。
- 'compare' => '>=': afterで指定した日付を含め、「それ以降」の投稿を取得します。>にすると、90日前の日付は含まれません。
ステップ2: 実際にテーマに実装する
次に、このWP_QueryのコードをWordPressのテーマファイルに組み込み、実際にサイト上で表示してみましょう。functions.phpに関数として定義し、テンプレートファイルから呼び出す方法が管理しやすくおすすめです。
1. functions.phpに関数を追加
まず、テーマのfunctions.phpファイルに、更新日90日以内の記事を取得するための関数を定義します。
Php<?php // functions.php に追加 /** * 更新日90日以内の記事を取得する関数 * * @param int $posts_per_page 取得する記事の数。-1で全て取得。 * @return WP_Query WP_Queryオブジェクト */ function get_recent_updated_posts( $posts_per_page = 5 ) { $ninety_days_ago = date('Y-m-d H:i:s', strtotime('-90 days')); $args = array( 'post_type' => 'post', 'posts_per_page' => $posts_per_page, 'orderby' => 'post_modified', 'order' => 'DESC', 'post_status' => 'publish', 'date_query' => array( array( 'column' => 'post_modified', 'after' => $ninety_days_ago, 'compare' => '>=', ), ), 'suppress_filters' => true, // プラグインなどのフィルタを無効化(必要に応じて) ); $recent_posts_query = new WP_Query( $args ); return $recent_posts_query; } ?>
この関数は、引数で取得する記事数を指定できるようにしています。
2. テンプレートファイルで記事を表示
次に、この関数を呼び出し、取得した記事をサイトの任意の場所に表示します。例えば、トップページ (index.php) やサイドバー (sidebar.php)、またはフッターなどのテンプレートファイルに追加できます。
Php<?php // 例: index.php や sidebar.php、またはカスタムテンプレートファイルなど // 更新日90日以内の記事を10件取得 $recent_updated_posts = get_recent_updated_posts( 10 ); // 記事が存在するかチェック if ( $recent_updated_posts->have_posts() ) : ?> <section class="recent-updated-posts-section"> <h2 class="section-title">✨ 更新日90日以内の新着記事</h2> <ul class="post-list"> <?php // ループ開始 while ( $recent_updated_posts->have_posts() ) : $recent_updated_posts->the_post(); ?> <li class="post-item"> <a href="<?php the_permalink(); ?>" class="post-link"> <?php the_title(); ?> </a> <span class="post-meta"> (更新日: <time datetime="<?php echo get_the_modified_date('Y-m-d'); ?>"><?php echo get_the_modified_date(); ?></time>) </span> </li> <?php endwhile; ?> </ul> </section> <?php // 重要な処理: メインクエリの投稿データをリセット wp_reset_postdata(); else : ?> <p>現在、更新日90日以内の記事はありません。</p> <?php endif; ?>
ポイント:
- wp_reset_postdata();: WP_Queryを使用してカスタムループを実行した後は、必ずwp_reset_postdata();を呼び出して、グローバルな$postデータを元のメインクエリに戻す必要があります。これを忘れると、その後のWordPressループやthe_title()などのテンプレートタグが意図しない情報を表示する可能性があります。
- get_the_modified_date(): 記事の最終更新日時を取得・表示するテンプレートタグです。
複数投稿タイプへの対応
もし通常の投稿だけでなく、カスタム投稿タイプ(例: 'event', 'product'など)も対象にしたい場合は、post_type引数を配列で指定できます。
Php'post_type' => array('post', 'event', 'product'), // 複数の投稿タイプを指定
ハマった点やエラー解決
実装中に遭遇しやすい問題と、その解決策について解説します。
1. post_dateとpost_modifiedの混同
- 問題点: 「更新日」を基準にしたいのに、間違って
'column' => 'post_date'を指定してしまうと、記事の公開日を基準にフィルタリングされてしまいます。 - 解決策: 要件が「更新日」であれば、必ず
'column' => 'post_modified'を指定するようにしましょう。
2. afterパラメータの文字列フォーマット
- 問題点:
'after' => '90 days ago'のように、strtotimeが解釈できないような文字列を指定すると、正しく動作しないことがあります。 - 解決策: PHPの
strtotime()関数は非常に柔軟ですが、誤解を避けるためにもdate('Y-m-d H:i:s', strtotime('-90 days'))のように、明示的に日付フォーマットを生成してから渡すのが確実です。ただし、WP_Queryのdate_queryでは'90 days ago'のような自然言語文字列もサポートされているため、コード例のように直接指定することも可能です。
3. posts_per_pageの指定忘れ
- 問題点:
posts_per_pageを指定し忘れると、デフォルトの10件(またはWordPress設定で指定された数)しか取得されません。全ての該当記事を表示したい場合に困ります。 - 解決策: 全ての記事を取得したい場合は
'posts_per_page' => -1を必ず指定してください。
4. wp_reset_postdata()の忘れ
- 問題点:
WP_Queryでカスタムループを回した後、wp_reset_postdata()を呼び出し忘れると、それ以降のメインクエリやテンプレートタグが意図しない記事の情報を参照してしまうことがあります。 - 解決策: カスタムループが終わったら、
endif;の直後など、必ずwp_reset_postdata();を呼び出してください。
5. キャッシュの問題
- 問題点: オブジェクトキャッシュ、永続キャッシュ、またはCDNキャッシュなどを利用している場合、コードを変更してもすぐに表示に反映されないことがあります。
- 解決策: 開発中はキャッシュを無効にするか、コード変更後に手動でキャッシュをクリアすることで、最新の変更を反映させることができます。
6. 期間の境界条件 (compare)
- 問題点: 「90日以内」が「90日前を含まない」のか「90日前も含む」のかで、
>と>=を間違えると、意図しない記事が除外されたり含まれたりします。 - 解決策: 今回の例では
'compare' => '>='とすることで、ちょうど90日前に更新された記事も含まれるようにしています。要件に応じて適切に>または>=を選択してください。
まとめ
本記事では、WordPressサイトにおいて記事の鮮度を保つ重要性を確認し、WP_Queryの強力なdate_query機能を用いて、更新日が90日以内の記事を動的に取得・表示する具体的な方法を解説しました。
- WP_Queryと
date_queryの活用: WordPressのWP_Queryとdate_queryを使うことで、複雑な日付条件で投稿を柔軟にフィルタリングし、必要な記事だけを取得できることを学びました。 post_modifiedの重要性: 記事の公開日ではなく最終更新日を基準にするために、date_queryのcolumn引数に'post_modified'を指定することの重要性を理解しました。- 安全な実装: カスタムループの後に
wp_reset_postdata()を呼び出すことで、WordPressのメインクエリに影響を与えず、安全にコンテンツを表示できることを確認しました。
この記事を通して、WordPressサイトで特定の期間内に更新された記事を自動的に表示できるようになり、サイトの鮮度を保ち、訪問者と検索エンジンの双方に価値を提供するスキルを得られました。これにより、ユーザーエンゲージメントの向上やSEO効果の改善が期待できます。
今後は、カスタム投稿タイプへの適用、表示期間を管理画面から設定可能にする方法、さらに複雑なクエリ条件での絞り込み(例:カテゴリと更新日の組み合わせ)についても記事にする予定です。
参考資料
- WordPress Developer Resources: WP_Query
- WordPress Developer Resources: Date Parameters
- PHP: strtotime — Manually generate dates from a string
