質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.10%

「親カテゴリー一覧 > 子カテゴリー一覧 > 投稿記事タイトル一覧」をスマートに表示させたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,962

「親カテゴリー一覧 > (親に属する)子カテゴリー一覧 > (子カテゴリに属する)投稿記事タイトル一覧」をするために、下記の記述にて実行しております。
現在、トップページ(front-page.php)にて親カテゴリーの表示、カテゴリーページ(category.php)にて子カテゴリーの表示はうまく行っています。
しかし、「投稿記事タイトル一覧」となると、(下記参照のcategory.phpでは)うまくいかず、カテゴリーIDを振ったcategory-ID.php(category-21.phpなど)で対応しています。
ただ、これだと、現在だけでも親が13個、子がそれぞれ4〜5個あるため、今後カテゴリー名が新規追加された場合、いちいち該当カテゴリーテンプレートを作らねばならずCMSとして現実的ではありません。
うまいやり方があればご教授いただきたくお願い致します。

【希望する表示】
たとえば、
〔親カテゴリー(トップページに表記)〕
・A
・B
・C
Aをクリックすると下記に遷移

〔親カテゴリーAに属する子カテゴリーページ〕
タイトルA
・A1
・A2
・A3

子カテゴリーをクリックすると、記事一覧に遷移
タイトルA1
・A1に属する記事タイトル1
・A1に属する記事タイトル2
・A1に属する記事タイトル3

そしてそれぞれクリックすると個別記事を表示する、といった具合です。

HOME >> タイトルA >>  タイトルA1 >> A1に属する記事タイトル1
上記のようなパンくずリストを作成した場合、「タイトルA」のページでは、A1,A2,A3を表示してくれますが、タイトルA1では属する記事タイトルを列記したいのですが、何も表示してくれません(タイトルも親カテゴリーAのまま)。
以上は、category.phpのみを使用した場合ですが、強制的にcategoy-21.phpなどのID参照のテンプレートを使用すると、子カテゴリー選択時属する記事一覧が表示されるようになっていますが、カテゴリーの数分だけcategoy-1.php、categoy-2.php、…と内容は全く同じテンプレートを用意しなくてはいけないため、caegory-[ID],phpを自動的に生成してくれるやり方はないか、というご相談です。

(いずれは、親カテゴリーにアコーディオンメニューで表示予定)

※下記get_header()等の読込み記述は除きます。
【front-page.php記述】

<div id="contents">        
<?php
    $categories = get_categories('parent=0');
    foreach($categories as $category) :
?>
<ul>        
    <li><a href="<?php echo get_category_link( $category->term_id ); ?>"><?php echo $category->cat_name; ?></a></li>
</ul>
<?php endforeach; ?>
</div><!-- #contents end -->

【functions.php記述】

//子カテゴリのアーカイブページを親カテゴリ用のテンプレートファイルで表示
add_filter( 'category_template', 'my_category_template' );

function my_category_template( $template ) {
    $category = get_queried_object();
    if ( $category->parent != 0 &&
        ( $template == "" || strpos( $template, "category.php" ) !== false ) ) {
        $templates = array();
        while ( $category->parent ) {
            $category = get_category( $category->parent );
            if ( !isset( $category->slug ) ) break;
            $templates[] = "category-{$category->slug}.php";
            $templates[] = "category-{$category->term_id}.php";
        }
        $templates[] = "category.php";
        $template = locate_template( $templates );
    }
    return $template;
}

【category.php記述】

<div id="contents">
        <h1 class="page_ttl"><?php single_cat_title (); ?></h1>
<?php
    get_template_part('content-category');
?>
</div>
<!-- #contents  end -->

【(category.php読込み)content-category.php記述】

<div class="content2">
<?php
    $category_name = single_cat_title ('', false); // 現在のカテゴリ名を取得(表示はしないのでfalse)
    $category_id = get_cat_ID ($category_name); // カテゴリ名から現在のカテゴリIDを取得
    $args = array(
            'orderby' => 'count', // 投稿数順
            'show_count' => 1, // 投稿数を表示
            'child_of' => $category_id, // 現在のカテゴリの子カテゴリーを表示
            'title_li' => '', // タイトル出さない
            'show_option_none' => '',
            'current_category' => 0,
            'pad_counts' => 0,
            'taxonomy' => 'category', // 投稿のカテゴリを指定
            'walker' => null
    );
    ?>
    <!-- カテゴリ一覧 -->
    <ul><?php wp_list_categories($args); ?></ul>
</div><!-- .content2 end -->

ちなみに、
【(category-ID.phpの一部)category-51.php記述】

<div id="contents2">
<div class="section-header">
<?php
    $cat = get_the_category();
    $cat = $cat[0];
    $strcat = $cat->name;
    $catChildren = get_category_children($cat->cat_ID);        //get_category_childrenは非推奨?get_term_childrenを使う?
    if ($catChildren) {
        $catIDs = explode('/',$catChildren);
        foreach($catIDs as $child) {
            $cat = get_category($child);
            if ($cat->slug == get_query_var('category_name')) {
                $strcat = $strcat.' - '.$cat->name;
                break;
            }
        }
    }
?>
    <h2><img src="<?php bloginfo('template_url'); ?>/images/ttl_triangle.gif" width="9" height="23" alt="" />&nbsp;<?php echo $strcat; ?></h2>
    </div>
    <?php if(have_posts()): ?>
    <table class="cat_list">    
<?php query_posts($query_string .'&orderby=post_tag&order=ASC');//query_postsは非推奨 ? ?>            
<?php while(have_posts()): the_post(); ?>
<?php
        $cats = get_the_category();
        $cats = $cats[0];
?>
    <tr>
    <td class="cat_ttl"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></td>
    </tr>
    <?php endwhile; ?>
    </table>
    <?php  endif; ?>

    <!--sidebar -->
    <?php //get_sidebar (post); ?>
    <!--/sidebar END -->
</div>
<!--/container END -->

以上、長々とすみません。よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2017/10/18 13:42

    「うまくいかない」とは「何をしたときに」「どうなると思って」「どうなったのか」を、具体的に記述されたほうが回答を得られやすいと思います。

    キャンセル

  • CrossingPercell

    2017/10/18 14:29 編集

    肝心な部分が言葉足らずですみません。
    たとえば、
    〔親カテゴリー(トップページに表記)〕
    ・A
    ・B
    ・C
    Aをクリックすると下記に遷移

    〔親カテゴリーAに属する子カテゴリーページ〕
    タイトルA
    ・A1
    ・A2
    ・A3
    子カテゴリーをクリックすると、記事一覧に遷移

    タイトルA1
    ・A1に属する記事タイトル1
    ・A1に属する記事タイトル2
    ・A1に属する記事タイトル3
    そしてそれぞれクリックすると個別記事を表示する、といった具合です。

    HOME >> タイトルA >> タイトルA1 >> A1に属する記事タイトル1
    上記のようなパンくずリストを作成した場合、「タイトルA」のページでは、A1,A2,A3を表示してくれますが、タイトルA1では属する記事タイトルを列記したいのですが、何も表示してくれません(タイトルも親カテゴリーAのまま)。
    以上は、category.phpのみを使用した場合ですが、強制的にcategoy-21.phpなどのID参照のテンプレートを使用すると、子カテゴリー選択時属する記事一覧が表示されるようになっていますが、カテゴリーの数分だけcategoy-1.php、categoy-2.php、…と内容は全く同じテンプレートを用意しなくてはいけないため、caegory-[ID],phpを自動的に生成してくれるやり方はないか、というご相談です。説明が下手ですみません。

    キャンセル

  • kei344

    2017/10/18 14:53

    この「質問への追記・修正の依頼」の部分はデフォルトで表示されませんので、質問本文を編集することをお勧めします。

    キャンセル

回答 1

+1

content-category.phpというテンプレートを使う意味は何ですか?これを廃止してcategory.phpで読み込ませればと思いますが。

追記
質問内容が変わってますね。
では、元になるテンプレートのファイル名をcategory.phpの部分に指定してfunctions.phpに追記してください。
新しいカテゴリーを作るとファイル名にカテゴリーIDを含んだテンプレートを作成します。

function create_category_template( $term_id ) {
$original = get_stylesheet_directory().'/category.php';
$create =  get_stylesheet_directory().'/category-'.$term_id.'.php';
copy( $original, $create );
}
add_action( 'create_category', 'create_category_template' );

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/18 14:48

    ご指摘ありがとうございます。
    content-category.phpの内容をcategory.phpに書き直してみましたが、やはり表示されませんでした。

    キャンセル

  • 2017/10/22 22:13

    記したコードで
    ”caegory-[ID],phpを自動的に生成”
    すると思いますが、出来ないのなら出来ないと書いてください。
    ただ漠然と未解決では何が駄目なのか分かりません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる