2026/08/25
【WordPress】投稿を指定した日時に自動で非公開にする方法
WordPressでは投稿を指定した日時に「公開」する予約投稿機能は標準で用意されています。
一方で、
「キャンペーン終了と同時に記事を非公開にしたい」
「期間限定のお知らせを指定日時になったら見られなくしたい」
といった、指定日時に自動で投稿を非公開にしたいケースもあるかと思います。
今回はプラグインを使用せず、WordPressの機能とPHPを使って、指定した日時を過ぎた投稿を自動で非公開にする方法をご紹介します。
実装方法
今回は投稿のカスタムフィールドに「公開終了日時」を設定し、その日時を過ぎたら投稿を「非公開」に変更するようにします。
functions.phpに以下を記述します。
function change_post_to_private_after_expiration() {
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => 'expiration_date',
'compare' => 'EXISTS',
),
),
);
$posts = get_posts($args);
if (empty($posts)) {
return;
}
$current_time = current_time('timestamp');
foreach ($posts as $post) {
$expiration_date = get_post_meta(
$post->ID,
'expiration_date',
true
);
if (empty($expiration_date)) {
continue;
}
$expiration_timestamp = strtotime($expiration_date);
if ($expiration_timestamp && $current_time >= $expiration_timestamp) {
wp_update_post(array(
'ID' => $post->ID,
'post_status' => 'private',
));
}
}
}
この処理を実行すると、カスタムフィールド「expiration_date」に設定した日時と現在日時を比較し、公開終了日時を過ぎている場合に投稿のステータスを「非公開」へ変更できます。
コードについて
まず、get_posts()を使用して公開中の投稿を取得しています。
$args = array( 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => 'expiration_date', 'compare' => 'EXISTS', ), ), );
post_statusをpublishにすることで、現在公開されている投稿のみを対象にしています。
また、meta_queryを設定し、expiration_dateというカスタムフィールドが存在する投稿だけを取得します。
続いて、WordPressに設定されている現在日時を取得します。
$current_time = current_time('timestamp');
PHP標準のtime()ではなくcurrent_time()を使用することで、WordPress側で設定されているタイムゾーンを基準に日時を比較できます。
投稿ごとに公開終了日時を取得します。
$expiration_date = get_post_meta( $post->ID, 'expiration_date', true );
取得した日時をstrtotime()でタイムスタンプに変換します。
$expiration_timestamp = strtotime($expiration_date);
そして、現在日時が公開終了日時を過ぎているか判定します。
if ($expiration_timestamp && $current_time >= $expiration_timestamp) {
日時を過ぎていた場合はwp_update_post()を使用して投稿ステータスを変更します。
wp_update_post(array( 'ID' => $post->ID, 'post_status' => 'private', ));
これで投稿が「公開」から「非公開」へ変更されます。
定期的に処理を実行する
ここまでのコードだけでは、関数を作成しただけなので自動では実行されません。
指定日時を過ぎた投稿をチェックするには、WordPressの「WP-Cron」を利用して定期的に処理を実行します。
まず、Cronイベントを登録します。
function register_expiration_cron() {
if (!wp_next_scheduled('check_post_expiration')) {
wp_schedule_event(
time(),
'hourly',
'check_post_expiration'
);
}
}
add_action('wp', 'register_expiration_cron');
続いて、先ほど作成した処理をCronイベントに登録します。
add_action( 'check_post_expiration', 'change_post_to_private_after_expiration' );
これでWP-Cronが実行されたタイミングで、公開終了日時を過ぎた投稿がないかチェックされます。
WP-Cronを使用する際の注意点
WP-Cronは一般的なサーバーのCronとは異なり、WordPressへのアクセスをきっかけに実行されます。
そのため、アクセス数が少ないサイトでは、設定した日時ちょうどに処理が実行されるとは限りません。
今回の例ではhourlyを指定しているため、基本的には1時間ごとの実行を想定していますが、アクセス状況によって実際の実行時間が遅れる可能性があります。
wp_schedule_event( time(), 'hourly', 'check_post_expiration' );
キャンペーン終了など、指定した時刻にできるだけ正確に公開を終了させたい場合は、サーバー側のCronを利用する方法も検討する必要があります。
下書きに戻したい場合
非公開ではなく「下書き」に変更したい場合は、post_statusをdraftに変更します。
wp_update_post(array( 'ID' => $post->ID, 'post_status' => 'draft', ));
カスタム投稿タイプで使用する場合
カスタム投稿タイプでも同じ方法を利用できます。
例えば、投稿タイプがnewsの場合は以下のように変更します。
$args = array( 'post_type' => 'news', 'post_status' => 'publish', 'posts_per_page' => -1, );
post_typeを対象となるカスタム投稿タイプのスラッグに変更すればOKです。
まとめ
今回は、WordPressで投稿を指定した日時に自動で非公開にする方法をご紹介しました。
WordPressには予約投稿機能がありますが、標準機能では公開終了日時を指定することはできません。
カスタムフィールドに公開終了日時を設定し、WP-Cronで定期的に日時をチェックすることで、プラグインを使用せず自動的に投稿を非公開にできます。
期間限定のお知らせやキャンペーンページなど、公開期間が決まっているコンテンツを管理する際に活用してみてください。
コーディング業務のご依頼、ご相談の詳細についてはこちらから
最後までお読みいただき、ありがとうございました。
よろしければシェアしていただければ幸いです。
| 次の記事へ | 前の記事へ |
WEB業界ならqam!qam(カム)はWEB業界で働く人や興味がある人に役立つ情報サイトです。
マーケティングやデザイン、マークアップ(コーディング)、プログラム、トレンドなどの情報をqamライター陣が執筆。噛めば噛むほど(読めば読むほど)制作・開発や運営・運用、業界知識やノウハウを学ぶことができます。




