サポート » 使い方全般 » 子カテゴリーが表示されない。

  • 解決済 youcancan

    (@youcancan)


    wordpress、phpに詳しい方教えてください。
    投稿タイプabcを作り、親カテゴリーと子カテゴリーを作りました。
    pre_get_postsを使いカテゴリーid 13のテンプレートcategory-13.phpを表示させています。
    親カテゴリーも子カテゴリーも同じテンプレートを使いたいのですが、
    親カテゴリー(id 13)は問題なく、子カテゴリーが404になり表示されません。
    子カテゴリーを表示するにはどうすればいいのでしょうか。
    どなたか助けてけてください。
    よろしくお願いします。

    functions.php

    function change_posts_per_page($query) {
     if( is_admin() || ! $query->is_main_query() ){
         return;
     }
    
    if ( $query->is_category(13) ) {
         $query->set( 'posts_per_page', '10' );
         $query->set( 'post_type','abc' );
         return;
     }
     
    }
    add_action( 'pre_get_posts', 'change_posts_per_page' );
12件の返信を表示中 - 1 - 12件目 (全12件中)
  • is_category(13)
    

    is_category( array( 13, 子カテゴリーのID ) )
    

    では?

    トピック投稿者 youcancan

    (@youcancan)

    ご教授ありがとうございます。
    今後、子カテゴリーが増える可能性があるので、できれば他の方法でできないでしょうか。

    力技でやるなら

    get_categories( array( 'child_of' => 13 ) )
    

    という呼び出しで子カテゴリー(オブジェクト)の配列を取得して、各オブジェクトから ID だけを並べた配列を作る、でしょうか。

    https://wpdocs.osdn.jp/関数リファレンス/get_categories

    • この返信は7年、 1ヶ月前にgblsmが編集しました。

    別の考え方として、カテゴリーの代わりにカスタム分類(カスタムタクソノミー)を使うのはいかがですか。
    そうすれば category-13.php の代わりに、カスタム分類アーカイブの taxonomy-mytax.php や taxonomy-mytax-myterm.php というテンプレートが使えます。
    (mytax はカスタムタクソノミーのスラッグ、myterm はタームのスラッグ。)

    https://wpdocs.osdn.jp/テンプレート階層#Custom_Taxonomies_display

    わりと意図が不明なのではないでしょうか。
    カスタム投稿タイプabcは、archive-abc.phpで呼び出せると思うんですが。
    abcの記事を振り分けるためのカテゴリーなら、@gblsm氏の提案がスマートかもしれません。

    いろんな考え方があるんでしょうが、カスタム投稿はあるカテゴリー専用のpostだと思います。
    あまり正確じゃないのかもしれませんが、この場合の専用カテゴリーが、親となり、子がカスタム分類に該当するんだと思います。カスタム分類のタームは孫ということになりますか。

    カスタム投稿 神社仏閣には、カスタム分類 神社と寺院があり、神社はtag形式で祭神名、寺院は階層形式で各宗派が入るみたいな感じ。あとカスタム分類 都道府県があっても便利かも。

    神社仏閣なので、いくつかの定型の情報の入出力用にカスタムフィールドとして、所在地、創建年を作るような形で作るものかなと思います。

    トピック投稿者 youcancan

    (@youcancan)

    gblsmさん、ありがとうございます。

    https://wpdocs.osdn.jp/関数リファレンス/get_categories
    を見たのですが、よく理解できなかったので、現状存在するカテゴリーを下記のように登録しようと思ったのですが、子カテゴリー(カテゴリーid 30)が表示されませんでした。
    どこが間違っているのか教えていただけないでしょうか。

    function change_posts_per_page($query) {
     if( is_admin() || ! $query->is_main_query() ){
         return;
     }
    
    if ( $query->is_category(13) ) {
         $query->set( 'posts_per_page', '10' );
         $query->set( 'post_type','abc' );
         return;
     }
    if($query->is_category( '30' )){
         $query->set( 'posts_per_page', '10' );
         $query->set( 'cat','30' );
         $query->set( 'post_type','abc' );
         return;
     }
     
    }
    add_action( 'pre_get_posts', 'change_posts_per_page' );

    oisitさん、ありがとうございます。
    初心者なので、よくわかっていないのだと思います。
    一番良い方法がわからないのですが、子カテゴリーをそれぞれのページに振り分けたいだけなのですが。

    is_
    categoryとin_categoryの違いや使い方、条件分岐、複数指定、子孫カテゴリがある場合などなど

    2015年の記事の様ですが。

    それぞれのページというのが割といろいろ解釈できそうです。ページングなのか、一つのアーカイブなのか。

    自分もコピー職人ですが、return入れちゃうとそこで終わりなんじゃないですかね。
    たとえば最初の条件はadminかmeain_queryならば、return この先は実行しないということだったと思います。なので条件が合えば、次のifの処理はしない。

    もしカテゴリー13なら処理して終わり<–13だったので終わり
    もしカテゴリー30なら処理しておわり この条件は先の条件が終わってるので処理されない。

    カスタム投稿abcはカテゴリー13の話題専用。つまりカテゴリー13のpostであるということではないかと。

    あとカテゴリーが30ならカテゴリーが30の記事をしぼりこむ必要があるんでしょうか。

    文章作るのが下手なので思い付きの羅列ですいません。

    LABE

    (@latobeam)

    $query->set( 'cat','30' ); の1行が不要な気がします。

    return の使い方については問題ないと思います。

    returnはOKですか。勉強になりました。

    トピック投稿者 youcancan

    (@youcancan)

    oisit さん、LABE さん
    ありがとうございます。

    $query->set( 'cat','30' );を取ってみましたが、親カテゴリー(id30)は表示されるのですが、子カテゴリーが表示されません。

    教えていただいた
    「is_categoryとin_categoryの違いや使い方、条件分岐、複数指定、子孫カテゴリがある場合などなど」
    を参考にさせて頂き、

    if (is_category('30') || cat_is_ancestor_of(30, $cat)) {
         $query->set( 'posts_per_page', '21' );
         $query->set( 'post_type','abc' );
         return;
     }

    と書いてみたんですが、親カテゴリー(id30)は表示されるのですが、子カテゴリーが表示されません。
    お手数ですが、どこが悪いかアドバイス頂けませんでしょうか。

    検証してみました。下記のコードで正しく表示されましたよ。

    function change_posts_per_page( $query ) {
      if ( is_admin() || ! $query->is_main_query() ) {
        return;
      }
    
      // 親カテゴリーの ID: 13
      // このアーカイブページは子カテゴリー(ID:30)の投稿も一緒に表示。
      if ( $query->is_category( 13 ) ) {
        $query->set( 'posts_per_page', 3 );
        $query->set( 'post_type', 'abc' );
        return;
      }
    
      // 子カテゴリーの ID: 30
      // 子カテゴリーの投稿だけを表示するアーカイブ。
      if ( $query->is_category( 30 ) ) {
        $query->set( 'posts_per_page', 2 );
        $query->set( 'post_type', 'abc' );
        return;
      }
    }
    add_action( 'pre_get_posts', 'change_posts_per_page' );
    
    トピック投稿者 youcancan

    (@youcancan)

    何度やってもうまくいかず、なかなか時間がなく返信ができませんでした。
    教えていただいたのに、返信が遅くなってしまい申し訳御座いません。

    gblsmさんのやり方で、なんとか子カテゴリーも表示できるようになりました。
    表示されなかったのは、function.phpにパーマリンクのcategoryを消す設定がされていたようで、それが影響していたようです。
    前任者が設定をしていたようで、全然気付きませんでした。
    gblsmさん、oisit さん、LABE さん、ありがとうございました。

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • トピック「子カテゴリーが表示されない。」には新たに返信することはできません。