~正しいWP_Queryの使い方徹底解説~

はじめに

WordPressでブログ機能を組み込むコーポレートサイトにおいて、タグアーカイブページは「関連する投稿をユーザーに見せる重要な役割」を担います。

ところが、タグアーカイブページにおいて、正しく投稿が一覧表示されないというトラブルは意外と多く見られます。

本記事では、タグアーカイブページで投稿が表示されない根本的な原因と、それを解決するためのWP_Queryの正しい使い方を詳しく解説します。

現場のWeb担当者、制作パートナーの技術者、どちらにも役立つ内容です。


問題の背景と原因

タグアーカイブページの投稿取得に失敗する多くのケースは、WP_Queryのパラメータ設定ミスが原因です。

よくある誤りは、WP_Queryのtagパラメータにタグの「表示名(single_tag_title()で取得)」を渡してしまうこと。

$args = [
'post_type' => 'post',
'tag' => single_tag_title('', false), // 表示名(日本語含む)を指定 → NG
];

なぜこれがダメなのか?

  • single_tag_title() は現在のタグの「名前(表示用テキスト)」を返します。
  • しかしWP_Queryのtagパラメータは、「タグのスラッグ」を期待しています。

スラッグはURLなどで使われる英数字の識別子であり、これと名前(日本語含む表示用テキスト)は別物です。

よって、表示名を渡すとWP_Queryは該当タグの投稿を正しく取得できず、結果的に空の投稿リストとなります。


正しいタグのスラッグ取得方法とWP_Queryの書き方

WordPressのテンプレートで現在のタグのスラッグを取得するには、get_queried_object()を使うのが正攻法です。

$tag = get_queried_object();
$tag_slug = $tag ? $tag->slug : '';

この$tag_slugをWP_Queryのtagパラメータに渡すことで、正しくタグに紐づく投稿を取得できます。

$args = [
'post_type' => 'post',
'tag' => $tag_slug,
'posts_per_page' => 5,
'order' => 'DESC',
];

$query = new WP_Query($args);

なぜget_queried_object()を使うべきか?

  • 安全性と正確性:現在のタグ情報を丸ごと取得できるため、スラッグ以外の情報も必要に応じて使えます。
  • 多言語サイト対応:日本語の表示名に依存せず、スラッグで安定した動作を保証。
  • メンテナンス性:スラッグは管理画面で明示的に管理されているため、将来的な変更も把握しやすい。

実際に起きうるトラブル例

  • 表示名を渡したために投稿が1件も表示されない
  • スラッグが分からず手動で設定したらURLとズレが生じる
  • カスタムタクソノミーやカスタム投稿タイプで同様の現象が起きる

これらは全て「タグの識別子としてスラッグを使う」という基本ルールを守らなかったことに起因しています。


カスタムタクソノミーにも応用可能

カスタムタクソノミーのターム一覧取得でも同じ原理が適用されます。

$term = get_queried_object();
$term_slug = $term ? $term->slug : '';

$args = [
'post_type' => 'your_custom_post_type',
'tax_query' => [
[
'taxonomy' => 'your_taxonomy',
'field' => 'slug',
'terms' => $term_slug,
],
],
];

まとめ

ポイント説明
WP_Queryのtagは「スラッグ」を使う表示名はクエリに不適切。必ずスラッグを指定。
現在のタグのスラッグはget_queried_object()->slugで取得安全でメンテナンスしやすい方法。
カスタムタクソノミーでも同様にスラッグ指定でクエリを作成カスタム投稿の拡張にも対応。
多言語・日本語サイトは特にスラッグ使用を徹底URLとの齟齬を防ぎ、検索エンジンにも好ましい。

実務で使えるコード例

$tag = get_queried_object();
$tag_slug = $tag ? $tag->slug : '';

$args = [
'post_type' => 'post',
'tag' => $tag_slug,
'posts_per_page' => 5,
'order' => 'DESC',
];

$query = new WP_Query($args);

if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
?>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><br>
<?php
}
wp_reset_postdata();
} else {
echo '投稿がありません';
}

おわりに

タグアーカイブページの投稿表示は、コーポレートサイトのユーザビリティとSEOに直結します。

今回のポイントを押さえ、正しいタグのスラッグ指定でWP_Queryを使うことが、信頼性の高いサイト運用の第一歩です。

技術的な質問やカスタム実装のご相談も随時承っております。お気軽にお問い合わせください。