【特定ページ・サブディレクトリ可】パスワード保護ページをカスタマイズする

【特定ページ・サブディレクトリ可】パスワード保護ページをカスタマイズする

2021年7月31日

まほろば@mahoroba148です。

WordPressではパスワードによる閲覧制限(以降パスワード保護)をすることができます。

管理画面で簡単にできるパスワード保護ですが、デフォルトのままだとどうも味気ない。

しかもタイトルには必ず「保護中:」が表示されます。

せっかくキレイに整えたWebサイト、サイトにあった表現に変えたいですよね。

今回はパスワード保護ページの表示をカスタマイズしていきましょう。

なお、特定の保護ページのみ変更も可能です。

■参考ページ

WordPressのPassword保護ページをオリジナルに変更
https://qiita.com/gorochan/items/89627bdab0b5f8f8ab74

【WordPress】パスワードの文言をカスタマイズしたら送信後エラーになる時の対処法
https://upanda.life/web/wordpress/pass/

【はじめに】必ずバックアップをとろう

function.phpを操作します。

fuction.phpの編集を失敗するとエラーが表示されたり画面が真っ白になったり最悪サイトが閲覧できなくなります。

必ずバックアップを取り、検証環境などでテストを行ってから本番環境に実装しましょう。

操作に自信がない方は専門家にお任せしましょう。

「保護中:」を削除する

function.phpに追記します。

add_filter('protected_title_format', 'remove_protected');
function remove_protected($title) {
return '%s';
}

保護ページの文章を変更する

function.phpに追記します。

function my_password_form() {
return
'<p>ここにテキストを入れる<p>
<form class="post_password" action="' . site_url() . '/wp-login.php?action=postpass" method="post">
<input name="post_password" type="password" size="24" />
<input type="submit" name="Submit" value="' . esc_attr__("パスワード送信") . '" />
</form>';
}
add_filter('the_password_form', 'my_password_form');

上記コードの

<p>ここにテキストを入れる<p>

を任意の文章に編集してください。

【解説】site_urlにするのがポイント

紹介されているサイトの多くはsite_urlではなくhome_urlが使われています。

home_urlですとWordPressをサブディレクトリにインストールしている場合「お探しのページが見つかりません」と表示されてしまいます。

例)hogehoge.jp/wp

home_urlはWebサイトのURLを表示します。

しかし実際にはWordPressがインストールされているディレクトリを参照しなければいけません。

管理画面で以下の項目を確認してみてください。

設定>一般

  • WordPress アドレス (URL) → site_url
  • サイトアドレス (URL) → home_url

サブディレクトリにインストールしている場合はWordPress アドレス (URL)を変更しているはずです。

ちなみに、サブディレクトリにインストールしていない方もsite_urlで動作します。

一応、原理が違うことだけ覚えていただければOKです。

特定のページを指定する場合

特定のページを指定するにはif条件分岐を使います。

特定ページに表示する文章→その他のページで表示する文章の順番で指定していきます。

なお、下記のコードは固定ページの場合です。

function my_password_form() {
if(is_page('ページID')){
return
'<p>特定の保護ページに表示される文章<p>
<form class="post_password" action="' . site_url() . '/wp-login.php?action=postpass" method="post">
<input name="post_password" type="password">
<input type="submit" name="Submit" value="' . esc_attr__("送信") . '" />
</form>';
}
else{
return
'<p>このコンテンツはパスワードで保護されています。閲覧するには以下にパスワードを入力してください。<p>
<form class="post_password" action="' . site_url() . '/wp-login.php?action=postpass" method="post">
<input name="post_password" type="password" size="24" />
<input type="submit" name="Submit" value="' . esc_attr__("確定") . '" />
</form>';
}
}
add_filter('the_password_form', 'my_password_form');

上記コードの「ページID」を書き換えてください。

if(is_page('ページID')){

投稿のパスワード保護ページを変更したい場合

if条件分岐を固定ページから投稿に変更します。

具体的には is_page()is_single()に書き換えます。

if(is_single('ページID')){

あとは固定ページと同じように「ページID」を書き換えればOKです。

ページIDの書き間違えに気を付けて

本番環境へ移す際にページIDの確認を忘れずに行いましょう。

保護ページを新しく作成する場合はページIDが変わります。

検証環境のページIDのままですと適用されませんのでご注意ください。

管理画面のURLを変更している場合

セキュリティ系のプラグインなどで管理画面のURLを変更している場合には、さらに変更が必要です。

まずはログインURLを確認しましょう。

例)hogehoge.jp/login1234

ログインURLが確認できたら以下のコードをログインURLにあわせて変更します。

変更前

<form class="post_password" action="' . site_url() . '/wp-login.php?action=postpass" method="post">

変更後

<form class="post_password" action="' . site_url() . '/login1234?action=postpass" method="post">

「wp-login.php」の部分がログインURLの末尾と同じになりました。

cookieの保存期限を指定する

閲覧制限をかけていても一度パスワードを入力するとcookieが残っている限り閲覧することができてしまいます。

たとえば、会員限定のページなのに退会した会員の方も閲覧できてしまうと困りますよね。

そのためcookieの保存期限を指定しましょう。

function.php

function custom_postpass_time() {
    require_once ABSPATH . 'wp-includes/class-phpass.php';
    $hasher = new PasswordHash( 8, true );
    setcookie( 'wp-postpass_' . COOKIEHASH, $hasher->HashPassword( wp_unslash( $_POST['post_password'] ) ), time() + DAY_IN_SECONDS, COOKIEPATH );
    wp_safe_redirect( wp_get_referer() );
    exit();
}
add_action( 'login_form_postpass', 'custom_postpass_time' );

保存期限は下記で指定しています。

DAY_IN_SECONDSを任意のものに書き換えてください。

setcookie( 'wp-postpass_' . COOKIEHASH, $hasher->HashPassword( wp_unslash( $_POST['post_password'] ) ), time() + DAY_IN_SECONDS, COOKIEPATH );
  • MINUTE_IN_SECONDS→1分
  • HOUR_IN_SECONDS→1時間
  • DAY_IN_SECONDS→1日
  • WEEK_IN_SECONDS→1週間
  • MONTH_IN_SECONDS→1ヶ月

さらに上記の単語の前に「数字 * 」をつけることで「3日」「2週間」というように細かく設定することも可能です。

※*(アスタリスク)は×(かける)と考えていただくとわかりやすいです

  • 3 * DAY_IN_SECONDS→3日
  • 2 * WEEK_IN_SECONDS→2週間
  • 60 * MINUTE_IN_SECONDS→1時間(HOUR_IN_SECONDS)

おわりに

今回はパスワード保護ページの表示をカスタマイズしました。

個人的にはセキュリティ系プラグインによる管理URLの変更が引っかかりポイントでした。

お気を付けくださいませ~