WordPressのオリジナルテーマ 投稿一覧ページとサイドバーの作成

目的

  • BLOG 固定ページに投稿一覧を表示する
  • サイドバー(ウィジェット)を有効化して、カテゴリーや最新記事などを表示できるようにする
  • 投稿データのインポートで効率よく構築を進める

投稿データのインポート

「WordPress-fullsite」で作成済みの方は、投稿記事もエクスポート→インポートできます。

  1. 投稿元のサイトで管理画面「ツール」>「エクスポート」
  2. 投稿」を選んで XML ファイルをエクスポート
  3. オリジナルテーマのサイトで管理画面「ツール」>「インポート」
  4. WordPressインポーターを実行し、XMLファイルをインポート
    • 投稿者を割り当てる
    • 「添付ファイルをダウンロードしてインポート」に

サイドバー用テンプレート page-sidebar.php の作成

  1. page-sidebar.php をテーマフォルダに作成
  2. page.php をベースに、サイドバーの追加部分を含めて以下のようにします
<?php
/*
Template Name: サイドバー付きテンプレート
*/
// ========================
// このファイルはカスタムテンプレートです
// 「固定ページ」編集画面の「テンプレート」から選べるようになります
// ========================

// ヘッダーを読み込み(header.php の内容がここに展開される)
get_header();
?>

<main class="has-sidebar"> <!-- サイドバーありのレイアウト用クラス -->
  <h1 class="sub-title"><?php the_title(); ?></h1> <!-- ページのタイトルを表示 -->

  <div class="container flex-area"> <!-- 横並びにするラッパー(CSSでflex指定など) -->

    <!-- メインコンテンツエリア -->
    <div class="main-area">
      <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
        <?php the_content(); ?> <!-- ビジュアルエディタの本文を表示 -->
      <?php endwhile; endif; ?>
    </div>

    <!-- サイドバーエリア -->
    <aside class="sidebar">
      <?php get_sidebar(); ?> <!-- sidebar.php を読み込み -->
    </aside>

  </div>
</main>

<!-- フッターを読み込み(footer.php) -->
<?php get_footer(); ?>
<?php
/*
Template Name: サイドバー付きテンプレート
*/
get_header(); ?>

この Template Name コメントがあることで、WordPressはこのファイルを「固定ページ用のテンプレート」として認識し、編集画面の「テンプレート」欄に表示します。

サイドバー表示のための sidebar.php を作成

サイドバーにウィジェットエリアで設定した「ウィジェット」を挿入するように設定します。

<?php if (is_active_sidebar('sidebar-widget-area')) : ?>
  <!-- サイドバーにウィジェットが設定されている場合のみ表示 -->

  <ul class="widget-list">
    <!-- 管理画面「外観 > ウィジェット」で追加されたウィジェットを出力 -->
    <?php dynamic_sidebar('sidebar-widget-area'); ?>
  </ul>

<?php endif; ?>

is_active_sidebar('sidebar-widget-area')

  • 「このウィジェットエリアに、表示できるウィジェットが1つ以上あるか?」をチェック
  • ウィジェットが空の場合は HTML を出力しないようにする
  • 結果が false の場合:何も表示されません(空の <ul> を出さない)

dynamic_sidebar('sidebar-widget-area')

  • 指定したウィジェットエリアのウィジェットを表示する
  • 管理画面「外観 > ウィジェット」で登録した内容を出力する
  • ウィジェットが設定されていないときは何も出力しない

そもそもウィジェットとは?

ウィジェット(Widget)とは、WordPressの「サイドバー」や「フッター」などのエリアに、簡単に機能を追加できるパーツのことです。

たとえば、次のような内容をウィジェットで追加できます

ウィジェットの例内容
最近の投稿最新のブログ記事一覧を表示
カテゴリー投稿のカテゴリ一覧を表示
カスタムHTML自由にHTMLを記述
テキスト簡単なテキスト(お知らせなど)

フルサイト編集とウィジェットの違い

フルサイト編集(FSE)の場合

  • ウィジェットという概念はなくなり、すべて「ブロック」で構成されます
  • サイドバーやフッターも「ブロック」で自由に編集します

クラシックテーマ(今回のようなPHPテーマ)の場合

  • ウィジェットエリアを functions.php で登録
  • 管理画面「外観 > ウィジェット」から設定可能
  • テンプレートファイル(page-sidebar.phpなど)に get_sidebar() を使って読み込む

functions.phpでウィジェット(サイドバー)を登録

functions.php に以下を追加すると、ウィジェットが使えるようになります

<?php
// ==============================
// サイドバーウィジェットを有効化
// ==============================

function unnhanbur_widgets_init() {
  register_sidebar(array(
    'name'          => 'サイドバーウィジェット',       // 管理画面に表示される名前
    'id'            => 'sidebar-widget-area',          // テンプレートで使用する識別子
    'before_widget' => '<li class="widget">',          // 各ウィジェットを囲む開始タグ
    'after_widget'  => '</li>',                        // 各ウィジェットを囲む終了タグ
    'before_title'  => '<h2 class="widget-title">',    // ウィジェットタイトルの開始タグ
    'after_title'   => '</h2>',                        // ウィジェットタイトルの終了タグ
  ));
}

// widgets_init(ウィジェットの初期化)というタイミングで上記を実行
add_action('widgets_init', 'unnhanbur_widgets_init');

管理画面でウィジェットを追加しよう

「外観」→「ウィジェット」画面で、サイドバーウィジェット エリアに以下のウィジェットを追加してみましょう。

  • 検索バー
  • 新着情報(見出し)
  • 最新の投稿 設定→投稿コンテンツ、アイキャッチ画像の表示、画像位置は左、アイキャッチ画像のリンクを追加
  • カテゴリー(見出し)
  • カテゴリー一覧
  • タグクラウド(見出し)
  • タグクラウド 
  • 画像(バナー)

終了後は必ず更新しておきます。

表示順の調整

  • ウィジェットはドラッグ&ドロップで順番を変更できます。
  • 表示順はそのまま サイドバーに出力される順番に反映されます。

page-sidebar.phpをBLOGページで使う方法

  • 固定ページ「BLOG」を開く
  • 右カラムの「テンプレート」から サイドバー付きテンプレート(page-sidebar.php) を選択
  • 更新して表示確認
  • この時テンプレートネームがないとテンプレートという項目は表示されません

css/custom.css の末尾などに追加

今回はウィジェットエリアの追加などがありましたので、Wordpressで使われているclassに対して下記のCSSをcss/custom.css の末尾などに追加しておきましょう。

/* メイン + サイドバーのレイアウト */
.flex-area {
    display: flex;
    flex-wrap: wrap;
    gap: 2rem;
}

/* メインコンテンツ */
.main-area {
  /* 
    flex-grow: 1   → 余白があれば広がる
    flex-shrink: 1 → スペースが足りなければ縮む
    flex-basis: 65% → 初期の幅は65%
  */
  flex: 1 1 65%;
  min-width: 300px; /* 最小幅(スマホ対応) */
}

/* サイドバー */
.sidebar {
  /* 
    初期幅は30%。メインエリアと横並びにしたときの比率。
    必要に応じて広がったり縮んだりする
  */
  flex: 1 1 30%;
  min-width: 260px; /* ウィジェットが崩れないように */
  padding: 2rem;     /* 内側の余白 */
}

/* ウィジェットのリスト全体 */
.widget-list {
  list-style: none;
  padding: 0;
  margin: 0;
}

/* 各ウィジェットの枠 */
.widget {
  margin-bottom: 2rem;
  padding-bottom: 1rem;
  border-bottom: 1px solid #ccc;
}

/* ウィジェットタイトル */
.widget-title {
  font-size: 1.2rem;
  margin-bottom: 1rem;
  border-left: 5px solid var(--primary);
  padding-left: 0.5em;
  color: #333;
}