成果物をまとめて確認する
[成果物]カテゴリーごとにページを分ける!実用的なサイト構築テクニック
【カテゴリーごとにページを分ける!実用的なサイト構築テクニック】の成果物です。投稿の学びを終えた時点の構成を一覧でご確認いただけます。
前回の記事では、get_categories()
を使って投稿をカテゴリー順に並べる方法を学習しました。しかし、すべてのカテゴリーの投稿を1つのページに表示すると、投稿数が増えた時に見づらくなってしまいます。
今回は、より実用的なアプローチとして「カテゴリーごとに個別のページを作成する」方法を詳しく解説します。この方法により、ユーザーは興味のあるカテゴリーだけを効率的に閲覧できるようになります。
今回の目標
page-news.php
でカテゴリー一覧を表示するcategory.php
でカテゴリー別投稿一覧を作成する目次
カテゴリーページを作成するには、まずWordPressの管理画面でパーマリンク設定を確認・変更する必要があります。
カテゴリーページを作成するため、同じパーマリンク設定画面でカテゴリーベースを設定します。
URL構造を整理します。
URL | 用途 | テンプレート |
---|---|---|
http://sample.local/news | お知らせ固定ページ | page-news.php |
http://sample.local/news/category/xxx | カテゴリー一覧ページ | category.php |
http://sample.local/news/123 | 投稿個別ページ | single.php |
現状ではお知らせページに投稿一覧が表示されています。
の構造に変更します。
まずは、お知らせページのテンプレート page-news.php を編集して、カテゴリー一覧を表示します。
<?php get_header();?>
<?php the_content(); ?>
<?php
// カテゴリー一覧を取得
$categories = get_categories([
'hide_empty' => true, // 投稿がないカテゴリーは除外
]);
echo '<ul class="category-list">' . PHP_EOL;
// カテゴリーごとにループ
foreach ($categories as $category) {
echo '<li><a href="'.get_term_link($category->term_id).'">'.$category->name.'</a></li>' . PHP_EOL;
}
echo '</ul>' . PHP_EOL;
?>
<p>※このページは page-news.php テンプレートで表示されています</p>
<?php get_footer();?>
get_categories()
でカテゴリー一覧を取得前回の記事で学習したように get_categories
は、カテゴリー一覧を取得する関数です。hide_empty => true
を指定することにより、投稿がないカテゴリーは表示対象から除外されます。
$categories = get_categories([
'hide_empty' => true, // 投稿がないカテゴリーは除外
]);
get_term_link()
でカテゴリーページのURLを取得get_term_link()
関数は、先ほど設定したパーマリンク設定のカテゴリーベースに基づいてURLを自動生成します。
foreach ($categories as $category) {
echo '<li><a href="'.get_term_link($category->term_id).'">'.$category->name.'</a></li>' . PHP_EOL;
}
ここで重要な概念として「ターム(term
)」について説明します。WordPressでは、カテゴリーやタグなどの分類項目を総称して「ターム」と呼びます。
つまり、「カテゴリー」も「タグ」も、どちらもWordPressでは「ターム」という扱いになります。そのため、カテゴリーに関する関数名にも「term
」という言葉が使われています。
次に、カテゴリーページのテンプレート category.php を新規作成します。
<?php get_header();?>
<?php
// 現在表示中のカテゴリー情報を取得
$target = get_queried_object();
// そのカテゴリーに属する投稿を取得
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'orderby' => 'title',
'order' => 'asc',
'category__in' => [$target->term_id],
];
$query = new WP_Query($args);
echo '<ul class="post-list">' . PHP_EOL;
while ($query->have_posts()) {
$query->the_post();
echo '<li>'.
'<span class="date">'.get_the_date('Y年m月d日').'</span>'.
'<a href="'.get_the_permalink($post->ID).'">'.get_the_title($post->ID).'</a>'.
'</li>'.PHP_EOL;
}
wp_reset_postdata(); // 投稿データをリセット
echo '</ul>' . PHP_EOL;
?>
<p>※このページは category.php テンプレートで表示されています</p>
<?php get_footer();?>
get_queried_object()
で現在のカテゴリー情報を取得category.phpでは、get_queried_object()
で現在表示中のカテゴリー情報が取得できます。
$target = get_queried_object();
この関数は以下のような情報を取得できます。
term_id
: ターム IDname
: ターム名slug
: スラッグdescription
: 説明parent
: 親タームの ID(0なら親なし)count
: このタームに属する投稿の数get_queried_object()
はタームIDもスラッグも取得できます。よってカテゴリーの指定は、IDでもスラッグでも可能です。
'category__in' => [$target->term_id],
'category_name' => $target->slug,
カテゴリーページにアクセスした時、ページタイトル(h1
要素)に最初の投稿のタイトルが表示されてしまう問题があります。
例:http://sample.local/news/category/web-sns にアクセスすると → 「SNS総フォロー100人を達成しました」(最初の投稿タイトル)が表示される
これを「Web/SNSのお知らせ」のように適切なタイトルに変更しましょう。
現在のタイトル表示部分
<?php if (!is_front_page()) : ?>
<h1 class="page-title"><?php the_title(); ?></h1>
<?php endif; ?>
ここで!is_front_page()
としている理由をおさらいしましょう。
フロントページ(トップページ)では、header
タグ内にあるサイト名がh1
要素として表示されているため、main
タグ内には別のh1
要素を表示しません。これによりSEO的に適切な1ページ1つのh1
構造を維持しています。
これを以下のように修正します。
<?php
if (is_category()) {
$category = get_queried_object();
echo '<h1 class="page-title">'.$category->name.'のお知らせ</h1>'.PHP_EOL;
} elseif (!is_front_page()) {
echo '<h1 class="page-title">'. get_the_title() .'</h1>'.PHP_EOL;
}
?>
is_category()
でカテゴリーページかどうかを判定if (is_category()) {
// カテゴリーページの場合の処理
}
get_queried_object
のname
で現在表示中のカテゴリー名を取得できます。
$category = get_queried_object();
echo '<h1 class="page-title">'.$category->name.'のお知らせ</h1>'.PHP_EOL;
これにより、「Web/SNS」カテゴリーなら「Web/SNSのお知らせ」というタイトルが表示されます。
今回の記事では、WordPressでカテゴリーごとに個別のページを作成する実装方法を学習しました。
page-news.php
: get_categories()
とget_term_link()
を使ったカテゴリー一覧表示category.php
: get_queried_object()
を使ったカテゴリー別投稿一覧is_category()
を使った条件分岐によるタイトル表示この実装により、ユーザーは興味のあるカテゴリーだけを効率的に閲覧できるようになり、大量の投稿があっても使いやすいWebサイトを構築できます。
さらに、勘の良い方はお気づきかもしれませんが、この手法は「お知らせ」以外にも幅広く応用できます。
例えば
に活用することができます。
つまり、WordPressの投稿機能とカテゴリー機能を組み合わせることで、様々な種類のコンテンツを効率的に分類・表示できる汎用的なシステムが構築できるのです。
次回は、さらに細かい分類としてタグ機能の活用について詳しく解説します。
page-news.php
にタグ一覧を表示tag.php
にタグに該当する投稿の一覧を表示基本的な考え方はカテゴリーと同じですが、タグならではの特徴や実用的な活用方法についても詳しく解説します。お楽しみに!
この記事で作成した成果物は、以下のページでまとめて確認することができます。
WordPressの標準機能では直接カテゴリー順に投稿を並べることができませんが、カテゴリー一覧を取得してループ処理を組み合わせることで実現できます。複数のカテゴリーを含む投稿一覧を、カテゴリー順に並べて表示する実践的なテクニックを詳しく解説します。
WordPressのタグ機能を使った投稿分類システムの実装テクニックを詳しく解説。タグ一覧の表示方法、タグ別投稿一覧ページの作成、カテゴリーとの使い分け方法まで、実践的なコード例とともに学べる内容です。
WordPressを効率よく確実に学ぶためには、学習の順序が大切です。知識が自然に積み上がるよう、学習ステップに沿って記事を順番に並べています。
学習ストーリー第31話まで掲載中