WordPressでパスワード保護している投稿ページの本文以外も非表示にする方法
2015.08.02
クライアントへの確認などでパスワード保護を利用することがありますが、その際に困る点として
・the_content 以外の部分は表示されてしまう
・記事一覧ではパスワード保護されている投稿も表示される
この2点があります。
今回は、前者の問題を解決する方法をご紹介します。
後者のカスタマイズは「WordPressでパスワード保護している投稿を一覧から除外する方法」をご覧ください。
やりたいこと
WordPressの設定で、公開状態を「パスワード保護」にした記事の記事ページで、the_content以外の部分も非表示にしたい。
解決方法
下記のようなコードでタイトルと本文を表示させているとします。
<article> <header> <h1><?php the_title(); ?></h1> </header> <div><?php the_content(); ?></div> </article>
それを、下記のように書き換えます。
<?php if( !post_password_required( $post->ID ) ) : //パスワードが不要、あるいはパスワードが正しいとき ?> <article> <header> <h1><?php the_title(); ?></h1> </header> <div><?php the_content(); ?></div> </article> <?php else: //パスワードが必要あるいはパスワードが間違っているとき ?> <?php echo get_the_password_form(); ?> <?php endif; //パスワードチェック終了 ?>
すると、タイトルと本文がともに非表示になります。
順番に説明していきます。
post_password_required関数は、投稿がパスワードを必要としているかどうかをチェックします。必要としている場合にtrueを返すので、それを利用して、パスワードが必要な投稿と不要な投稿を分岐させます。
本来であれば、the_contentがパスワード保護かどうかをチェックしているので、パスワードが必要なときはパスワード入力フォームが表示されるのですが、今回はパスワードが必要なときはthe_contentを呼び出していないので、パスワード入力フォームを表示させる必要があります。
get_the_password_formは、パスワード入力フォームのHTMLテキストを返しますので、それをechoして表示させます。
上記のコードではタイトルと本文を非表示にしますが、もうページごと表示させなくてもいいよ!という場合は、
<?php if( !post_password_required( $post->ID ) ) : //パスワードが不要、あるいはパスワードが正しいとき ?> <?php get_header(); ?> <div id="main"> <div class="content"> <?php while ( have_posts() ) : the_post(); ?> <article> <header> <h1><?php the_title(); ?></h1> </header> <div><?php the_content(); ?></div> </article> <?php endwhile; ?> </div> <?php get_sidebar(); ?> </div> <?php get_footer(); ?> <?php if( !post_password_required( $post->ID ) ) : //パスワードが不要、あるいはパスワードが正しいとき ?> <?php echo get_the_password_form(); ?> <?php endif; //パスワードチェック終了 ?>
このようにしちゃえば、パスワード入力フォーム以外は何も表示されなくなります。
パスワード保護された投稿のページで本文以外にも非表示にしたい項目がある、というのはけっこう需要あるカスタマイズだと思うんですが、解説されているブログが少なかったので書いてみました。
どなたかのお役に立てれば幸いです。