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; //パスワードチェック終了 ?>
このようにしちゃえば、パスワード入力フォーム以外は何も表示されなくなります。
パスワード保護された投稿のページで本文以外にも非表示にしたい項目がある、というのはけっこう需要あるカスタマイズだと思うんですが、解説されているブログが少なかったので書いてみました。
どなたかのお役に立てれば幸いです。