WordPress 個別記事に対する「パスワード保護」を利用する関数

/ WordPress / Comment[0]

WordPressにはデフォルトで記事をパスワードで保護して限定公開する機能があります。
(執筆時の最新バージョン:4.7.3)
デフォルトのテーマや対応したテーマを利用している場合は、投稿画面でパスワードを設定すれば記事内容が非表示になり、投稿記事ページにパスワードの入力フォームが表示されるでしょう。しかし、通常の基本ループではパスワード保護は利用できません。一部テンプレートではパスワード保護機能に対応していない場合もあります。

この記事ではWordPressのコア機能であるパスワード保護を利用する方法を書きます。

WordPressのパスワード保護が効かない

一部のテンプレートではパスワード保護に対応した条件分岐を書いていない場合があります。 その為、管理画面でパスワードを設定してもパスワード保護が効かないということが起こります。 管理画面上にはタイトルの頭に「保護中」という文言が入っていても、通常通り記事にアクセスできてしまうのです。

解決するには少しテンプレートを弄る必要があります。次のセクションで解説します。

パスワード保護を利用する関数

パスワード保護を利用するためには、以下の2つの関数を利用します。

  • post_password_required()
  • get_the_password_form()

上記二つの関数は日本語版 公式の関数リファレンスに載っていなかったので結構探しました。(post_password_required()の詳細ページはあった)

post_password_required()

記事がパスワード保護中か否かを判定する関数です。引数には投稿IDまたは投稿オブジェクトを指定します。
パスワード保護がかかっている場合はtrue、掛かっていない又はパスワードクッキーを保持している場合はfalseを返します。

https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/post_password_required

get_the_password_form()

パスワードの入力フォームを出力する関数です。引数には投稿IDまたは投稿オブジェクトを指定します。

https://developer.wordpress.org/reference/functions/get_the_password_form/

下記の例では、single.phpのループ中でpost_password_required()でパスワード保護の有無を判定します。パスワード保護が有効である場合、get_the_password_form()でパスワード入力フォームを出力し、保護無しの場合はthe_content();を出力しています。

<?php
while( have_posts() ): the_post();
  if( post_password_required( $post->ID ) ):
    echo get_the_password_form( $post->ID );
  else:
    the_content();
  endif;
endwhile;
?>

パスワード入力フォームをカスタマイズ

さて、フォームが無事に出現するようになったところで、色々カスタマイズしたいところです。

  • 記事タイトルの頭に自動で付く「保護中」を削除する
  • 「このコンテンツはパスワードで~」テキストを変更する
  • Cookieの期限を変える

上記の3つのカスタマイズ方法は下記のサイトで同じように書かれていますのでざっくりと要点を引用させていただきます。

記事タイトルの頭に自動で付く「保護中」を削除する方法

functions.phpに下記を追記します。

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

「このコンテンツはパスワードで~」テキストを変更する

functions.phpに下記を追記します。get_the_password_form()で出力されるソースを改変できます。

function my_password_form() {
  return
    '<form class="post_password" action="' . home_url() . '/wp-login.php?action=postpass" method="post">
    <input name="post_password" type="password">
    <input type="submit" name="Submit" value="' . esc_attr__("送信") . '">
    </form>';
}
add_filter('the_password_form', 'my_password_form');

Cookieの期限を変える

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() + HOUR_IN_SECONDS, COOKIEPATH );
    wp_safe_redirect( wp_get_referer() );
    exit();
}
add_action( 'login_form_postpass', 'custom_postpass_time' );

HOUR_IN_SECONDSの部分に秒数*を指定することでクッキーの賞味期限を変更できます。

*WordPressのコアで定義されている下記の定数を利用することも可能です。

define( 'MINUTE_IN_SECONDS', 60 );
define( 'HOUR_IN_SECONDS',   60 * MINUTE_IN_SECONDS );
define( 'DAY_IN_SECONDS' ,   24 * HOUR_IN_SECONDS   );
define( 'WEEK_IN_SECONDS',    7 * DAY_IN_SECONDS    );
define( 'YEAR_IN_SECONDS',  365 * DAY_IN_SECONDS    );

「7200」や「2 * HOUR_IN_SECONDS」とも指定することができます。

関連記事

コメント

:
:
:
:
:
管理人のみ表示を許可