WordPressでは投稿ごとに「パスワード保護」の設定が可能ですが、運用上「特定の条件に合致する投稿には自動でパスワードをかけたい」という場面があります。毎回手動で設定するのは手間がかかるため、自動化することで作業効率が大幅に向上します。
本記事では、特定の投稿タイプや条件に一致する投稿に対して、保存時に自動的にパスワード保護を適用する方法を紹介します。
実装の概要
WordPressでは投稿の保存時にさまざまなアクションフックが発火します。ここでは「特定のカテゴリに属する投稿」や「カスタム投稿タイプ」に対して、投稿時に自動的にパスワード保護を設定する例を取り上げます。
ブロックエディタ(Gutenberg)/REST API経由の保存では、カテゴリなどのタームの紐付けは
save_postが発火した後に行われます(WordPress公式のGitHub issue「gutenberg#8032」で確認)。このためsave_post内でhas_category()を判定すると、新規投稿にカテゴリを設定して最初に保存した瞬間はまだfalseが返り、パスワード保護がかからないまま投稿が保存されてしまいます。WordPress 5.6で追加されたwp_after_insert_postフックは、ターム・メタデータの両方が確定した後に、クラシックエディタ・ブロックエディタ・REST APIいずれの経路でも一貫して発火するよう設計されているため、こちらを使う必要があります。特定のカテゴリの記事を自動的にパスワード保護する
投稿が「限定公開」カテゴリに属している場合に、自動でパスワード保護を設定するコードです。
function auto_password_protect_limited_category($post_id, $post, $update, $post_before) {
// 自動保存・リビジョン時はスキップ
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (wp_is_post_revision($post_id)) return;
// 投稿タイプチェック
$post_type = get_post_type($post_id);
if ($post_type !== 'post') return;
// カテゴリが「限定公開」(例: slug が 'limited')か確認
if (has_category('limited', $post_id)) {
// 既にパスワード保護されていない場合のみ設定
if (get_post_field('post_password', $post_id) === '') {
// 任意のパスワードを設定(例:secret123)
$update_args = array(
'ID' => $post_id,
'post_password' => 'secret123',
);
remove_action('wp_after_insert_post', 'auto_password_protect_limited_category'); // 再帰防止
wp_update_post($update_args);
add_action('wp_after_insert_post', 'auto_password_protect_limited_category', 10, 4);
}
}
}
add_action('wp_after_insert_post', 'auto_password_protect_limited_category', 10, 4);
このコードにより、「limited」というスラッグを持つカテゴリが付いている投稿は、保存時に自動で「secret123」というパスワードが設定されます。
カスタム投稿タイプに自動でパスワードをかける
次は、特定のカスタム投稿タイプ(例:event)に対して自動的にパスワード保護を適用する例です。
function auto_password_protect_custom_post_type($post_id, $post, $update, $post_before) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (wp_is_post_revision($post_id)) return;
$post_type = get_post_type($post_id);
if ($post_type !== 'event') return;
if (get_post_field('post_password', $post_id) === '') {
$update_args = array(
'ID' => $post_id,
'post_password' => 'eventpass',
);
remove_action('wp_after_insert_post', 'auto_password_protect_custom_post_type');
wp_update_post($update_args);
add_action('wp_after_insert_post', 'auto_password_protect_custom_post_type', 10, 4);
}
}
add_action('wp_after_insert_post', 'auto_password_protect_custom_post_type', 10, 4);
この例では、event投稿タイプのすべての投稿が、自動的に「eventpass」というパスワードで保護されます。post_typeはsave_post時点でも既に確定しているためこの例自体はsave_postでも動作しますが、カテゴリ判定版と実装を揃えるためwp_after_insert_postを使っています。
パスワードを個別に制御したい場合の応用
ユーザー入力によってパスワードを指定する場合や、投稿タイトルやカスタムフィールドの値をもとにパスワードを生成したい場合は、以下のように動的に設定することも可能です。
$custom_password = 'pw-' . get_post_field('post_name', $post_id);
投稿スラッグ(post_name)はURLに含まれ誰でも閲覧できる情報です。これをそのままパスワードの一部に使うと、URLを見ただけでパスワードが推測できてしまい、パスワード保護の意味がほとんどなくなります。動的にパスワードを生成する場合は、外部に公開されないランダムな値やカスタムフィールドの非公開な値を使いましょう。
また、カスタムフィールド(例:protect_flag)が1のときだけパスワードをかける、といった条件も追加できます。
関連記事
よくある質問(FAQ)
まとめ
WordPressでは、投稿の保存が完了したタイミングで実行されるフックを使うことで、さまざまな自動処理を実行できます。特定の投稿にパスワード保護を自動で適用すれば、運用時の手間を減らし、ヒューマンエラーも防げます。カテゴリなどタームの判定を行う場合は、save_postではなくwp_after_insert_postを使うようにしましょう。
運営ルールに応じて、カテゴリや投稿タイプ、カスタムフィールドなどの条件を柔軟に組み合わせて、自動化を活用してみましょう。

