目的
BLOG固定ページに投稿一覧を表示する- サイドバー(ウィジェット)を有効化して、カテゴリーや最新記事などを表示できるようにする
- 投稿データのインポートで効率よく構築を進める
投稿データのインポート
「WordPress-fullsite」で作成済みの方は、投稿記事もエクスポート→インポートできます。
- 投稿元のサイトで管理画面「ツール」>「エクスポート」
- 「投稿」を選んで XML ファイルをエクスポート
- オリジナルテーマのサイトで管理画面「ツール」>「インポート」
- WordPressインポーターを実行し、XMLファイルをインポート
- 投稿者を割り当てる
- 「添付ファイルをダウンロードしてインポート」に
サイドバー用テンプレート page-sidebar.php の作成
page-sidebar.phpをテーマフォルダに作成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;
}
