サポート » 使い方全般 » カテゴリー別のレイアウトを子カテゴリにも反映させたいのですが

  • 解決済 iketoshi

    (@iketoshi)


    お世話になります。
    アーカイブまたはカテゴリでカテゴリに属する投稿を表示する際に、特定のカテゴリだけレイアウトを変えたかったため、カテゴリにスラッグ名を付け、categry-スラッグ名として対応しておりました。
    今回、そのカテゴリの子カテゴリにもレイアウトを反映させたいのですが、何か方法はありますでしょうか?

    子カテゴリは、先々増えていきますので、子カテゴリ分のカテゴリレイアウトを個別に作ることは避けたいです。

    if文で条件分岐で記述することは、最終手段としたいです。

    いろいろと調べましたが、スマートな方法がわかりませんでした。カスタム投稿で個別に作成するなどすると、出来たりするのでしょうか?

    宜しくお願い致します。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • KUCKLU

    (@kuck1u)

    こんにちわ、iketoshiさん。

    親カテゴリーがあればそれを、無ければ自分を CSS クラスに加えるという処理をしてあげればよいと思います。

    トピック投稿者 iketoshi

    (@iketoshi)

    KUCKLUさん、ありがとうございます。
    今回、表示わけさせたい形ですが、

    カテゴリAの表示:タイトルとサムネイルの表示
    カテゴリBの表示:タイトルと指定したカスタムフィールドの表示
    カテゴリcの表示:タイトルと全文の表示

    ざっくりとですが、レイアウトだけでなく、表示内容を分けたいと思っています。
    現在カテゴリのPHPファイルを3つ作成し、表示を分けていましたが、Aの子カテゴリを作った場合、Aの子カテゴリもAと同じ表示にしたいと思っています。

    何か方法は、ありますでしょうか。
    宜しくお願いします。

    KUCKLU

    (@kuck1u)

    失礼いたしました。
    何故、CSS なんて回答したのか・・・ orz

    話しは戻りますが、レイアウトの種類が限られているのであれば

    content-a.php
    content-b.php
    content-c.php

    を用意して、 get_template_part() 関数で切り分けるのがよいかと思います。
    切り分け自体は、archive.php か category.php で行うのがよいかと思います。

    トピック投稿者 iketoshi

    (@iketoshi)

    KUCKLUさん、ありがとうございます。
    数日空いてしまいました。

    今回は、カテゴリテンプレートの表示分けをしたかったので、
    categry-a.php
    categry-b.php
    categry-c.php
    categry.php
    を作ってa・b・cの表示分けは、現状できているところからのスタートです。

    上手に説明できず、すみません・・・

    aのカテゴリを選べばcategry-a.phpの表示になりますが、「a」の下にも子カテゴリがあり、「aほにゃらら」というaの子カテゴリを選ぶと、categry.phpの表示となります。
    当たり前ですが、作っている最中は気が付きませんでした・・・

    「a」の子カテゴリを選んだ時もcategry-a.phpの表示にしたいのですが、可能なのか、根本的に方法を変えなければいけないのかがわかりません。

    a・b・cは、大きな改変が無い限り、永続的に変わりませんが、子カテゴリは運用の中で増えていき、事前に作れませんし、いくつになるかわからないので、categry-a01.phpと都度テンプレートを増やしたくありません。

    何か方法は、ありますでしょうか。
    宜しくお願いします。

    こんにちは、

    @iketoshi さんが、行われている方法は、テンプレート階層(名前付けルールに基づいた、自動的なテンプレートの適用)を使ったテンプレートの分岐ですよね。

    この方法だと、スラッグやIDを使うために、おっしゃっているような「カテゴリグループ」みたいな指定はできないので、テンプレートが山になるのと、手動で作らなければなりませんので

    a・b・cは、大きな改変が無い限り、永続的に変わりませんが、子カテゴリは運用の中で増えていき、事前に作れませんし、いくつになるかわからないので、categry-a01.phpと都度テンプレートを増やしたくありません。

    という方法が実現できません。

    WordPressのテンプレートの適用方法には、@KUCKLU さんが説明されている通り、

    get_template_part()等の関数を使う事で、いわば手動でテンプレート階層的な動作を作り上げることが出来ます。

    しかし、is_category()での条件分岐を行う以上、新しい子カテゴリが発生するたびに、テンプレートの書き換えが必要になります。

    なので、カテゴリグループ(?)を検出して、そういうもので条件分岐をするといいのではないかと思います。

    以下は、ちょっと思いつきのサンプルですが、テンプレートでの条件分岐にも使えると思いますので検討してみてください。

    以下の例は、フィルタで、テンプレートを強制的に他のものに変更しています。
    カテゴリID41とその子カテゴリは、category.phpの代わりに、index.phpが適用されます。

    functions.php

    add_filter( 'template_include', 'action_function' );
    
    function action_function( $template) {
    	//カテゴリグループを検出 ( なんか他にやり方もありそうですが、、、)
    	$args = array(
    	'type'                     => 'post',
    	'child_of'                 => 41,
    	);
    	$ids = array( $args['child_of'] );
    	$categories = get_categories( $args );
    
    	foreach ( $categories as $category ) {
    
    		$ids[] = absint( $category->term_id );
    	}
    	//カテゴリID41とその子カテゴリを配列に入れて条件分岐
    
    	if ( is_category( $ids ) ) {
    		//これは、サンプルなので、indexテンプレートを呼び出しています。
    		return get_index_template();
    	}
    	return $template;
    }

    他にも、カスタムタクソノミなどを使って、テンプレートグループを指定してやるとか、他にも方法はありそうな感じです。

    似たような事を最近行ったので可能ですよ。

    categry.phpに親カテゴリがaの場合categry-a.php
    を読み込むという分岐を書いてください。
    ご希望の仕様ですと下記が参考になると思います。

    http://wpdocs.sourceforge.jp/関数リファレンス/in_category

    トピック投稿者 iketoshi

    (@iketoshi)

    ご連絡が大変遅くなりました!
    nobitaさん masahi–roさん、ありがとうございます。
    KUCKLUさんの話が、よく理解できていなかったようです。

    get_template_part()を今まで使ったことがありませんでした。
    いろいろと調べた結果、皆さんの言われていることが理解できました。functions.phpに記述できるのがスマートな方法と思いますが、現状、私にはハードルが高いため、将来的にfunctions.phpに書き写し、今回はmasahi–roさんの方法でやってみようと思います。

    現在、categry.phpに下記の記述をしてみました。

    <?php
    if ( in_category( ‘4’ ) || post_is_in_descendant_category( ‘4’ ) ) {
    include(TEMPLATEPATH.’/category-blog.php’);
    } elseif ( in_category( ‘9’ ) || post_is_in_descendant_category( ‘9’ ) ) {
    include(TEMPLATEPATH.’/category-class.php’);
    } else {
    include(TEMPLATEPATH.’/category-others.php’);
    }
    ?>

    4と9のカテゴリ以外、ページが表示できません。4か4の子孫カテゴリーの場合、category-blog.phpをインクルードしているつもりですが、初めての記述で、よく理解できていません。

    どの部分が違っていますでしょうか?
    度々の質問ですみません。宜しくお願いします。

    もう少し、ひねりが必要でしたね

    カテゴリアーカイブで、テンプレートの条件分岐を行うためには、is_category() を使う必要があると思います。

    なので、in_category()のコードを、is_category()に直さないといけないと思います。
    ( post_is_in_descendant_category( ‘9’ ) の中身の書き換えも必要 )

    それと、include() を使っていますが、
    ( Codexでincludeを使ったコードサンプルがありますが、これ、良い書き方じゃありません )

    それは、なんでか?

    include(TEMPLATEPATH.'/category-others.php');
    include(TEMPLATEPATH

     は、常に親テンプレートのパスを返します。

    これが、なんでよくないかというと、チャイルドテーマを作った場合にテンプレートが動作しなくなるので、ちょっとした不具合を、チャイルドテーマで試験的に修正するといった作業ができなくなるためです。

    なので、チャイルドテーマの場合は、自動的にパスを調整してくれる

    get_template_part() を使ったほうが、後々 楽ちんになるためです。

    ざっくりした内容でごめんなさい。

    追記:codex 修正済み

    間違っていたら、どなたか修正ください

    <?php
    if ( in_category('fruit') ) {
    	include( 'single-fruit.php' );
    } elseif ( in_category('vegetables') ) {
    	include( 'single-vegetables.php' );
    } else {
    	// 普通にループを続ける
    	if ( have_posts() ) : while ( have_posts() ) : the_post();
    	// ...
    }
    ?>

    include > get_template_part
    single > some
    ファイル名 singleだと、テンプレート階層とコンフリクトする可能性あるので、

    <?php
    if ( in_category('fruit') ) {
    	get_template_part( 'some', 'fruit' );
    } elseif ( in_category('vegetables') ) {
    	get_template_part( 'some', 'vegetables' );
    } else {
    	// 普通にループを続ける
    	if ( have_posts() ) : while ( have_posts() ) : the_post();
    	// ...
    }
    ?>

    トピック投稿者 iketoshi

    (@iketoshi)

    勉強になります。

    <?php
    if ( in_category( ‘4’ ) || post_is_in_descendant_category( ‘4’ ) ) {
    get_template_part( ‘category’, ‘blog’ );
    } elseif ( in_category( ‘9’ ) || post_is_in_descendant_category( ‘9’ ) ) {
    get_template_part( ‘category’, ‘class’ );
    } else {
    get_template_part( ‘category’, ‘others’ );
    }
    ?>

    上記の形で、やっと出来ました・・・ただ、functions.phpに下記を追記しました。

    function post_is_in_descendant_category( $cats, $_post = null ){
    foreach ( (array) $cats as $cat ) {
    $descendants = get_term_children( (int) $cat, ‘category’);
    if ( $descendants && in_category( $descendants, $_post ) )
    return true;
    }
    return false;
    }
    ?>

    ↑この動きをしてくれるのが、post_is_in_descendant_category()と思っていましたが、なぜfunctions.phpに追記しなければいけないのかわかりません・・

    functions.phpに追記なしで、blogとblogの子孫カテゴリーに属するIF文はかけないのでしょうか?解決はいたしましたが、もやもやが消えません。
    根本的な理解が間違っていますでしょうか?

    トピック投稿者 iketoshi

    (@iketoshi)

    閉め忘れておりました。
    KUCKLUさん、nobitaさん、Masahi–roさん、ありがとうございました。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • トピック「カテゴリー別のレイアウトを子カテゴリにも反映させたいのですが」には新たに返信することはできません。