2026年6月16日
2026年6月16日
WordPressでパスワード保護ページを作る方法|設定・カスタマイズと守れない範囲
WordPressでは、投稿や固定ページの公開状態を「パスワード保護」にするだけで、パスワードを知っている人だけが本文を読めるページを作れます。プラグインは不要ですが、守られるのは本文と抜粋だけで、画像ファイルやアイキャッチ、タイトルは見える場合がある点に注意が必要です。この記事では、標準機能での設定手順、「保護中:」の表示やフォームの変更、検索結果に出さない設定、そしてこの機能で守れないものと代わりの手段を説明します。
標準機能でパスワード保護を設定する
ブロックエディタでの手順
- 保護したい投稿・固定ページの編集画面を開く
- 右側の設定サイドバーで、公開状態(ステータス)の項目をクリックする
- 「パスワード保護」を選び、パスワードを入力する
- 「公開」または「更新」をクリックする
管理画面の投稿一覧から「クイック編集」を開くと、パスワード欄に直接入力することもできます。複数の記事に同じパスワードを設定したいときは、こちらのほうが早く済みます。
設定後、ログアウトした状態(またはブラウザのプライベートウィンドウ)でページを開くと、本文の代わりにパスワード入力フォームが表示されます。ログイン中の管理者のまま確認すると、編集権限の関係で挙動が分かりにくくなるため、別ブラウザでの確認をおすすめします。サイドバーの項目名や配置はWordPressのバージョンによって変わることがあります(2026年10月現在の手順です)。
正しいパスワードを入れた後の動き
入力されたパスワードは wp-login.php?action=postpass に送られ、正しければ wp-postpass_ で始まる名前のCookieがブラウザに保存されます。Cookieの有効期限は標準で10日間で、その間は同じブラウザから再入力なしで読めます。
ここでつまずきやすいのが、このCookieはサイト全体で1つしかないという点です。記事Aと記事Bに別々のパスワードを設定していると、記事Bのパスワードを入れた時点でCookieが上書きされ、記事Aに戻ると再入力を求められます。複数のページをまとめて見せたい相手がいる場合は、それらのページに同じパスワードを設定するほうが親切です。
表示をカスタマイズする
以下のコードは子テーマの functions.php か、独自の小さなプラグインに追加します。編集前には、ファイルのバックアップを取っておいてください。
タイトルの「保護中:」を外す
パスワード保護した記事のタイトルには、日本語環境では「保護中: 」が前に付きます。この書式は protected_title_format フィルターで変えられます。
add_filter( 'protected_title_format', function ( $format ) {
return '%s'; // 「保護中: 」を付けずタイトルだけにする
} );
%s の部分にタイトルが入るので、'【限定公開】%s' のように書けば別の表記にもできます。ただし、外してしまうと訪問者がリンクを開くまで保護されていることに気づけないため、一覧ページで分かる印を別に付けるかどうかも併せて検討してください。
パスワード入力フォームの文言を変える
フォームのHTMLは the_password_form フィルターで差し替えられます。送信先やフィールド名を変えると認証が通らなくなるため、action の値と post_password という名前はそのまま残します。
add_filter( 'the_password_form', function ( $output, $post = 0 ) {
$post = get_post( $post );
$label = 'pwbox-' . ( empty( $post->ID ) ? wp_rand() : $post->ID );
$output = '<form action="' . esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ) . '" class="post-password-form" method="post">';
$output .= '<p>' . esc_html( 'このページは関係者向けです。お知らせしたパスワードを入力してください。' ) . '</p>';
$output .= '<p><label for="' . esc_attr( $label ) . '">パスワード</label> ';
$output .= '<input name="post_password" id="' . esc_attr( $label ) . '" type="password" spellcheck="false" autocomplete="current-password" size="20" /> ';
$output .= '<input type="submit" name="Submit" value="' . esc_attr( '表示する' ) . '" /></p>';
$output .= '</form>';
return $output;
}, 10, 2 );
見た目の調整だけなら、PHPを触らずにCSSで .post-password-form を装飾する方法もあります。テーマによってはフォームを独自に出力していることがあるので、反映されないときはテーマのテンプレートやテーマ独自のフィルターを確認してください。
Cookieの有効期限を変える
10日間では長すぎる、あるいはブラウザを閉じたら再入力させたい、という場合は post_password_expires フィルターを使います。
add_filter( 'post_password_expires', function ( $expires ) {
return 0; // 0 を返すとブラウザを閉じるまでのセッションCookieになる
// 1日にしたい場合は次の行を使う
// return time() + DAY_IN_SECONDS;
} );
既に発行済みのCookieには影響しません。設定を変えたら、確認用のブラウザのCookieを削除してから試します。
検索エンジンと一覧ページへの出方を調整する
パスワード保護した記事でも、タイトルやURLは公開されています。本文は表示されないためインデックスされても内容は読まれませんが、「保護中:」だけの記事が検索結果やアーカイブに並ぶのは望ましくない場合が多いでしょう。
検索エンジンに登録させないようにするには、wp_robots フィルターで noindex を付けます。
add_filter( 'wp_robots', function ( $robots ) {
if ( is_singular() ) {
$post = get_queried_object();
if ( $post instanceof WP_Post && '' !== $post->post_password ) {
$robots['noindex'] = true;
}
}
return $robots;
} );
SEOプラグインを使っている場合、robots メタタグはプラグイン側が出力していることがあります。その場合は、このコードではなくプラグインの投稿ごとの noindex 設定を使うほうが確実性が高く、二重管理も避けられます。XMLサイトマップに保護記事が含まれていないかも、プラグインの設定とサイトマップの中身で確認してください。
サイト内のトップページ・アーカイブ・検索結果から保護記事を外すには、pre_get_posts で has_password を指定します。
add_action( 'pre_get_posts', function ( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( $query->is_home() || $query->is_archive() || $query->is_search() ) {
$query->set( 'has_password', false );
}
} );
管理画面とメイン以外のクエリを除外しているのは、投稿一覧の管理画面やウィジェットの動作に影響させないためです。
パスワード保護で守れないもの
標準のパスワード保護は手軽な反面、守備範囲は限られています。導入前に次の点を把握しておいてください。
- 画像やPDFなどのファイル:保護した記事に貼った画像やPDFは、
/wp-content/uploads/のURLを知っていれば誰でも直接開けます。資料そのものを守りたい場合、この機能だけでは足りません。 - アイキャッチ画像・カスタムフィールド:本文と抜粋は隠れますが、テーマがアイキャッチ画像やカスタムフィールドの値を出力している場合、それらは表示されることがあります。
- パスワードの保存形式:記事のパスワードはデータベースの
wp_postsテーブル(post_password列)に平文で保存されます。編集権限を持つユーザーやデータベースを見られる人には読めるため、他のサービスと使い回しているパスワードは設定しないでください。 - 人ごとの管理:全員が同じパスワードを共有する仕組みなので、特定の人だけアクセスを取り消す、誰が見たかを記録する、といったことはできません。パスワードを変更すると全員が再入力になります。
- 総当たり対策:パスワード送信の回数制限は標準ではありません。短く推測しやすいパスワードは避け、十分な長さのものを使います。
REST API でも保護は効いており、パスワード保護した投稿の本文は空で返され、保護されていることを示す値が付きます。ただし、タイトルや公開日などは取得できます。
また、ページキャッシュを使っている場合は、パスワード入力後のページがキャッシュされて他の人に見えてしまわないか、ログアウト状態の別ブラウザで確認しておくと安心です。多くのキャッシュプラグインは保護用のCookieがあるリクエストをキャッシュ対象から外しますが、設定やサーバー側のキャッシュによって挙動が異なります。
目的別の代替手段
用途によっては、標準機能より別の方法が向いています。
- 社内向けや制作中のサイト全体を隠したい:サーバーのBasic認証(
.htaccessやサーバー管理画面の「アクセス制限」機能)を使うと、画像ファイルを含めてまるごと保護できます。 - 会員ごとにログインさせたい:WordPressのユーザー登録と会員制プラグインを組み合わせ、ログイン状態や会員レベルで表示を切り替えます。誰がアクセスしたかの管理や、個別の利用停止ができます。
- 本文の一部だけ隠したい:会員制プラグインのショートコードやブロックで、続きを読む部分だけを制限する方法があります。
- ファイルを配布したい:ダウンロード管理プラグインや、ログインユーザーにだけ署名付きURLを発行する仕組みを使います。
パスワード保護は「URLを知られても中身をすぐには読ませない」程度の軽い目隠しと考え、機密性の高い情報には上記の手段を選ぶのが安全です。
まとめ
- 公開状態を「パスワード保護」にすれば、プラグインなしで本文と抜粋を隠せる
- 認証用のCookieはサイト全体で1つで、標準の有効期限は10日間。
post_password_expiresで変更できる - 「保護中:」は
protected_title_format、フォームはthe_password_formフィルターで変えられる。フォームの送信先とpost_passwordは変えない - 検索エンジンや一覧から外すには、noindex と
has_passwordを設定する。SEOプラグイン利用時はその設定を優先する - 添付ファイル、アイキャッチ、カスタムフィールドは守られない。パスワードは平文で保存される
- 機密性が高い情報や人ごとの管理が必要な場合は、Basic認証や会員制プラグインを使う