サポート » 使い方全般 » 取得したカテゴリ情報を配列に格納し、WP_Queryで使用する方法

  • 解決済 wakame2525

    (@wakame2525)


    シングルページ、もしくはアーカイブで取得したカテゴリIDを配列に格納し、WP_Queryで使用したいと考えています。しかしそれを実現するためのコードが分からず頭を抱えています。
    一連の流れは動的に行えるようにしたいと考えています。

    例)
    ①A、Bという2つのカテゴリ(サブカテゴリ含む)に属するシングルページがある
    ②そこでA,Bのカテゴリ情報を取得する。
    ③A,BのカテゴリIDを配列に格納する。
    ④WP_Queryの取得条件()に③をセットする。

    一つのカテゴリを取得して処理することには成功しています。

    <?php if(is_single()): ?>
    	<section class="sideConts newsBox"><h3>test</h3>
    		<div class="inner">
    		<?php
    		    $cats = get_the_category($post->ID);
    		    $catID = $cats[0]->term_id; //ここで本当は複数のカテゴリを取得したい
    			$args = array(
    				'post_type' => 'post',
    				'post_status' => 'publish',
    				'category__and' => $catID, //ここに複数のカテゴリを設定したい
    				'posts_per_page' => 5,
    				);
    			$the_query = new WP_Query($args);
    			if($the_query->have_posts()):
    				while($the_query->have_posts()):
    					$the_query->the_post();
    			 ?>
    			<time><?php the_time('Y.m.d'); ?></time>
    			<p class="articleTtl"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
    			<?php endwhile; endif; ?>
    		</div>
    	</section>
    	<?php elseif ?>

    このソースをベースにして上記を実現することができるととても助かるのですが、
    良い方法はあるでしょうか。

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • トピック投稿者 wakame2525

    (@wakame2525)

    ちょっと説明が抽象的だったようなので、コードを追記します。
    現在改変して以下に至っています。
    困っているのは★の箇所で、ここに複数のカテゴリidを☆の箇所のような感じで動的に取得して入れたいと考えています。☆と★の箇所がうまく動いていないようです。

    $cats = get_the_category($post->ID);
    foreach ($cats as $cat):
    	$catID = $cat->cat_ID; //☆
    endforeach;
    $currID = $post->ID;
    $args = array(
    	'post_type' => 'post',
    	'post__not_in' => $currID,
    	'post_status' => 'publish',
    	'category__and' => $catID, //★
    	'posts_per_page' => 5,
    	'orderby' => 'rand'
    	);

    これ以上策が思いつかないため質問させていただきました。
    よろしくお願いします。

    実際に試してはいませんが
    foreachの前に

    $catID = array();

    foreachの中を

    $catID[] = $cat->cat_ID;

    $argsに入れるところを

    'category__in' => $catID,

    WP_Queryのカテゴリー引数の説明をお読みください。それからPHPの配列の使い方も調べましょう。

    トピック投稿者 wakame2525

    (@wakame2525)

    >gblsm様
    ご助言ありがとうございます。
    配列の処理を完全に間違えていました!
    お陰様でカテゴリIDを配列で取得することは出来ました。
    ありがとうございます。

    ただ、依然として動作がおかしい状態です。
    おかしな箇所は2箇所あります。
    ①○の箇所を記述するとデータが全く吐き出されなくなる。ここを値にしても配列にしても同じ状況になります。
    ②●の箇所で複数のカテゴリIDを取得、セットしても、$catID[0]のカテゴリの情報しか取れてこない。

    <?php
    $cats = get_the_category($post->ID);
        $catID = array();
        foreach ($cats as $cat):
        	$catID[] = $cat->cat_ID;
        endforeach;
    	$args = array(
    		'post_type' => 'post',
    		'post__not_in' => $post->ID,
            // ↑○値にしても配列にしても$the_queryで値が取れてこない。
    		'post_status' => 'publish',
    		'category__and' => $catID,
    		 // ↑●$catID[0]のカテゴリ情報しか表示されない。
    		'posts_per_page' => 5,
    		'orderby' => 'rand',
    		);
    	$the_query = new WP_Query($args);
    			if($the_query->have_posts()):
    				while($the_query->have_posts()):
    					$the_query->the_post();
    ?>
    		<time><?php the_time('Y.m.d'); ?></time>
    			<p class="articleTtl"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
    <?php endwhile; endif; ?>

    恥ずかしながら知識不足のため、大きな勘違いをしているかと思います。
    現在再度内容を検証中です。
    引き続き参考となるご意見を募集させていただきます。
    よろしくお願いします。

    wakame2525さん、WP_Queryの他のパラメーターについての説明も確かめましょう!

    以下の点が間違っていると思います。

    • post__not_in に指定する値は、配列形式。
    • category__and ではなく、category__in を使いましょう

    category__and は「指定したカテゴリーのぜんぶが付いた投稿」、category__in は「指定したカテゴリーのうち一つ以上が付いた投稿」です。

    wakame2525さん、失礼しました。直前の私のコメントは無視してください(勘違いしていました)。

    PHPのvar_dumpを使って、変数にどんな値が入っているか表示させて確認してみませんか。例えば

    <?php
    echo '<pre>';
    var_dump( $post );
    echo '</pre>';
    ?>

    心配になったので、下記のコードをsingle.phpの先頭(get_headerの後)に入れて試してみると、狙ったように動きました。

    <?php
      $cats = get_the_category( $post->ID );
      $catID = array();
      foreach ( $cats as $cat )
        $catID[] = $cat->cat_ID;
      $args = array(
        'post_type'      => 'post',
        'post__not_in'   => array( $post->ID ),
        'post_status'    => 'publish',
        'category__and'  => $catID,
        'posts_per_page' => 5,
        'orderby'        => 'rand',
      );
      $the_query = new WP_Query( $args );
      if ( $the_query->have_posts() ) :
        while ( $the_query->have_posts() ) :
          $the_query->the_post(); ?>
    <time><?php the_time('Y.m.d'); ?></time>
    <p class="articleTtl"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
        <?php endwhile;
      else:
        echo '<div>投稿が見つかりません。</div>';
      endif;
    ?>

    トピック投稿者 wakame2525

    (@wakame2525)

    >gblsm様
    度々お世話になります><
    結論から言うと、上記ご紹介いただいたスクリプトでも自分の行いたいデータ表示はできませんでした。もしかすると子カテを使っているからかな…と思い始めています。
    これについては後ほど書かせていただきます。

    まず、gblsm様のスクリプトと自分のスクリプトを比較したところ、下記違いが認められました。

    'post__not_in' => array( $post->ID ),
    ここはやはりCodexの通り配列なのですね。一応私も試しては見たのですが、思うように動かず…。
    やはり一つのカテゴリの情報しか表示されないんです。
    var_dumpはステップごとに念のため実行しています。

    現段階での問題点と私のやりたいことを再度整理してみます。
    ①WP_Queryで取得する投稿情報から現在の投稿を除きたい(シングルページ)
    ②複数のカテゴリに関する情報を表示できるようにしたい。
    カテゴリの構造は以下のとおりです。

    親カテ > 子カテ複数 > 孫カテ複数

    取得するカテゴリidは子カテと孫カテになります。親カテは基本取りません。
    $argsでより詳細な設定が必要な気もしてきました。

    引き続き検証を続けるので、解決に向けて経過とともにvar_dumpの結果も公開していきたいと思います。

    トピック投稿者 wakame2525

    (@wakame2525)

    >gblsm様
    ちなみにこちらのご助言ですが、
    「category__and は「指定したカテゴリーのぜんぶが付いた投稿」、category__in は「指定したカテゴリーのうち一つ以上が付いた投稿」です。」

    ズバリその通りで私のリファレンスの読み間違いでした@@;
    category__in に変更したところ、だいぶ目指していた形態に近づきました。
    あとは指定件数の5件をきっちり出すだけになりました(5件表示されているページとそうでないページがあることが判明しました。ちなみに記事数は十分あります。)

    とても助かるご指摘ありがとうございます。今後の勉強指針もたちました。

    引き続き内容を見直します。

    トピック投稿者 wakame2525

    (@wakame2525)

    現在の問題点:シングルページサイドバーにて、指定カテゴリの記事5記事をランダム表示させたいが、5記事未満しか表示されないのページがある。

    カテゴリ情報が確実にとれているか、また取得したカテゴリの記事数はいくつかを調べました。

    $cats = get_the_category( $post->ID );
      $catID = array();
      $catName = array();
      foreach ( $cats as $cat ):
        $catID[] = $cat->cat_ID;
    	$catName[] = $cat->name;//カテゴリ名の確認のため追記
      endforeach;
      var_dump($catID); //検証
      var_dump($catName); //検証

    検証結果は次の通り。

    var_dump($catID);
    array(2) { [0]=> int(3) [1]=> int(4) }

    var_dump($catName);
    array(2) { [0]=> string(6) “testaa” [1]=> string(6) “testbb” }
    カテid=3の記事数は4です。カテid=4の記事数は7です。
    合計11記事あるのでその中から5記事を表示することは可能なはずです。
    ですが、実際は4記事しか表示されていませんでした。
    記事はちゃんと2つのカテゴリから引かれています。
    本日の検証は一旦ここまでとします。

    post__not_in を無くして検証してみては?

    投稿ステータスが publish ではない投稿が混じっていませんか?

    トピック投稿者 wakame2525

    (@wakame2525)

    ご報告です。
    最終的に以下の記述できちんと複数カテゴリの記事が5件表示されました。

    <?php
    	if(is_single()):
    ?>
    <section class="sideConts newsBox">
    	<h3>test</h3>
    	<div class="inner">
    	<?php
    	  $cats = get_the_category( $post->ID );
    	  $catID = array();
    	  $catName = array();
    	  foreach ( $cats as $cat ):
    	    $catID[] = $cat->cat_ID;
    		$catName[] = $cat->name;
    	  endforeach;
    	  $args = array(
    	    'post_type'      => 'post',
    	    'post__not_in'   => array( $post->ID ),
    	    'post_status'    => 'publish',
    	    'category__in'  => $catID,
    	    'posts_per_page' => 5,
    	    'orderby'        => 'rand',
    	  );
    	  $the_query = new WP_Query( $args );
    	  if ( $the_query->have_posts() ) :
    	    while ( $the_query->have_posts() ) :
    	      $the_query->the_post(); ?>
    	<time><?php the_time('Y.m.d'); ?></time>
    	<p class="articleTtl"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
    	    <?php endwhile;
    	  else:
    	    echo '<p>記事はありません。</p>';
    	  endif;
    	?>
    	</div>
    <?php endif ?>

    残念ながら最後の記事数の問題については明確な原因が分からないままでした。
    特に記述は直していないのですが…。
    まさかうまく動いていない時のキャッシュが残っていたのでしょうか(;´Д`)

    本件解決しましたのでトピックを閉めさせていただきます。
    基本的なところから何度もアドバイスを下さったgblsm様、本当にありがとうございました!

    トピック投稿者 wakame2525

    (@wakame2525)

    リロードしたらレスが!
    追記させて下さい。
    >gblsm様
    ・post__not_in を無くして検証
    今朝念のためやってみましたが、現在の記事が表示、非表示になるだけでした。
    ほか動作に問題はありませんでした。

    ・投稿ステータスが publish ではない投稿
    こちらは混ざっていませんでした。

    現在は問題なく動いています。
    キャッシュクリアで確認もしました。

    本当に色々とありがとうございました(>_<)
    勉強させていただきました。

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • トピック「取得したカテゴリ情報を配列に格納し、WP_Queryで使用する方法」には新たに返信することはできません。