キャンペーン情報や期間限定のコンテンツなど、特定の期間だけ公開・表示したい記事がある場合、WordPressの標準機能だけでは制御が難しいことがあります。
この記事では、投稿にカスタムフィールドで「表示期間」を設定し、その期間内だけ記事を一覧などに表示する方法をご紹介します。
Advanced Custom Fields(ACF)などのプラグインを使って期間を設定し、pre_get_posts を使って表示制御を行う方法が中心です。
想定する表示条件
たとえば以下のような期間制御が可能になります。
- 表示開始日 <= 今日 <= 表示終了日 の期間内だけ記事を表示
- 表示終了日を過ぎたら自動で非表示(下書きなどに変更せずに制御)
ステップ1:カスタムフィールドを作成
ACFを使用する場合
以下の2つのフィールドを作成します(フィールドタイプは日付ピッカー)
フィールドラベル | フィールド名 |
---|---|
表示開始日 | start_date |
表示終了日 | end_date |
ステップ2:functions.php に表示制御のコードを追加
function show_posts_within_period($query) {
if (!is_admin() && $query->is_main_query() && (is_home() || is_archive() || is_search())) {
$today = date('Ymd');
$meta_query = array(
'relation' => 'AND',
array(
'relation' => 'OR',
array(
'key' => 'start_date',
'value' => $today,
'compare' => '<=',
'type' => 'DATE',
),
array(
'key' => 'start_date',
'compare' => 'NOT EXISTS',
),
array(
'key' => 'start_date',
'value' => '',
'compare' => '=',
),
),
array(
'relation' => 'OR',
array(
'key' => 'end_date',
'value' => $today,
'compare' => '>=',
'type' => 'DATE',
),
array(
'key' => 'end_date',
'compare' => 'NOT EXISTS',
),
array(
'key' => 'end_date',
'value' => '',
'compare' => '=',
),
),
);
$query->set('meta_query', $meta_query);
}
}
add_action('pre_get_posts', 'show_posts_within_period');
ステップ3:記事編集画面で期間を設定
記事ごとに「表示開始日」と「表示終了日」を設定すれば、その期間内だけ一覧に表示されるようになります。
注意点
- 日付の形式は Ymd(例:20250430)で統一しましょう(ACFの日付フォーマット設定も確認)。
- 表示されない理由が meta_query にある場合、WP_Query のデバッグ用に error_log(print_r($query, true)); などを活用すると便利です。
- すべての記事で期間設定が必須となるため、未設定記事を対象に含めたい場合は meta_query に relation や NOT EXISTS を使って調整が必要です。
まとめ
WordPressでは pre_get_posts フィルターとカスタムフィールドを組み合わせることで、特定の期間のみ記事を自動表示/非表示にすることができます。
イベント・キャンペーン・セール情報などを期間限定で公開したい場合に非常に有効なテクニックです。