カスタム投稿タイプを作成するものの、一覧ページだけで記事詳細ページがいらなかったり、その逆もあったりするかと思います。その際にどの様に設定すればよいのか考察しました!

全ての項目での注意点
functions.phpを編集します。間違えると真っ白の画面になってしまうので、あらかじめバックアップをとっておいてください(^^) また、編集が反映されないばあいは、一度管理メニューからパーマリンクを更新してみてください♪

必要箇所が探しやすいように表示まとめました。それれぞれ「項目へジャンプ♪」から飛べます。

No アーカイブ
一覧を出力
詳細記事
を出力
固定ページ
から呼び出し
参照部分へのリンク
方法① 項目へジャンプ♪
方法② 項目へジャンプ♪
方法③ 項目へジャンプ♪


カスタム投稿タイプの登録の仕方はこちらの記事をお読みください♪

方法①:詳細&アーカイブは生成せず、固定ページから呼び出す場合

概要

  • 管理画面から記事を登録でき、固定ページなどで呼び出して出力できます。
  • archive-case.phpで出力されるアーカイブページ、single-case.phpで出力される詳細ページはありません。
  • 投稿画面からも「パーマリンク」や「表示」というリンクが消えます。
  • page-case.phpなどで固定ページで呼び出して使用します。
  • 固定ページのスラッグとカスタム投稿タイプのスラッグが同じでも大丈夫です(この場合case)。
固定ページの作成例
「実績一覧」という固定ページを/case/というスラッグで作成した場合、page-case.phpというテンプレートファイルが適用されます。
page-case.phpに出力したい内容を記載し、テーマフォルダにアップすればOKです。

ただ、詳細ページのurlに直でアクセスすると、index.php内容が表示されます。(アーカイブページは404表示になります。)
気になる場合はadd_filterで以下のリライトルールを追加すると404ページを表示させられます♪

functions.php

add_filter( ‘case_rewrite_rules’, ‘__return_empty_array’ );
//caseにはカスタム投稿タイプのスラッグを入れます。

コード

register_post_typeのarrayの値に以下を追加します。

  • 'show_ui' => true, //UIを生成させる

次の値は初期値に戻す記述ですので、削除するか初期値の値を入れればOKです♪

  • 'public' => false, //投稿タイプをパブリックにしない(初期値:false)
  • 'has_archive' => false, //アーカイブを有効にしない(初期値:false)

functions.php

function create_posttype() {
 register_post_type( 
  'case',
  array(
  'label' => '実績一覧',
  //'public' => false,//投稿タイプをパブリックにするか(初期値:false)
  //'has_archive' => false, //アーカイブを有効にするか(初期値:false)
  'show_ui' => true, //UIを生成するか(初期値:public引数の値)
  )
 );
}

方法②:詳細ページは生成するが、アーカイブ一覧は生成しない場合

概要

  • 管理画面から記事を登録でき、固定ページなどで呼び出して出力できます。
  • 詳細ページはsingle-case.phpで出力をカスタマイズできます。
  • archive-case.phpで出力されるアーカイブ一覧はありません。
  • page-case.phpなどで固定ページで呼び出して使用します。
  • 固定ページのスラッグとカスタム投稿タイプのスラッグが同じでも大丈夫です(この場合case)。
固定ページの作成例
「実績一覧」という固定ページを/case/というスラッグで作成した場合、page-case.phpというテンプレートファイルが適用されます。
page-case.phpに出力したい内容を記載し、テーマフォルダにアップすればOKです。

コード

register_post_typeのarrayの値に以下を追加します。

  • 'public' => true, //投稿タイプをパブリックにする

  • 次の値は初期値に戻す記述ですので、削除するか初期値の値を入れればOKです♪

    • 'has_archive' => false, //アーカイブを有効にしない(初期値:false)
    • 'show_ui' => true, //UIを生成する(初期値:public引数の値)

    functions.php

    function create_posttype() {
     register_post_type( 
      'case',
      array(
      'label' => '実績一覧',
      'public' => true,//投稿タイプをパブリックにするか(初期値:false)
      //'has_archive' => false, //アーカイブを有効にするか(初期値:false)
      //'show_ui' => true, //UIを生成するか(初期値:public引数の値)
      )
     );
    }
    

    方法③:アーカイブ一覧は生成するが、詳細ページをさせない場合

    どうもドンピシャで詳細ページだけを生成させない方法は無さそうでした。。。
    結構需要あると思うのですが。 以下の2つの方法で対応するしかないのかなぁと思います。

    A:この記事の1番最初で解説している方法①で対応する。

    固定ページを別途作らないといけませんが、スッキリしてわかりやすい方法かと思います。

    詳細&アーカイブは生成せず、固定ページから呼び出す場合

    B:詳細ページはリダイレクトか404にさせる

    register_post_typeのarrayの値に以下を追加します。

    • 'public' => true, //投稿タイプをパブリックにする
    • 'has_archive' => true, //アーカイブを有効にする

    次の値は初期値に戻す記述ですので、削除するか初期値の値を入れればOKです♪

    • 'show_ui' => true, //UIを生成する(初期値:public引数の値)

    functions.php

    function create_posttype() {
     register_post_type( 
      'case',
      array(
      'label' => '実績一覧',
      'public' => true,//投稿タイプをパブリックにするか(初期値:false)
      'has_archive' => true, //アーカイブを有効にするか(初期値:false)
      //'show_ui' => true, //UIを生成するか(初期値:public引数の値)
      )
     );
    }
    

    このままだと詳細ページも表示されるので、詳細へのアクセスはアーカイブ一覧ページへリダイレクトさせます。

    functions.php

    add_action( 'template_redirect', 'my_redirect' );
    function my_redirect() {
      if(is_singular('case')){//caseの詳細ページへのアクセスの場合
        $url = home_url('/case/', 'http'); //caseの一覧へリダイレクト
        wp_safe_redirect( $url, 301 );
        exit();
      }
    }
    

    リダイレクトではなく、404にする場合は以下の記述にします。

    functions.php

    add_filter( 'case_rewrite_rules', '__return_empty_array');
    //caseの部分にはカスタム投稿タイプのスラッグをいれます。
    

    おまけ:タクソノミーページを出力させない

    タクソノミーページを出力させないのも同じで、register_taxonomyのarrayに以下を記述します(^^)

    • 'public' => false, //タクソノミーをパブリックにしない
    • 'show_ui' => true, //UIを生成する

    functions.php

    register_taxonomy(
      'case-cat',
      'case',
      array(
       'label' => 'カテゴリー',
       'public' => false,//タクソノミーをパブリックにするか(初期値:true)
       'show_ui' => true,//UIを生成するか (初期値:public引数の値)
      )
     );
    

    タクソノミーページに直接アクセスするとindexが表示されるので、気になる場合は404にしてください(^^)

    functions.php

    add_filter( 'case-cat_rewrite_rules', '__return_empty_array');
    //case-catの部分はタクソノミーのスラッグをいれます。
    

    おわりに

    FAQの一覧ページなど、一覧にタイトルも本文もすべて出力させるので詳細ページが不要だったりすることって結構よくあると思うのです。
    アーカイブページのみを生成する方法は見つけられませんでしたが、固定ページで呼び出す方法が一番スマートかなと思います(^^)
    良い方法が無いかいつか探そうと思っていて、今回調べてみて結局なかったという、、、

    どなたかの参考になれば幸いです



    参考にさせていただいたサイト:
    カスタムタクソノミーのアーカイブページやカスタム投稿ページを非表示にする | テクニカルノート