カテゴリー別のレイアウトを子カテゴリにも反映させたいのですが
-
お世話になります。
アーカイブまたはカテゴリでカテゴリに属する投稿を表示する際に、特定のカテゴリだけレイアウトを変えたかったため、カテゴリにスラッグ名を付け、categry-スラッグ名として対応しておりました。
今回、そのカテゴリの子カテゴリにもレイアウトを反映させたいのですが、何か方法はありますでしょうか?子カテゴリは、先々増えていきますので、子カテゴリ分のカテゴリレイアウトを個別に作ることは避けたいです。
if文で条件分岐で記述することは、最終手段としたいです。
いろいろと調べましたが、スマートな方法がわかりませんでした。カスタム投稿で個別に作成するなどすると、出来たりするのでしょうか?
宜しくお願い致します。
-
KUCKLUさん、ありがとうございます。
今回、表示わけさせたい形ですが、カテゴリAの表示:タイトルとサムネイルの表示
カテゴリBの表示:タイトルと指定したカスタムフィールドの表示
カテゴリcの表示:タイトルと全文の表示ざっくりとですが、レイアウトだけでなく、表示内容を分けたいと思っています。
現在カテゴリのPHPファイルを3つ作成し、表示を分けていましたが、Aの子カテゴリを作った場合、Aの子カテゴリもAと同じ表示にしたいと思っています。何か方法は、ありますでしょうか。
宜しくお願いします。失礼いたしました。
何故、CSS なんて回答したのか・・・ orz話しは戻りますが、レイアウトの種類が限られているのであれば
content-a.php
content-b.php
content-c.phpを用意して、
get_template_part()
関数で切り分けるのがよいかと思います。
切り分け自体は、archive.php か category.php で行うのがよいかと思います。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
を読み込むという分岐を書いてください。
ご希望の仕様ですと下記が参考になると思います。ご連絡が大変遅くなりました!
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(); // ... } ?>
勉強になります。
<?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文はかけないのでしょうか?解決はいたしましたが、もやもやが消えません。
根本的な理解が間違っていますでしょうか?
- トピック「カテゴリー別のレイアウトを子カテゴリにも反映させたいのですが」には新たに返信することはできません。