投稿を特定カテゴリーで自動パスワード保護と解除する方法

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

はじめに

限定公開する記事は、通常「公開状態」を手動で「パスワード保護」に設定します。

しかし投稿が多い場合、毎回手動で設定するのは手間がかかり、設定漏れによる情報漏洩のリスクもあります。

そこで、投稿に特定のカテゴリー(例:limited)を付けるだけで、自動的にパスワード保護を設定する仕組みを作ります。

さらに、カテゴリーを削除した場合に自動で公開状態に戻すことで、運用ミスを防ぎます。

この記事では、この方法について説明します。

自動でパスワード保護する方法

投稿保存時にカテゴリーlimitedが付いている場合、自動でパスワード保護を設定します。

実装手順

以下のコードをfunctions.phpに追加します。

add_action('save_post', function ($post_id) {
  $password = 'secret123';      // 共通パスワード
  $target_category = 'limited'; // パスワード保護カテゴリー

  if (get_post_type($post_id) !== 'post') {
    return;
  }

  // 自動保存チェック
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
    return;
  }

  // リビジョンは除外
  if (wp_is_post_revision($post_id)) {
    return;
  }

  // 再帰処理を防止
  static $is_updating = false;
  if ($is_updating) {
    return;
  }

  $has_category = has_category($target_category, $post_id);
  $current_pass = get_post_field('post_password', $post_id);

  // パスワード設定済みの場合は終了
  if (
    ($has_category && $current_pass === $password) ||
    (!$has_category && $current_pass === '')
  ) {
    return;
  }

  $is_updating = true;

  // パスワード保護状態を更新
  wp_update_post([
    'ID' => $post_id,
    'post_password' => $has_category ? $password : '',
  ]);

  $is_updating = false;
});

カテゴリー削除時にパスワードを自動解除する方法

上記の方法では、カテゴリーlimitedを削除しても投稿のパスワードはそのまま残ります。
しかし、運用上はカテゴリー削除と同時にパスワード保護を解除して公開したい場合があります。
そこで、カテゴリーを削除した際に、投稿のパスワード保護を自動で解除するようコードを追加します。

実装手順

以下のコードをfuntions.phpに追加します。

add_action('pre_delete_term', function ($term_id, $taxonomy) {
  $target_category_slug = 'limited';

  if ($taxonomy !== 'category') {
    return;
  }

  $term = get_term($term_id, $taxonomy);
  if (!$term || $term->slug !== $target_category_slug) {
    return;
  }

  // 削除対象カテゴリーの投稿IDを取得
  $posts = get_posts([
    'post_type' => 'post',
    'posts_per_page' => -1,
    'tax_query' => [
      [
        'taxonomy' => 'category',
        'field' => 'term_id',
        'terms' => $term_id,
      ],
    ],
    'fields' => 'ids',
  ]);

  // 投稿なしは処理対象外
  if (empty($posts)) {
    return;
  }


  // カテゴリー削除完了後にパスワードを解除
  add_action('delete_term', function ($deleted_term_id, $deleted_tt_id, $deleted_taxonomy) use ($posts, $term_id) {
    if ($deleted_taxonomy !== 'category' || $deleted_term_id !== $term_id) {
      return;
    }

    global $wpdb;

    // 投稿IDを一括更新するクエリを設定
    $post_ids_placeholder = implode(',', array_fill(0, count($posts), '%d'));
    $query = $wpdb->prepare(
      "UPDATE {$wpdb->posts} SET post_password = '' WHERE ID IN ({$post_ids_placeholder}) AND post_type = 'post'",
      ...$posts
    );

    // パスワードを一括解除
    $wpdb->query($query);
  }, 10, 3);
}, 10, 2);

さいごに

今回紹介した方法を使えば、投稿に特定カテゴリーを設定するだけで自動的にパスワード保護がかかり、設定漏れによる公開ミスを防ぐことができます。
また、カテゴリーを削除した場合には自動でパスワードが解除され公開状態に戻るため、限定公開の運用を安全かつ効率的に行うことができます。

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