はじめに
ブログやニュースサイトでは、古い投稿に閲覧制限を設けたい場合があります。
例えば、公開から一定期間が経過した記事を自動で会員限定にしたり、特定カテゴリーの記事だけを期間限定で一般公開するケースです。
そこで、投稿に特定のカテゴリー(例えば limited)が付いている場合、公開から一定日数経過していれば自動でパスワードを設定します。
この記事では、この方法について説明します。
実装手順
以下のコードをfunctions.phpに追加します。
add_action('the_post', function ($post) {
// 対象カテゴリーのスラッグを設定
$target_category_slug = 'limited'; // 対象カテゴリのスラッグ
$auto_password = 'secret123'; // 自動で設定するパスワード
$days = 7; // パスワード付にする経過日数
// 投稿以外は処理対象外
if ($post->post_type !== 'post') {
return;
}
// 対象カテゴリー以外は処理対象外
if (!has_category($target_category_slug, $post)) {
return;
}
// パスワード設定済みは処理対象外
if ($post->post_password !== '') {
return;
}
// 更新処理中は処理対象外
static $updating = false;
if ($updating) {
return;
}
// 投稿公開日時を取得
$published_time = strtotime($post->post_date);
$now = current_time('timestamp');
$diff_days = ($now - $published_time) / DAY_IN_SECONDS;
// 経過日数を確認
if ($diff_days >= $days) {
$updating = true;
// 投稿にパスワードを設定
wp_update_post([
'ID' => $post->ID,
'post_password' => $auto_password,
]);
// 投稿オブジェクトのパスワードを変更
$post->post_password = $auto_password;
$updating = false;
}
});
参考:閲覧時に一定日数経過した投稿を非公開にする方法
以下では、投稿単位で期限を設定し、一定期間のみ公開する方法を紹介しました。
前回と同様に、カテゴリーがprivateの投稿についても、閲覧されたタイミングで公開から一定日数が経過していれば、自動的に「非公開」に変更することができます。
実装手順
以下のコードをfunctions.phpに追加します。
add_action('the_post', function ($post) {
$target_category_slug = 'private'; // 対象カテゴリのスラッグ
$days = 7; // 非公開にする経過日数
// 投稿以外は処理対象外
if ($post->post_type !== 'post') {
return;
}
// 対象カテゴリー以外は処理対象外
if (!has_category($target_category_slug, $post)) {
return;
}
// 非公開設定済みは処理対象外
if ($post->post_status === 'private') {
return;
}
// 更新処理中は処理対象外
static $updating = false;
if ($updating) {
return;
}
// 投稿公開日時を取得
$published_time = strtotime($post->post_date);
$now = current_time('timestamp');
$diff_days = ($now - $published_time) / DAY_IN_SECONDS;
// 経過日数を確認
if ($diff_days >= $days) {
$updating = true;
// 投稿を非公開に変更
wp_update_post([
'ID' => $post->ID,
'post_status' => 'private',
]);
$updating = false;
}
});
さいごに
今回紹介した方法を使えば、特定カテゴリー付きの投稿が一定日数経過した際に、自動的にパスワードを設定して閲覧制限をかけられます。
閲覧時に判定されるため、古い投稿の管理や会員限定コンテンツ運用を簡単に実装可能です。

