【WordPress】Advanced Custom Fields カスタム投稿でパスワード保護が効かない状態の対策

espa

2016年11月19日 17:15

WordPressでカスタム投稿をするための人気プラグイン「Advanced Custom Fields」。
PostTypeを作る「CPT UI (Custom Post Type User Interface)」と合わせて便利に使っているが、デフォルトだと、投稿画面にある「パスワード保護」が効かないというか、機能しないというか、パスワード入力フォームが出てこないので、その対処方法。
WordPressで普通の「投稿」や「固定ページ」だと当たり前に使える機能、「パスワード保護」。
これがCPT UIと「Advanced Custom Fields」を使った「カスタム投稿」を使うと全く機能しないようで・・・。


これを解決する方法。

テンプレートファイルにパスワード判定を書き足す


通常の投稿や固定ページ(page.phpやsingle.php)ではパスワード保護の記事かどうかを自動で判別しているっぽいのですが、
CPT UIを使うとこの自動判定が機能しないようなので、テンプレートファイルにその部分を書き足す必要があります。

CUP UIでカスタム投稿を設定したら、
single.phpを複製して、single-hogehoge.phpを作ります。
(「hogehoge」の部分は、CPT UIで設定した「投稿タイプスラッグ」と同じもの)

テンプレートphpの詳細は省いて、中身はざっくりとこうなっているとします。

<?php get_header(); ?>

<article>
 <header>
  <h1><?php the_title(); ?></h1>
 </header>
 <div><?php the_content(); ?></div>
</article>

<?php get_footer(); ?>


通常の投稿や固定ページにパスワード保護を設定した場合、

 <div><?php the_content(); ?></div>

この部分が非表示になり、替わりにパスワード入力フォームが表示されます。

が、CPT UIではそれを自動でやってくれないので、

<?php get_header(); ?>

<article>
 <header>
  <h1><?php the_title(); ?></h1>
 </header>

<?php if( !post_password_required( $post->ID ) ) : ?>

 <div><?php the_content(); ?></div>(←実際にはカスタム投稿の内容全部)

<?php else: ?>
 <?php echo get_the_password_form(); ?>
<?php endif; ?>


</article>

<?php get_footer(); ?>

と書き足します。

ページのタイトルもパスワード保護の中に入れたい場合は、

<?php get_header(); ?>

<?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; ?>


<?php get_footer(); ?>

このように全体を条件文で囲えばOK。

通常の投稿もこの方法でページタイトルを隠せる


通常の投稿や固定ページでも、パスワード保護の場合はタイトルを表示したくない!という場合、

<?php get_header(); ?>

<?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; ?>


<?php get_footer(); ?>

こう囲ってしまえば、ごっそりパスワード保護されます。


「保護中:」の表記を削除する方法とパスワードの保持期間を短くする方法


本題とは離れますが、WordPressのパスワード保護を使う場合、この二つはお決まりのように設定する事になるのでメモ。

「保護中:」の表記を消す方法


WordPressテーマフォルダ内のfunctions.phpに、

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

と書き加えます。

パスワードの保持期間を短くする方法


WordPressのデフォルトだと、パスワードは10日間もブラウザに保持されるようなので、これを任意の時間に変更します。
これもWordPressテーマフォルダ内のfunctions.phpに、

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' );
( ←横スクロールできます→ )
と書き加えます。

WordPress3.7以降なら、

function custom_post_password_expires() {
  return time() + HOUR_IN_SECONDS ;
}
add_filter('post_password_expires', 'custom_post_password_expires' );

これで同じ事ができます。

ここでは例として'HOUR_IN_SECONDS'(1時間)と設定していますが、

MINUTE_IN_SECONDS
HOUR_IN_SECONDS
DAY_IN_SECONDS
WEEK_IN_SECONDS
YEAR_IN_SECONDS

このように好きな期間を設定できるようです。
もちろん数値(ミリ秒)表記でもOK。

※functions.phpを書き換える場合は念のため事前にバックアップを!

パスワード保護に設定したカスタム投稿を一覧に出さない設定


カスタム投稿を使っている場合、一覧表示も使う事が多いと思いますが、その際にパスワード保護にした投稿を一覧に出したくない場合の記述方法。
$args = array(
  'post_type' => 'item',
  'posts_per_page' => -1,
  'post_status' => 'publish',
  'has_password' => false,
  'orderby' => 'menu_order',
);

これでパスワード保護の投稿は出てこなくなります。

参考にしたサイト



WordPressでパスワード保護している投稿ページの本文以外も非表示にする方法 | motoyamayuki.com
http://motoyamayuki.com/blog/2015/08/02/post_password_required_exclusion_content/

WordPress – 保護ページタイトルから「保護中」を削除 | technolog.jp
http://technolog.jp/website/cms/5168

wordpressのパスワード保護で、保持期限をfunctions.phpとアクションフックで変更する | Qiita
http://qiita.com/koh-taka@github/items/5732f34abb2483ddc675

WORDPRESSでパスワード保護している投稿を一覧から除外する方法 | MOTOYAMAYUKI.COM
http://motoyamayuki.com/blog/2015/07/22/has_password_exclusion_list/
関連記事
違う案件でもコピペで使い回しOKな「.htaccess」でのURL正規表現(リダイレクト)
WEBコーディング中はcssファイルの読み込みにタイムスタンプ識別子を付けるとキャッシュ問題が楽
WP Plugin 【Custom CSS and JS】 のパスをテーマフォルダに通しておくと便利
PCサイトをモバイル端末(スマホ・タブレット)で表示すると一部の文字が大きくなってしまう場合の対処法
【WordPress】Advanced Custom Fields カスタム投稿でパスワード保護が効かない状態の対策
安くて確実(安全)なレンタルサーバー&ドメイン取得の組み合わせは?
【2015】常用漢字と人名用漢字一覧【Webフォントサブセット用】
Share to Facebook To tweet