サポート » 使い方全般 » is_category で分岐するのか、category-n.php に振り分けるか…

  • 解決済 LVP8

    (@lvp8)


    サーバーに負担の少ない方法はどちらか分からずにいます。

    現在カテゴリー数が20を超えるサイトで、今後も増えていく可能性があります。
    カテゴリーごとにレイアウトや表示したい項目が若干違うので、is_category(x) を使い表示(echo や include)を変えてますが、上記のとおり今後カテゴリーが増加し、サーバー側の負担(?)を考えると、テンプレート(category-n.php)で分けた方が良いのでしょうか。

    1. is_category で分岐した場合、ファイル数を抑えることができますし、メンテナンスが楽になる気がします。(カテゴリーの複数指定などで)
    2. category-n.php で分けた場合、専用のテンプレートになるので、そのファイル自体のコードはシンプルになりますが、ファイル数が多くなるので、全体のコード修正時は面倒に感じます。

    category-n.phpをカテゴリーの数だけ作り、さらに数種類のinclude用テンプレートを読み込ませる、とも考えましたが、だったらis_categoryで分岐してもかわらないのでは、と色々考え始め、結局サーバーに負担の少ない(表示が速い)方法にしようと思います。

    長くなりましたが、アドバイスいただければ幸いです。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • モデレーター jim912

    (@jim912)

    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させるファイルをいくつかのカテゴリーで共有させたいのであれば、マッピングさせる配列を定義しておくと良いかと思います。

    お時間ができた時で結構ですので、コードのサンプルをご教授いただければ幸いです。

    モデレーター jim912

    (@jim912)

    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の配列を値として定義します。

    モデレーター jim912

    (@jim912)

    すみません。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さん
    お忙しい中色々アドバイスをいただき、本当にありがとうございました。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「is_category で分岐するのか、category-n.php に振り分けるか…」には新たに返信することはできません。