複数のタクソノミーで関連記事一覧を取得する方法

投稿日:2024.12.24.
更新日:2025.04.12.

WordPress

株式会社TREVOの月額制ホームページ制作サービス
PR

板浪 雅樹
執筆・編集 板浪 雅樹

2005年から WEB 業界一筋。500サイト超を手がける SEO・WordPress のエキスパート。「公開後こそ本番」を掲げ、データ分析とユーザー視点で成果を引き出す運用を提案。

2005年に制作会社へ入社後、プログラマーからキャリアをスタート。サーバー構築・データベース設計で培った技術を強みに、WordPress テーマ/プラグイン開発やサイト移行の難案件を多数担当してきました。
2010年以降は SEO エンジニアとしても活動領域を拡大。コンテンツ設計・内部リンク最適化・高速化チューニングにより、競合の激しいビッグキーワードで上位獲得を実現してきました。
現在は TREVO のウェブディレクターとして、要件定義から運用改善まで一気通貫でリード。AI ライティングや GA4/Looker Studio を活用したレポーティング手法を開発し、「数字で説明できるサイト運用」をポリシーにクライアントの ROI 最大化を支援しています。
趣味/強み:筋トレとランニングで日々の集中力をキープ。複雑な課題を“仕組み”で解決するのが得意。
モットー:「サイトは資産。改善を止めた瞬間から価値は目減りする」

WordPressの投稿やカスタム投稿タイプで、関連する記事を表示させる方法を解説します。
この手法は、同じカテゴリやタクソノミーに属する記事を取得し、記事一覧として出力する場合に役立ちます。

基本: 同じタクソノミーに属する関連記事を表示

WordPress覚書 その3 「特定のタクソノミーに属するタームの取得と記事一覧の出力とか」を参考にしました。

○○○○:取得したいタームのあるタクソノミー
△:表示したい件数
□□□□:投稿タイプ(カスタム投稿タイプ)post等

<?php
$term_var = get_the_terms($post->ID, '○○○○'); // タクソノミーの取得
$postQuery = new WP_Query();
$param = array(
    'posts_per_page' => '△', // 表示件数
    'post_type' => '□□□□', // 投稿タイプ
    'paged' => $paged, // ページ番号
    'post__not_in' => array(get_the_ID()), // 現在の投稿を除外
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => '○○○○',
            'field' => 'slug',
            'terms' => $term_var[0] // 取得したタクソノミーを指定
        )
    )
);
$postQuery->query($param);
?>
<?php if ($postQuery->have_posts()) : ?>
    関連記事一覧<br>
    <?php while ($postQuery->have_posts()) : $postQuery->the_post(); ?>
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><br>
    <?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>

複数タクソノミーで関連記事を取得

複数のタクソノミーに属する記事を取得する場合、tax_query に追加する形でタクソノミーを指定できます。

relationの設定

AND:すべてに該当する投稿を取得する
OR:いずれかに該当する投稿を取得する

○○○○:1つ目の取得したいタームのあるタクソノミー
●●●●:2つ目の取得したいタームのあるタクソノミー
△:表示したい件数
□□□□:投稿タイプ(カスタム投稿タイプ)post等

<?php
$term_var = get_the_terms($post->ID, '○○○○'); // タクソノミー1
$term_var2 = get_the_terms($post->ID, '●●●●'); // タクソノミー2
$postQuery = new WP_Query();
$param = array(
    'posts_per_page' => '△',
    'post_type' => '□□□□',
    'paged' => $paged,
    'post__not_in' => array(get_the_ID()),
    'tax_query' => array(
        'relation' => 'AND', // 両方の条件を満たす投稿を取得
        array(
            'taxonomy' => '○○○○',
            'field' => 'slug',
            'terms' => $term_var[0]
        ),
        array(
            'taxonomy' => '●●●●',
            'field' => 'slug',
            'terms' => $term_var2[0]
        )
    )
);
$postQuery->query($param);
?>
<?php if ($postQuery->have_posts()) : ?>
    関連記事一覧<br>
    <?php while ($postQuery->have_posts()) : $postQuery->the_post(); ?>
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><br>
    <?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>

タームを指定して関連記事を取得

relationの設定

AND:すべてに該当する投稿を取得する
OR:いずれかに該当する投稿を取得する

○○○○:1つ目の取得したいタームのあるタクソノミー
●●●●:2つ目の取得したいタームのあるタクソノミー
▼▼▼▼:2つ目の取得したいターム
△:表示したい件数
□□□□:投稿タイプ(カスタム投稿タイプ)post等

<?php
$taxonomy_slug = '○○○○'; // タクソノミー1
$post_type_slug = '□□□□'; // 投稿タイプ
$post_terms = wp_get_object_terms($post->ID, $taxonomy_slug); // 現在の投稿のタクソノミーを取得

if ($post_terms && !is_wp_error($post_terms)) {
    $terms_slug = array();
    foreach ($post_terms as $value) {
        $terms_slug[] = $value->slug;
    }
}

$args = array(
    'post_type' => $post_type_slug,
    'posts_per_page' => △,
    'orderby' => 'rand', // ランダムで取得
    'post__not_in' => array($post->ID),
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => $taxonomy_slug,
            'field' => 'slug',
            'terms' => $terms_slug // 現在の投稿と同じタクソノミー
        ),
        array(
            'taxonomy' => '●●●●', // 別のタクソノミーを指定
            'field' => 'slug',
            'terms' => '▼▼▼▼' // 特定のタームを指定
        )
    )
);

$the_query = new WP_Query($args);

if ($the_query->have_posts()) : ?>
    関連記事<br>
    <?php while ($the_query->have_posts()) : $the_query->the_post(); ?>
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><br>
    <?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>

relation の設定

relation には以下の2つがあります。

AND: すべての条件を満たす投稿を取得。
OR: いずれかの条件を満たす投稿を取得。

注意点

get_the_terms の使用

get_the_terms はタクソノミーを取得する関数ですが、取得結果が配列で返されるため、適切に扱う必要があります。

wp_reset_postdata の使用

カスタムクエリを使用した後は、必ず wp_reset_postdata() を使用して、グローバルクエリをリセットしてください。

投稿タイプの確認

post やカスタム投稿タイプなど、対象となる投稿タイプを正しく指定します。

関連の記事

  • no image

    WEBデザイナーがアートとデザインの違いを考えてみる

    • 衣川知秀 のアバター衣川知秀
  • WebサイトのURLには「www」あり・なしどちらがいいの?

    WebサイトのURLには「www」あり・なしどちらがいいの?

    • 衣川知秀 のアバター衣川知秀
  • no image

    やってはいけない間違ったSEO対策について

    • 衣川知秀 のアバター衣川知秀
  • Googleアナリティクスのキーワード分析で「not provided」の中身を調べる方法

    Googleアナリティクスのキーワード分析で「not provided」の中身を調べる方法

    • 衣川知秀 のアバター衣川知秀
  • 【追記2023/2/22】ネット印刷の安い理由と特徴について

    【追記2023/2/22】ネット印刷の安い理由と特徴について

    • 衣川知秀 のアバター衣川知秀
  • GoogleのSEO対策が次のステップへ踏み出そうとしています。

    GoogleのSEO対策が次のステップへ踏み出そうとしています。

    • 板浪雅樹 のアバター板浪雅樹
CONTACT

ホームページ制作・Web制作に関するご質問やご相談は、
下記フォームよりお問い合わせください。

無料のお見積りや初回のご相談も承っておりますので、「まだ検討中」「ちょっと話を聞いてみたい」といった段階でも大歓迎です。
現状のホームページ診断も無料で実施中です。

0120-83-8567
平日9:00~18:00まで 定休日:土 日 祝