• 解決済 yskhori

    (@yskhori)


    掲題の件が実現できず困っており、お力をお貸しいただけないでしょうか?

    現在、ひとつの記事に対して、複数のカテゴリを設定しています。
    以下の例で言いますと、■という記事に対してA-1とB-2の2つの子カテゴリが設定されている状態です。

    親カテゴリA
    -子カテゴリA-1
    -子カテゴリA-2
    親カテゴリB
    -子カテゴリB-1
    -子カテゴリB-2

    ■の記事ページ(single.php)に、同じA-1のカテゴリが設定されている別の記事を複数表示をしたいのですが、ケースによって、A-1ではなく、B-2を取得して、B-2カテゴリを持つ別記事が表示されてしまったりします。

    現在のコードです。

    <?php $cat = get_the_category(); $cat = $cat[0]; ?>
    <?php $bk_wp_query = clone $wp_query; ?>
    <?php query_posts( array('cat' => $cat->cat_ID, 'showposts' => 4,'orderby' => 'rand', 'post__not_in' => array($post->ID)) ); ?>
    
    <?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>
    ・・・出力・・・
    <?php endwhile; wp_reset_query();?>

    親カテゴリAを指定して、もしくは親カテゴリBを除外して、Aに属する子カテゴリ内で同じカテゴリを持つ別記事を出したいのですが、実現可能でしょうか?

    ※カテゴリを全部取得して、もし親がAなら、Aに属するカテゴリIDをquery_postsに代入する、ということなのかと思うのですが、コードがわかりません・・・

    どうぞよろしくお願いいたします。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • yousan

    (@hogetan)

    なるほど、複数のカテゴリを持つ記事に対して、同じカテゴリで関連する記事などを表示させたい、とのことですね。

    条件とコードを見ていたのですが、厳密には不可能かと思われます。
    p1: 記事1, p2: 記事2 , p3: 記事3
    としたとき、それぞれのカテゴリが
    p1: (a-1, b-2)
    p2: (a-1)
    p3: (b-2)
    となっているとすれば、p1のsingle.phpでp2を取得して表示させたいのにp3が表示されてしまう、ということですね。

    これはどこかしらかでカテゴリAを辿って表示させよ、という命令が必要です。
    作者側が明示的に特定のカテゴリを埋めてやる必要がある、ということですね。プログラムは自動的にどの親カテゴリを重要視するかわからないので指定が必要、ということです。

    コード中にある
    $cat = get_the_category(); $cat = $cat[0];
    ですが、p1で取得されたカテゴリ一覧から、無作為に0番目のカテゴリを採用しています。ここで恐らく後ろ側のb-2を関連させるカテゴリとして採用してしまっているのですね。
    状況によってはa-1が取れるかもしれませんが、a-1が取られるかb-2が取られるかは不明瞭です。

    さてここで、カテゴリAを親カテゴリとしてその兄弟カテゴリを基準に他の記事を、ということでしたら可能です。

    僕から参考までに、コード例を載せておきます。AのカテゴリIDを事前に調べておき、Aカテゴリにひっかかる子カテゴリを拾っておいてからwp_queryする方法です。

    foreach(get_the_category() as $category) {
       if ($category->parent == 2) { // 2はAのカテゴリのIDとします
          $categories_to_put[] = $category->term_id;
       }
    }
    $wp_query = WP_Query(array('category__in' => $categories_to_put));

    このコードは引数チェックなどしていない不完全ですので参考までにどうぞ。

    トピック投稿者 yskhori

    (@yskhori)

    hogetanさま

    お忙しいところご回答いただきまして、誠にありがとうございます!
    サイトに反映してみた限りでは、問題なく動いているようなのですが、
    「引数チェックなどしていない不完全な状態」という点が気になりました。

    こちらは追加で引数をチェックするようなコードを入れたほうがよい、ということでしょうか?(何度も申し訳ございません!)

    <?php foreach(get_the_category() as $category) {
       if ($category->parent == 19) {
          $categories_to_put[] = $category->term_id;
       }
    }?>
    
    <?php query_posts( array('category__in' => $categories_to_put, 'showposts' => 4,'orderby' => 'rand', 'post__not_in' => array($post->ID)) ); ?>
    
    <?php if (have_posts()) : ?>
    ・・・
    yousan

    (@hogetan)

    早速入れてみられたそうで、そして動いているようでよかったです(^ν^)

    引数チェックをしていない件については、「リファレンスを調べたり、実際に動かしたりしていないので、”category__in”などの名前が正確なものか自信がない」との意味でした。

    yousan

    (@hogetan)

    トピック投稿者 yskhori

    (@yskhori)

    hogetanさま

    お世話になります。
    ご回答ありがとうございました!

    コードチェックの件、了解いたしました。
    とても自分では解決できないコードでしたので、大変助かりました!!

    最後に1点だけご相談なのですが、このコードを2つ並べて、以下のとおり
    親カテゴリが19の記事と、親カテゴリが290の記事を並べてみたのですが、
    2つ並べると上の19の記事は機能するのですが、下の290の記事がうまく
    取得できていないようなのです。。

    こういったコードは1ページに2つあるとうまく動かない、などの制限は
    あったりするのでしょうか??
    もし何かそういった点があるようでしたら、ご教授いただけますと幸いです

    よろしくお願いしますm(._.)m

    <?php foreach(get_the_category() as $category) {
       if ($category->parent == 19) {
          $categories_to_put[] = $category->term_id;
       }
    }?>
    <?php query_posts( array('category__in' => $categories_to_put, 'showposts' => 4,'orderby' => 'rand', 'post__not_in' => array($post->ID)) ); ?>
    <?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>
    // 記事出力(親が19)
    <?php endwhile; wp_reset_query();?>
    <?php else : ?>
    <div class="post">
    <div>
    <h1>Not Found</h1>
    <p>Sorry, but you are looking for something that isn't here.</p>
    </div>
    </div>
    <?php endif; wp_reset_query();?>
    
    <?php foreach(get_the_category() as $cat) {
       if ($cat->parent == 290) {
          $categories_to_put[] = $cat->term_id;
       }
    }?>
    <?php query_posts( array('category__in' => $categories_to_put, 'showposts' => 4,'orderby' => 'rand', 'post__not_in' => array($post->ID)) ); ?>
    <?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>
    // 記事出力(親が290)
    <?php endwhile; wp_reset_query();?>
    <?php else : ?>
    <div class="post">
    <div>
    <h1>Not Found</h1>
    <p>Sorry, but you are looking for something that isn't here.</p>
    </div>
    </div>
    <?php endif; wp_reset_query();?>
    yousan

    (@hogetan)

    期待に添えるようなものでよかったです。
    手元で試験しているわけではないのでまたもやあれなのですが、中央あたりの
    <?php endif; wp_reset_query();?>
    この行に、the_post(); を入れてみてはどうでしょうか。
    <?php endif; wp_reset_query(); the_post(); ?>

    トピック投稿者 yskhori

    (@yskhori)

    hogetanさま

    またまたありがとうございます!
    the_post(); をやってみたのですが、どうもうまくいかずで・・・
    自分でいろいろやってみた結果、「$categories_to_put」の
    変数を上と下で変えてやってみたらうまく行きました!!

    なんとか思い通りのものができました。
    今回はいろいろ助けていただき、感謝しております!

    これで解決済としたいと思います。
    また何かありましたら、ご相談にのっていただけますと幸いです。

    どうぞよろしくお願い致します。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「複数のカテゴリを持つ記事で、同じカテゴリの別記事を表示したい」には新たに返信することはできません。