WordPress
カスタマイズ事例

WORDPRESS CUSTOMIZATION

投稿の詳細ページだけでなく、カテゴリページ(投稿一覧ページ)もパスワード保護の対象にする

WordPressには、固定ページ、投稿ページにパスワード保護できる機能がついています。
特定のユーザーにだけ見せたいコンテンツがあるときにライトな使い方として便利です。
ただ、2つ難点があって、まずひとつが、投稿のカテゴリーページ(アーカイブページ)はパスワード保護できないという点。
どうなるかというと、詳細ページではコンテンツを隠しても一覧では表示されてしまうことになります。
タイトルぐらいなら見せても問題ない、というコンテンツならそれでも構わないのですが、なんにも見せたくない、という場合、アーカイブページにもパスワードロックが必要になります。
2つ目の難点が、パスワード保護は1ページ1ページに設定しなければならないという点。
数十数百ページがあるような場合、1ページずつパスワードを入力していくのは大変な作業ですよね。
 
これらを同時に解決する方法を今回はご紹介します。
ポイントは2つ。

  • 投稿を階層構造にし、第一階層をアーカイブページ代わりに使う
  • Protect the Children!というプラグインを導入

投稿を階層構造にし、第一階層をアーカイブページ代わりに使う

アーカイブページにパスワードをかけられないなら、詳細ページをアーカイブページにしてしまってそれにパスワードをかけてやれ、ということです。
 
さて、手順です。
過去の事例もフル活用します。

  1. 投稿ページ(シングルページ)で一覧表示をするからには、ページネーションもできるようにしないと
    過去の事例の投稿ページ(シングルページ)で何か記事の一覧表示をしてさらにページネーションもするときの注意点に従ってカスタマイズしましょう。
  2. 投稿を階層構造にする
    こちらも過去事例の投稿(post)を固定ページのように階層構造にする投稿(post)を階層構造にしてもURLは階層構造にならない!を解決する( parent-slug/child-slug にする)をおこなって階層構造にします。
  3. 最後に投稿ページのテンプレートをいじって、アーカイブページ扱いの第一階層ページと、詳細ページの第二階層ページの処理を書く
    テーマの single.php ファイルを次のように書きます。

    <?php get_header(); ?>
    
    <div>
    <?php
    while(have_posts()) {
      the_post();
      the_content(); //コンテンツ入力フォームには何も入っていなくても、パスワード入力フォームを出すためだけにこの宣言が必要です
    
      if (!post_password_required()) { // パスワード認証済みなら
        if (is_single('XXX')){ // xxx は第一階層(アーカイブページとする)のページのページID
          $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
          $post_id = get_the_ID();
    
          $the_query = new WP_Query( array(
            'post_status' => 'publish',
            'post_type' => 'post',
            'paged' => $paged,
            ・・・
            'post_parent__in' => array($post_id,)
          ) );
    
          if ($the_query->have_posts()) :
            $html = '';
            while ($the_query->have_posts()) : $the_query->the_post();
    
              //一覧に表示する処理を書きます
    
            endwhile;
            $html .= '</ul></div>';
          else :
            $html = '<div><p>ありません。</p></div>';
          endif;
    
          echo $html;
          ?>
    
          <div class="pnavi">
            <?php //ページリスト表示処理
            global $wp_rewrite;
            $paginate_base = get_pagenum_link(1);
            if(strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()){
              $paginate_format = '';
              $paginate_base = add_query_arg('paged','%#%');
            }else{
              $paginate_format = (substr($paginate_base,-1,1) == '/' ? '' : '/') .
                user_trailingslashit('page/%#%/','paged');
              $paginate_base .= '%_%';
            }
            echo paginate_links(array(
              'base' => $paginate_base,
              'format' => $paginate_format,
              'total' => $the_query->max_num_pages,
              'mid_size' => 1,
              'current' => ($paged ? $paged : 1),
              'prev_text' => '< 前へ',
              'next_text' => '次へ >',
            )); ?>
          </div>
          <?php
          wp_reset_query();
    
        }else{ // 第二階層(詳細ページとなる)のページなら
    
          //普通の投稿ページの処理なので省略
    
        }
      }
    }
    ?>
    </div>
    
    <?php get_footer(); ?>
    

    内容は参考にしてもらって、あとはご自身のやりたい処理を書くようにしてください。
    これで処理そのものは完成です。

    Protect the Children!というプラグインを導入

    処理はできましたので、最後にパスワードを1つ1つの記事に入れていく作業を削減するためにプラグインを導入します。

    Protect the Children!

    このプラグインを有効にして親記事にパスワードを入れると、自動で子記事も同じパスワードで設定することができます。
     
    ふぅ。
    案外長くなりましたが、これで、商品の情報を業者のみに見せ、通常のユーザーには一切の情報を伏せる(一覧すらも見せない)ようなサイトができますね。

【100ウェブ新着情報メルマガ】

WordPressカスタマイズ事例やウェブ制作ノウハウの新着情報、お役立ち情報を
リアルタイムにメルマガ配信!