WordpPessには、一部のファイルを簡単に読み込むことができる「テンプレートインクルードタグ」が用意されていますが、個人的には include() 文のほうが都合が良いと感じています。

理解が浅く使い方が悪いのかもしれませんが、シングルページのサイドバー内で、if ( in_category(ID) ) による分岐が上手くいかなかったり 、その記事が属するカテゴリーの記事を表示する時、場合によっては get_the_category() を、全体で複数回使う必要がでてくるからです。
$post = $wp_query->post; による解決方法を知ったのはこの記事を投稿する直前…。

また、以下のような記事を読んだのがもう一つの大きな理由で、一回で済むことは複数回行わないようにした方が良さそうです。

中でも良く使用するbloginfoタグは、引数の項目をswitchで振り分けた後、項目がキャッシュにあるかをチェックし、無ければクエリを発行して取得するため、塵も積もれば重くなる。 WordPressのテンプレート高速化

  • シングルページのタイトルにカテゴリー名を含めたい
  • サイドバーにそのカテゴリーの新着記事10件を表示したい
  • カテゴリーごとに特定のコンテンツを表示したい
  • <?php?> の記述をなるべく減らしたい

という事を実現しつつ、なるべくシンプルなコードで負担をかけない方法を素人なりに考え、以下のようにカスタマイズしてみました。

single.php

複数回使う可能性がある「タイトル」と「カテゴリー情報」を変数に落とし、get_*** ではなく include でファイルを読み込む。

<?php
$title = get_the_title();
$cat = get_the_category(); $cat = $cat[0];
include(TEMPLATEPATH . '/header.php');
?>
<!-----
シングルページの中身
----->
<?php
include( TEMPLATEPATH . '/sidebar.php' );
include( TEMPLATEPATH . '/footer.php' );
?>

header.php

先頭

シングルページに限らず、全てのページで利用頻度の高いものを(ブログタイトルやブログURL)を変数に落とす。ホームのURLには、スラッシュが付いてあった方が便利だと感じているので一応。

<?php
$home = get_option('siteurl') . '/';
$blogname = get_option('blogname');
echo '<?xml version="1.0" encoding="utf-8"?>';
?>
<!DOCTYPE html PUBLIC .....
<html>
<head>

タイトル部分の例

<?php
// ホーム
if (is_home()) {
echo '<title>' . $blogname . '</title>
<meta name="description" content="'
. get_bloginfo('description') . '" />';
}
// シングルページ
elseif (is_single()) {
echo '<title>' . $title . ' - ' . esc_attr($cat->cat_name) . ' : ' . $blogname . '</title>
<meta name="description" content="'
. get_the_excerpt() . '" />';
}
// その他
else {
echo '<title>' . get_the_title() . ' - ' . $blogname . '</title>';
}
?>

シングルページでの出力結果 記事タイトル - カテゴリ名 : ブログ名

sidebar.php

その記事が属するカテゴリーの新着10件をリスト表示

すでにカテゴリー情報が配列されているので、$post = $wp_query->post や 改めてget_the_category() を使う必要はありません。

<div id="sidebar">
<?php if ( is_single() ) { ?>
<h3><?php echo esc_attr($cat->cat_name); ?> : 最近の投稿</h3>
<ul>
<?php
$sideloop = new WP_Query('cat=' . $cat->cat_ID . '&posts_per_page=10');
while ($sideloop->have_posts()) : $sideloop->the_post();
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; wp_reset_query(); ?>
</ul>
<?php } ?>

sidebar.php 内で、カテゴリーによる振り分け

カテ1で「はてブによる人気記事」、カテ3で「Twitterでのつぶやき」を表示、カテ4ではファイルを読み込み、その他のカテゴリーではAdSenseを表示。

<?php if ( in_category(1) ) { ?>
    <div>はてな</div>
<?php } elseif ( in_category(3) ) { ?>
    <div>Twitter</div>
<?php } elseif ( in_category(4) ) {
    include(TEMPLATEPATH . '/myfile-4.php');
} else { ?>
    <script>Google AdSense</script>
<?php } ?>
</div>

その他に使えそうな場所

<!-- サーチフォーム -->
<form id="searchform" method="get" action="<?php echo $home; ?>">
<!-- パンくず -->
<div class="navi">
<a href="<?php echo $home; ?>">HOME</a> &rsaquo; <?php the_category(' , '); ?> &rsaquo; <?php echo $title; ?>
</div>
<!-- コピーライト表記 -->
Copyright &copy; <?php echo date('Y ') . $blogname; ?>

で、早くなった?

逆に複雑にしているだけのような気も…。get_***() を使った方がいいの? という疑問も残ったままですが、テンプレートがスッキリしてカスタマイズの悩みは減りました。