WordPressでカスタム投稿タイプを増やすと、サイドバーの「新着記事」や「カテゴリー一覧」がごちゃ混ぜになり、デザインが破綻しがちです。
今回の記事では、どのページを見ても、そのページに合わせた正しい情報だけを表示するという、拡張性の高い「文脈判定関数」の作り方を解説します。
1. なぜ切り替えが必要なのか?
WordPressのテンプレート(例: sidebar.php)は、**「今どのページを見ているか」**によって動作を変える必要があります。
- ブログ記事のページ → サイドバーにはブログの新着記事とカテゴリーを表示
- お知らせのページ → サイドバーにはお知らせの新着記事とカテゴリーを表示
- 事例のページ → サイドバーには事例の新着記事とカテゴリーを表示
この「今見ているページの種類」を判定し、必要な情報をまとめて渡すのが、今回作成する**my_sidebar_context()**関数の役割です。
💡 本日の学びのポイント:データとロジックの分離
| 役割 | 場所 | 内容 |
| ロジック(判断・計算) | functions.php | ページの文脈(投稿タイプとタクソノミー)を判定する |
| 表示(HTMLを出力) | sidebar.php | ロジックの結果を受け取り、HTMLとして出力する |
この分離こそが、メンテナンスしやすく拡張性の高いWordPressテーマを作る基本です。
2. 【完成版】文脈を自動判定する関数の全貌
テーマの**functions.php**に貼り付ける、すべてのロジックを詰め込んだカスタム関数です。この関数が、サイトの表示を完全に制御します。
functions.php
PHP
/* -----------------------------------------
サイドバーの文脈を判定する関数
完成版:投稿タイプとタクソノミーを自動判定
----------------------------------------- */
function my_sidebar_context()
{
// ① 投稿タイプとタクソノミーの対応表(拡張性の要)
$map = [
'post' => 'category',
'blog' => 'blog_category',
// 'case' => 'case_category', // 将来追加する場合はここに1行追加
];
// ② デフォルトは通常の投稿
$post_type = 'post';
// ③ 今見ているページの種類を判定
if (is_singular()) {
// 個別記事ページ: get_post_type()で取得
$post_type = get_post_type();
} elseif (is_post_type_archive()) {
// 投稿タイプアーカイブ: get_query_var()で取得
$post_type = get_query_var('post_type');
} elseif (is_tax()) {
// カスタムタクソノミーのアーカイブ
$term = get_queried_object();
// 💡 逆引きの仕組み: タクソノミー名から投稿タイプを探す
foreach ($map as $pt => $tax) {
if ($term->taxonomy === $tax) {
$post_type = $pt; // ← 見つかったら投稿タイプを確定
break;
}
}
}
// ④ 対応表からタクソノミー名を取得(存在しなければ標準の 'category' を使用)
$taxonomy = $map[$post_type] ?? 'category';
// ⑤ 結果を配列として返す
return [
'post_type' => $post_type,
'taxonomy' => $taxonomy
];
}
💡 重要なロジックの解説
$map配列の役割: **'blog' => 'blog_category'**のように「投稿タイプ(キー)とタクソノミー(値)」の対応を定義しています。将来的に新しい投稿タイプを増やしても、ここに1行追加するだけで自動対応できます。is_tax()の処理: **is_tax()**でカスタムタクソノミーのページであることを判定し、foreachで対応表を検索(逆引き)することで、そのタクソノミーがどの投稿タイプに紐づいているかを正確に特定しています。
3. 【実践】サイドバーでのデータの使い方
**sidebar.php**では、先ほど作成した関数を呼び出すだけで、すべての処理が完了します。
sidebar.php の編集
PHP
// ★★★ 関数の呼び出しと変数の定義
<?php
$context = my_sidebar_context();
$recent_post_type = $context['post_type']; // 例: 'blog'
$taxonomy = $context['taxonomy']; // 例: 'blog_category'
?>
<section class="new-post aside">
<?php $post_query = new WP_Query(
array(
'post_type' => $recent_post_type, // ★ 取得する投稿タイプが自動で切り替わる
'posts_per_page' => 5
)
);
?>
</section>
<section class="category aside">
<ul class="category__list">
<?php
wp_list_categories(array(
'taxonomy' => $taxonomy, // ★ 表示するカテゴリーが自動で切り替わる
'title_li' => '',
'hide_empty' => false,
'show_count' => true,
));
?>
</ul>
</section>
💡 成功の鍵:キーと値の取り出し方
- ✅ 正しい:
$context['post_type'](キーで取り出す) - ❌ 間違い:
$context['blog'](値では取り出せない)
これは配列の基本中の基本ですが、トラブルシューティングの際にもっとも引っかかりやすいポイントです。
4. トラブルシューティングと今後のステップ
困ったときの確認ポイント
- デバッグコードの挿入:
sidebar.phpの先頭に以下のコードを一時的に追加し、どの情報が取得されているか目視で確認しましょう。PHP<?php $context = my_sidebar_context(); echo '<pre>'; print_r($context); // どのpost_typeとtaxonomyが取得されているか確認 echo '</pre>'; ?> - 対応表のチェック:
functions.phpの$map配列に、表示させたいカスタム投稿タイプが正しく登録されているか確認しましょう。
✅ 今後のステップ
- 拡張性の確認:
$mapに新しい投稿タイプ(例:'case' => 'case_category')を追加するだけで、サイドバーが自動で対応するか試してみましょう。 - 最終チェック: お知らせ記事、ブログ記事、それぞれのカテゴリー一覧ページに移動し、サイドバーの新着記事とカテゴリー一覧が正しく切り替わっていることを確認してください。

