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
$blogurl  = get_bloginfo('url') . '/';
$blogname = get_bloginfo('name');
echo '<?xml version="1.0" encoding="utf-8"?>';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<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"><!-- ここから 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><!-- sidebar ここまで -->

その他に使えそうな場所

サーチフォーム
<form id="searchform" method="get" action="<?php echo $blogurl; ?>">

パンくず
<div class="navi">
<a href="<?php echo $blogurl; ?>">HOME</a> &rsaquo; <?php the_category(' , '); ?> &rsaquo; <?php echo $title; ?>
</div>

コピーライト表記
Copyright &copy; <?php echo date('Y') . ' ' . $blogname; ?>

で、早くなった?

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