LVP8さん、こんにちは。
結論としては、category-n.phpの方がサーバへの負担が軽い可能性が高いです。
ソースを追ってみると、テンプレートで振り分けの場合は、すでにセットされているカテゴリーのIDを参照し、ファイルの有無を確認しているのに対し、is_category(x)の場合は、内部的にget_categoryを行っているため、DBへのアクセスが発生する可能性があります。DBへのアクセスは、PHPの内部的な処理速度と比較した場合、圧倒的に遅いので、この時点でcategory-n.php方式に軍配が上がることとなります。
※ 引数をとらない場合のis_category()は、get_categoryは行いません。
ここで「可能性がある」と言っているのは、gat_categoryは(1アクセス内での)キャッシュを持つため、引数が同じであれば複数回実行したとしても1回行うのとさほど負荷が変わりません。その結果、(内部的にでも)他の部分でis_category(x)を行っていた場合は、どちらの方式であっても、表示速度の差はほとんど無くなってしまい、ほぼ同等の結果になりうるという意味です。
ちなみに私なりの考えではありますが、カテゴリー毎に異なる部分が一定なのであれば、category-n方式でincludeさせることも有効かと思います。
<?php
if ( $inc_template = locate_template( array( 'include/category_inc-' . absint( get_query_var('cat') ) . '.php' ) ) ) :
include( $inc_template );
else :
?>
デフォルトのカテゴリー表示
<?php endif; ?>
※ include/category_inc-n.phpを探し、存在すれば該当ファイルをinclude。なければデフォルト表示になります。
※ includeさせるファイルをいくつかのカテゴリーで共有させたいのであれば、マッピングさせる配列を定義しておくと良いかと思います。
トピック投稿者
LVP8
(@lvp8)
jim912さん
適切かつ詳細な解説ありがとうございます。
また、想定される問題にも先回りしてアイデアを提示してくださり感謝しております。
jim912さんが書いてくださったコードですと、テーマファイルの散らかり具合も防げるので、今後はこのスタイルで進めていきたいと思います。
ただ、下記の意味するところは理解できても、それを実現する知識を私は持ち合わせていません…。
includeさせるファイルをいくつかのカテゴリーで共有させたいのであれば、マッピングさせる配列を定義しておくと良いかと思います。
お時間ができた時で結構ですので、コードのサンプルをご教授いただければ幸いです。
LVP8さん、こんにちは。
動作確認してませんが、下記2通り作ってみました。
コード自体は、A案の方がシンプルで理解しやすいと思いますが、メンテナンス性などはB案の方が優れているかと思います。
A案
<?php
$inc_tpl_map = array(
1 => 'pattern-a',
2 => 'pattern-b',
7 => 'pattern-c',
10 => 'pattern-a',
12 => 'pattern-a',
);
$current_cat_id = absint( get_query_var('cat') );
if ( isset( $inc_tpl_map[$current_cat_id] ) && $inc_template = locate_template( array( 'include/category_inc-' . $inc_tpl_map[$current_cat_id] . '.php' ) ) ) :
include( $inc_template );
else :
?>
デフォルトのカテゴリー表示
<?php endif; ?>
※ カテゴリーのIDをキー、includeさせるテンプレート名を値とした配列を定義します。
B案
<?php
$inc_tpls = array(
'pattern-a' = array( 1, 10, 12 ),
'pattern-b' = array( 2 ),
'pattern-c' = array( 7 ),
);
$current_cat_id = absint( get_query_var('cat') );
$inc_template = '';
foreach ( $inc_tpls as $tpl_name => $cats ) {
if ( in_array( $current_cat_id, $cats ) ) {
$inc_template = locate_template( array( 'include/category_inc-' . $current_cat_id . '.php' );
break;
}
}
if ( $inc_template ) :
include( $inc_template );
else :
?>
デフォルトのカテゴリー表示
<?php endif; ?>
※ A案とは逆に、includeさせるテンプレート名をキーとして、それを利用するカテゴリーIDの配列を値として定義します。
すみません。B案のコードが一部間違ってました。
$inc_template = locate_template( array( 'include/category_inc-' . $tpl_name . '.php' );
トピック投稿者
LVP8
(@lvp8)
jim912さん
早速のサンプルコードありがとうございます。
思い通りの表示ができたのはもちろんですが、胸のつかえがおりたような感じです。
jim912さんのおっしゃるように、メンテナンスの事を考え「B案」のコードを使わせていただこうと思いますが、修正していただいた部分を入れ替えても動作しなかったので、最終的には下記のようにして動作確認できました。
<?php
$inc_tpls = array(
'pattern-a' => array( 1, 10, 12 ),
'pattern-b' => array( 2 ),
'pattern-c' => array( 7 ),
);
$current_cat_id = absint( get_query_var('cat') );
$inc_template = '';
foreach ( $inc_tpls as $tpl_name => $cats ) {
if ( in_array( $current_cat_id, $cats ) ) {
$inc_template = locate_template( array( 'include/category_inc-' . $tpl_name . '.php' ) );
break;
}
}
if ( $inc_template ) :
include( $inc_template );
else :
?>
デフォルトのカテゴリー表示
<?php endif; ?>
PHPは全くの素人ですので、誤った修正や記載方法があるかもしれません。ご指摘がなかった場合「解決済み」にしたいと思います。
jim912さん
お忙しい中色々アドバイスをいただき、本当にありがとうございました。