WordPressで運用しているサイトにおいて、古い情報がそのまま残っていると、ユーザーに誤解を与えたりSEO的にマイナスになることがあります。そこで、一定期間以上経過した投稿を自動で非公開にする処理を実装することで、情報の鮮度を保つことができます。
処理の概要と前提
本記事では「投稿公開日から一定期間(例:90日)経過した投稿」を対象に、ステータスを非公開に自動変更する処理を作成します。処理はWordPressのcron(擬似スケジューラー)を使って定期的に実行されます。
ステップ1:自動実行の処理を作成
まずは投稿のステータスを非公開にする関数を定義します。functions.phpに以下を追加します。
function auto_unpublish_old_posts() {
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1,
'date_query' => array(
array(
'column' => 'post_date',
'before' => '90 days ago',
),
),
);
$query = new WP_Query($args);
foreach ($query->posts as $post) {
wp_update_post(array(
'ID' => $post->ID,
'post_status' => 'private',
));
}
}
この処理では、90日前より古い公開済みの投稿をすべて取得し、post_status
を private
に変更します。
ステップ2:cronで定期的に実行する
この関数を1日1回自動で実行するよう、WordPressのcronスケジュールに登録します。
// イベントスケジュール登録
function schedule_auto_unpublish_event() {
if (!wp_next_scheduled('auto_unpublish_event')) {
wp_schedule_event(time(), 'daily', 'auto_unpublish_event');
}
}
add_action('wp', 'schedule_auto_unpublish_event');
// イベント実行時の処理
add_action('auto_unpublish_event', 'auto_unpublish_old_posts');
これにより、WordPressが1日1回 auto_unpublish_old_posts()
を実行し、古い投稿が自動的に非公開になります。
ステップ3:不要になったイベントの解除
万が一処理を停止したい場合は、以下のコードを使ってスケジュールされたイベントを削除できます。
function unschedule_auto_unpublish_event() {
$timestamp = wp_next_scheduled('auto_unpublish_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'auto_unpublish_event');
}
}
この関数はテーマの切り替え時やメンテナンス時などに実行できます。
注意点
- WordPressのcronは「アクセス時」に実行されるため、トラフィックが少ないサイトではタイミングがずれることがあります。
- 処理が大量の投稿に対して一括で実行されると、サーバー負荷が高まる可能性があります。
- 実行対象をカスタム投稿タイプに切り替えたい場合は、
'post_type' => 'custom_post_type'
に変更してください。
まとめ
古い投稿を自動で非公開にする仕組みは、サイトの情報を常に新鮮に保つうえで効果的です。今回紹介したように、WP_Queryとwp_update_post、cronスケジュールを組み合わせることで、プラグインを使わずに柔軟な運用が可能になります。