パスワード保護の投稿が一覧にでてこないようにする

パスワード保護「パスワード保護」の機能により、パスワードを入力しなければ見ることのできない投稿を作成することができる。ダッシュボードの投稿画面[公開]-[公開状態]の設定で、通常は[一般公開]となっているところ[パスワード保護]を選択し、任意のパスワードを設定する。テンプレートでは、the_content()によって処理される。非認証の場合は投稿内容のかわりにパスワードを入力するフォームが表示され、認証済の場合は通常どおり投稿内容が表示される。
これらはthe_content()で自動的に処理されるために公式テーマの作成時には気に止めていなかった。このほど私用サイトでパスワード保護が必要になり、改めて仕様を知った。

まず、個別投稿ページ(single.php)でパスワード保護によって非表示になるのはthe_content()とcomments_template()の部分だ。これ以外にギャラリーやカスタムフィールドなどを表示している場合は、明示的にこれらも非表示にする必要がある。認証済かどうかは、post_password_required() で判別することができる。

[PHP]
if ( !post_password_required( $post->ID ) ) :
// パスワード認証時のみ表示したい内容
endif;
[/PHP]

次に、パスワード保護されていても一覧ページ(index.php、archive.php、search.phpなど)では投稿タイトルが表示される。ここに投稿タイトルが表示されないようにしたい。つまりページの存在は知られたくない。それでいて、URLを知っている人には個別投稿ページをパスワード付きで見せたい。
query_posts()でフィルタをかければよいか?と軽く見ていたら、そのようなオプションはなかった。posts_whereというアクションフックを使って、SQLにwhere句に追加する必要があった。
一覧ページでパスワード保護の投稿タイトルを除外したい場合、

[PHP]
add_filter(‘posts_where’, ‘my_posts_where’);
function my_posts_where($where){
global $wpdb;
if(!is_singular() && !is_admin()){
$where .= ” AND $wpdb->posts.post_password = ””;
}
return $where;
}
[/PHP]

ここで is_singular() でないことをチェックしないと、投稿ページで表示されなる。さらに is_admin() でないことをチェックしないと、ダッシュボードで表示されなる。この2点に注意だ。

また、1回パスワードを入力すると次回からはパスワードを入力するフォームが表示されずに、投稿内容が普通に表示される。調べたところ、10日間のCookieが効いている。パスワード保護がほんとに効いているのか?と心配になるユーザもいるだろう。どうにかCookieを短くする方法を思いついた。

[PHP]
add_action(‘after_setup_theme’, ‘my_after_setup_theme’ );
function my_after_setup_theme(){
setcookie(‘wp-postpass_’ . COOKIEHASH, $_POST[‘post_password’], 0, COOKIEPATH);
}
[/PHP]

WordPressのコアソースを検索して、パスワード保護のCookieを設定している箇所を見つけた。after_setup_theme というアクションフックを利用して、これを上書きすることにした。デフォルトでは864000秒(10日間)が設定されているので、0にしてみた。

パスワード保護とは本来はどういった目的で使用するのか?
query_posts()のオプションに追加してもらえると、もうすこし便利なのにな。

3件のコメント

コメントを残す

メールアドレスが公開されることはありません。