関連する記事
条件を極める!WP_Query抽出条件の実践テクニック
WordPressのWP_Queryを使って、特定のカテゴリーや期間の投稿を絞り込む抽出条件について解説。カテゴリー指定、日付による絞り込み、複数条件の組み合わせなど、サイトのニーズに応じた柔軟な投稿一覧を作成する実践的なテクニックを学習できます。
前回の記事では、WP_Query
の抽出条件について詳しく学習し、特定のカテゴリーや日付での投稿絞り込み方法をマスターしました。今回は、これまでの学習の応用として、投稿をカテゴリー順に並べて表示する実践的なテクニックを学習します。
WP_Query
の標準機能では直接カテゴリー順に並べることができませんが、カテゴリー一覧を取得してループ処理を組み合わせることで、この課題を解決できます。
今回の目標
get_categories()
関数の使い方をマスターする目次
前回までの学習で、orderby
を使った並び替えと、特定のカテゴリーを抽出する方法を学びました。しかし、「複数のカテゴリーを含む投稿一覧を、カテゴリー順に並べて表示する」ことは、WP_Query
の標準機能だけでは実現できません。
なぜなら、orderby
パラメータにはカテゴリーを指定する項目がないからです。1つの投稿に複数のカテゴリーを設定できるWordPressの仕様上、どのカテゴリーを基準に並び替えるかが曖昧になってしまうためです。
orderby
ではカテゴリー順に並べられませんが、以下のアプローチで同等の結果を実現できます:
get_categories()
関数を使用foreach
でカテゴリーを順番に処理category__in
で該当する投稿を取得この方法により、「カテゴリー順に並べたのと同等」の表示を実現できます。
page-news.phpを以下のように修正しましょう。
<?php get_header();?>
<?php the_content(); ?>
<?php
// カテゴリー一覧を取得
$categories = get_categories([
'hide_empty' => true, // 投稿がないカテゴリーは除外
]);
echo '<ul class="post-list">' . PHP_EOL;
// カテゴリーごとにループ
foreach ($categories as $category) {
// そのカテゴリーに属する投稿を取得
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'orderby' => 'title',
'order' => 'asc',
'category__in' => [$category->term_id],
];
$query = new WP_Query($args);
while ($query->have_posts()) {
$query->the_post();
echo '<li>'.
'<span class="date">'.get_the_date('Y年m月d日').'</span>'.
'<span class="category">'.$category->name.'</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>※このページは page-news.php テンプレートで表示されています</p>
<?php get_footer();?>
get_categories()
でカテゴリー一覧を取得// カテゴリー一覧を取得
$categories = get_categories([
'hide_empty' => true, // 投稿がないカテゴリーは除外
]);
get_categories
はカテゴリー一覧をを取得するWordPress関数です。
hide_empty
パラメーター(投稿がないカテゴリーを非表示)をtrue
にすることで抽出されるカテゴリーは、必ず該当する投稿があることになります。
// カテゴリーごとにループ
foreach ($categories as $category) {
// そのカテゴリーに属する投稿を取得
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'orderby' => 'title',
'order' => 'asc',
'category__in' => [$category->term_id],
];
// 省略
}
$categories
変数に格納されたカテゴリー一覧をforeach
で1つずつ処理します。
投稿の抽出条件に 'category__in' => [$category->term_id]
を指定することで、指定したカテゴリーに紐づく投稿だけが抽出されます。
$query = new WP_Query($args);
while ($query->have_posts()) {
$query->the_post();
// 省略
}
wp_reset_postdata(); // 投稿データをリセット
foreach
のループでWP_Query
によるデータ抽出を行っています。このように連続してWP_Query
を実行する際は、必ずwp_reset_postdata
でWP_Query
をリセットしてください。該当データがないのに前回のデータが残るなど、予期せぬ動作をすることがあります。
表示結果をより見やすくするために、スタイルシートで見た目を調整します。main.cssに以下のスタイルを追加しました。
.post-list .date {
display: inline-block;
width: 9.0rem;
}
.post-list .category {
display: inline-block;
width: 6.0rem;
}
このスタイルによって日付とカテゴリーの幅が揃って、見やすくなります。
現在のコードでは、カテゴリーはWordPressのデフォルト順序で並んでいます。しかし、実際のWebサイトでは「重要なカテゴリーを上に表示したい」「特定の順序で並べたい」といったニーズがあります。
WordPress標準の機能では、カテゴリーの表示順序を自由に変更することが意外と難しいのが現実です。管理画面でドラッグ&ドロップによる直感的な並び替え機能や順序の入力は提供されていません。
そこで、プラグインの力を借りることをおすすめします。
カテゴリーの並び順を管理するプラグインとして、Category Order and Taxonomy Terms Orderが特におすすめです。
プラグインを有効化すると、管理画面に新しいメニューが追加されます。
1. 新店舗
2. イベント
3. WEB/SNS
4. 休業
5. 未分類
プラグインによる並び順は、get_categories()
で自動的に反映されます。
Category Order and Taxonomy Terms Order
による並び替えが完了したら、再度、投稿一覧を表示して以下の点を確認しましょう。
今回の記事では、WP_Queryの応用テクニックとして、投稿をカテゴリー順に並べる方法を学習しました。
get_categories()
→ カテゴリー一覧の取得foreach
ループ → カテゴリーごとの処理category__in
→ 特定カテゴリーの投稿抽出wp_reset_postdata()
→ 投稿データのリセットこの手法をマスターすることで、企業サイトのニュース一覧やブログのカテゴリー別表示など、実践的なWebサイト構築に活用できるようになります。
次回は、さらに実用的な機能として「カテゴリーごとにページを分ける」方法について詳しく解説します。
category.phpテンプレートの作成方法について詳しく解説します。カテゴリー別のページを作成することで、より使いやすいWebサイトを構築できるようになります。お楽しみに!
この記事で作成した成果物は、以下のページでまとめて確認することができます。
WordPressのWP_Queryを使って、特定のカテゴリーや期間の投稿を絞り込む抽出条件について解説。カテゴリー指定、日付による絞り込み、複数条件の組み合わせなど、サイトのニーズに応じた柔軟な投稿一覧を作成する実践的なテクニックを学習できます。
WordPressでカテゴリーごとに個別のページを作成する実用的なサイト構築テクニック。投稿をカテゴリー別に分けて表示することで、大量の投稿があっても見やすく、ユーザーが興味のあるカテゴリーだけを効率的に閲覧できるWebサイトを構築できます。
WordPressを効率よく確実に学ぶためには、学習の順序が大切です。知識が自然に積み上がるよう、学習ステップに沿って記事を順番に並べています。
学習ストーリー第31話まで掲載中