この記事は公開から9年、最終更新日からも8年経過しています。内容が古くなっている可能性があります。
概要
WordPressでテンプレートを読み込む時は、 get_template_part 関数を使用しましょう、という記事になります。
説明
WordPressにおいて子テーマを作成した際に、子テーマ内には、新たに作成したファイルと変更を加えたファイルだけを格納するのが一般的だと思います。
ところが最近カスタマイズさせて頂いたテーマで、親テーマでインクルードしているファイルがうまく読み込めない事がありまして、調べてみると、
<?php include_once( "xxxxx.php" ); ?>
という構文を使用していたためでした。
PHPのincludeやrequire関数は、パスを通してあげないといけないので、子テーマから親テーマのテンプレートを読み込む時は
<?php include_once( TEMPLATEPATH . "/xxxxx.php" ); ?>
※TEMPLATEPATH は親テーマのディレクトリを表す変数
と書けば良いのですが、今度は、「xxxxx.php」をカスタマイズして小テーマ内に格納すると、再び、
<?php include_once( "xxxxx.php" ); ?>
と元の記述に戻すか、
<?php include_once( STYLESHEETPATH . "/xxxxx.php" ); ?>
子テーマフォルダを表す「STYLESHEETPATH」に書きなおす必要があり、親テーマのパス、小テーマのパスを意識した記述を行わないといけないのでメンテナンス性が低くなってしまいます。
そこで便利なのがWordPressの関数 get_template_part です。
関数リファレンス/get template part – WordPress Codex 日本語版
これを使用して下記のように記述すれば
<?php get_template_part( 'xxxxx' ); ?>
小テーマ内の xxxxx.php があれば 小テーマのxxxxx.php を
小テーマ内になくて親テーマにある場合は 親テーマのxxxxx.php を読み込んでくれるので便利です。
実際に実装したURL例
web_design | sample2
※上記サイトはテーマ:STINGER5の子テーマを作成し実現しています。
上記実装例のコード
●category-41.php(読み込む方のテンプレート、上記実装例を表示するためのテンプレート)
<h2>ここからget_template_part('itiran')の動作(本来の動作)</h2> <?php get_template_part('itiran');?> <h2>ここからinclude('itiran.php') → 読み込めない</h2> <?php include('itiran.php');?> <h2>ここからinclude(TEMPLATEPATH . '/itiran.php') → 読み込める</h2> <?php include(TEMPLATEPATH . '/itiran.php');?> <h2>ここからget_template_part('itiran2')の動作(小テーマのitiran2を読み込んでくれる)</h2> <?php get_template_part('itiran2');?>
●iritan.php(親テーマ内のみにある)
<div id="topnews"> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <!-- 途中略 該当カテゴリの記事の一覧表示するための記述 --> <?php endwhile; else: ?> <?php endif; ?> </div>
●itiran2.php(子テーマ内のみにある)
<?php echo "<p>この表示は小テーマのitiran2に記載されている箇所です</p>"?>
表示例
◎上記のように、get_template_partを利用することでincludeするファイルが子テーマにあれば子テーマのテンプレートを、なければ親テーマのものを読み込んでくれます。
最後に
今回のように親テーマでincludeを利用しているテーマは結構あるようで、以前、カスタマイズのお仕事させて頂いた時に、
カスタマイズとは無関係のところでエラーが出たり、本来の表示がなされていないなど、余計な工数を使用することも
ありましたので、記事にまとめてみました。
このようにWordPressには色々と便利な関数が用意されています。