はじめに
限定公開する記事は、通常「公開状態」を手動で「パスワード保護」に設定します。
しかし投稿が多い場合、毎回手動で設定するのは手間がかかり、設定漏れによる情報漏洩のリスクもあります。
そこで、投稿に特定のカテゴリー(例: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);
さいごに
今回紹介した方法を使えば、投稿に特定カテゴリーを設定するだけで自動的にパスワード保護がかかり、設定漏れによる公開ミスを防ぐことができます。
また、カテゴリーを削除した場合には自動でパスワードが解除され公開状態に戻るため、限定公開の運用を安全かつ効率的に行うことができます。

