サポート » 使い方全般 » single.php内に同じタクソノミの同じタームの記事一覧を表示

  • rei15

    (@rei15)


    こんにちは。

    single.phpに記事の the_content() 以外にも記事を同じタームに所属しているほかの記事一覧も出したいのですが、うまくいきませんでした。
    長い説明になりますが、どうかご教授いただければ幸いです。
    よろしくお願いいたします。

    以下の2つのページを作っています。

    (1) taxonomy-hoge.php:
    タームが「hoge1」に設定されている記事一覧

    (2) single-hoge.php:
    タームが「hoge」に設定されている記事の詳細 ※(1)を押してから表示されるページ
    ただし、(2)の左側にはメニューとして(1)を表示したいです。

    ■イメージ
    custom taxonomy: hoge
    ├ hoge1 ————- 記事A, 記事B
    └ hoge2 ————- 記事C, 記事D

    ■taxonomy-hoge.phpの形:hoge1に所属している記事のタイトル一覧

    <ul>
    <li><a href="記事詳細へ">記事A</a></li>
    <li><a href="記事詳細へ">記事B</a></li>
    </ul>

    ■single-hoge.phpの形(記事Aのリンクを押した場合)

    <!-- 左側に一覧 -->
    <div>
    <ul>
    <li>記事A</li>
    <li>記事B</li>
    </ul>
    </div>
    <!-- 右側に詳細 -->
    <p>記事Aの詳細 the_content() 内容</p>

    ■taxonomy-hoge.php

    <ul>
    <?php if(have_posts() ) : while(have_posts()) : the_post(); ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; ?>
    <?php endif; ?>
    </ul>
    
    <p><?php previous_posts_link('PREV'); ?></p>
    <p><?php next_posts_link('NEXT'); ?></p>

    ページ送りも問題ないです。

    しかし、single.phpになると、うまくいきませんでした。

    <article>
    <?php if(have_posts() ): while(have_posts()) : the_post(); ?>
    <p><?php esc_html(the_content()); ?>
    <?php endwhile; endif; ?>
    </article>
    
    <?php
    /* single.phpの中だと、記事一覧が取れないと思い、query_postsを使いました */
    $args = array(
        'post_type' => 'my_post',
        'tax_query' => array(
            array(
                'taxonomy' => 'hoge',
                'field'    => 'slug',
                'terms'    => "hoge1",
            )
        )
    );
    $loop = new WP_Query($args);
    ?>
    <ul>
    <?php while($loop->have_posts()) : $loop->the_post(); ?>
        <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; ?>
    
    <p><?php previous_posts_link('PREV'); ?></p>
    <p><?php next_posts_link('NEXT'); ?></p>
    
    <?php wp_reset_query(); ?>

    そうすると、ページ送りがうまくいきませんでした(表示されません)。

    ★single.phpの中で、記事リスト一覧を出すには query_postを使ったのですが、適切でしょうか。

    ★taxonomy-hoge.phpの場合は、functionsに以下を書きました。

    function my_pre($query){
        if($query->is_tax("hoge")){
            $query->set('post_type', array('my_post'));
            $query->set('post_status', 'publish');
            $query->set('posts_per_page', '5');
            $query->set('order_by', 'date');
            $query->set('order', 'DESC');
        }
    add_filter('pre_get_posts','my_pre');

    posts_per_pageを設定していたのですが、これがどうも single.phpにも影響をしています。

    言葉で説明するのが難しくて大変読みづらい文章となっていて申し訳ないですが、
    躓いているので、この辺詳しい方がいればアドバイスいただければ助かります。
    不足している情報があれば、教えていただければ補足します。

    よろしくお願いします。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • jdbb

    (@jdbb)

    ぱっと見で思いつくところですが(他にもありましたらお願いします。)
    最後のfunctionsに書いたpre_get_postsのフックですが

    まず、メインクエリかどうかの判定を入れてください。
    また、管理画面にも影響しますのでその判定も最初に入れておいたほうがいいです。

    function my_pre($query){
        if(is_admin()) return; //管理画面の場合はスルー
        if($query->is_main_query() && $query->is_tax("hoge")){ //メインクエリ判定追加
            $query->set('post_type', array('my_post'));
            $query->set('post_status', 'publish');
            $query->set('posts_per_page', '5');
            $query->set('order_by', 'date');
            $query->set('order', 'DESC');
        }
    add_filter('pre_get_posts','my_pre');
    トピック投稿者 rei15

    (@rei15)

    jdbb様、

    目を通していただいてありがとうございます。
    そして、アドバイスありがとうございます。

    is_main_query() を入れても結果が変わらなかったです。
    if文に入ってしまいます。

    シングルページのURLが、http://domain/hoge/hoge1 のようになっていることは関係あるのでしょうか。
    シングルページなのに、なぜか、is_tax() が効いてしまうところも分からないです。

    ★single.phpの中で、記事リスト一覧を出すには query_postを使ったのですが、適切でしょうか。

    こちらについても、jdbb様が思うことがあれば意見いただければと思います。

    質問ばかりで大変申し訳ないです。
    私もやり方がわかったらシェアしておきます。

    よろしくお願いします。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「single.php内に同じタクソノミの同じタームの記事一覧を表示」には新たに返信することはできません。