2014年11月25日火曜日

パスワード保護されたページを非表示にする / パスワード保護時間の設定方法

RSSフィードや新着情報などでパスワード保護されたページを非表示したい!
ということでいろいろ調べてみました。

それ自体は、パスワード保護の投稿が一覧にでてこないようにするを参考にfunctions.phpに書き書きしたらできました。

でもまぁプラグインで実装したいよねってことで開発してみることに。

でもそれだけだったら味気ないので、ついでにパスワード保護関連の設定もオプションで設定しておきたいものです(実はここの実装で数時間かかってしまった)。

パスワード保護については一旦解除したら、しばらくはロック解除されます。
このあたりの設定ってどうなっているのだろうってことで、いろいろやったのです。

パスワード保護のアイドルタイム設定変更

WordPress 3.4まで(らしい)


パスワード保護の投稿が一覧にでてこないようにするを参考にすればできると思う。

0: 毎回確認
time() + 秒数: 設定した秒数、ページが変更されなければ(リロード含む)、再度パスワードロックかかる

WordPress 3.5以降(少なくても4.0以降は使えない)

を参考によれば、Cookieの値がHash値になったので、従来までの方法ではダメのようです。とはいえ、手持ちのWordPress 4.0と4.0.1では動作しませんでした。
設定したら、全部毎回パスワード要求されてしまう設定になってしまいます。
(まぁ何か別の設定があるのかもしれませんけどね)

add_action('after_setup_theme', 'my_after_setup_theme' );
function my_after_setup_theme(){
    global $wp_hasher;
    setcookie('wp-postpass_' . COOKIEHASH,  $wp_hasher->HashPassword(stripslashes($_POST['post_password'])),  time()+10, COOKIEPATH);
}

で10秒アイドルタイム続いたらロック。

HASH値になっているなら、esc_attrもしておいたらいいんじゃないかな〜とか思ったりします。

WordPress 最新(4.0と4.1で確認)


というわけでチェックすると、下記なら動作しますね。

add_action('after_setup_theme', 'my_after_setup_theme' );
function my_after_setup_theme(){
     setcookie('wp-postpass_' . COOKIEHASH,  stripslashes($_COOKIE['wp-postpass_' . COOKIEHASH]) , time()+10, COOKIEPATH);
}

がベース。
stripslashesについては、get_magic_quotes_gpcがONのときの対策なので実際には場合分けしておいたほうがよさそう。また、Hash値になっているんだから、
     setcookie('wp-postpass_' . COOKIEHASH,  esc_attr(stripslashes($_COOKIE['wp-postpass_' . COOKIEHASH])) , time()+10, COOKIEPATH);

のようにesc_attrをつけておいたほうがいいのかなーとか思ってます。

とりあえずめんどくさがりなので、上記を設定できるプラグインを開発しちゃいました。
現在WordPress.orgのリポジトリ申請中、、、27日に許可を得て公開(公開前にプラグイン無効化オプションを追加しました。やっぱりテストできないとね)
詳細は、プラグイン「WP Hidden Password Protected Pages」の公開!にまとめました(2014年11月27日加筆)

0 件のコメント:

コメントを投稿