閲覧時に一定日数経過した投稿を自動でパスワード付きにする方法

Cocoonカスタマイズ集
この記事は約4分で読めます。
記事内に広告が含まれています。

はじめに

ブログやニュースサイトでは、古い投稿に閲覧制限を設けたい場合があります。
例えば、公開から一定期間が経過した記事を自動で会員限定にしたり、特定カテゴリーの記事だけを期間限定で一般公開するケースです。

そこで、投稿に特定のカテゴリー(例えば 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;
  }
});

さいごに

今回紹介した方法を使えば、特定カテゴリー付きの投稿が一定日数経過した際に、自動的にパスワードを設定して閲覧制限をかけられます。
閲覧時に判定されるため、古い投稿の管理や会員限定コンテンツ運用を簡単に実装可能です。

タイトルとURLをコピーしました