###≪実現したいこと≫
まず、自作のWordPressで以下のことを実現したいと思い試行錯誤しました。
「サブループにある一連の投稿を任意のカテゴリーにアーカイブ表示させたい」
(例) 【A・B・C】の3つのカテゴリーに分類された、[1~10]の投稿記事を以下のようにサイト上に一覧表示させたい
【A】[記事1] [記事4] [記事6] [記事9] [記事10]
【B】[記事2] [記事3] [記事8]
【C】[記事5] [記事7]
これを実現するために、以下のコードを記述すれば問題なく、私が望んでいることが実現できました。
PHP
1<?php 2$taxonomyがproduct_classの全投稿 = array('taxonomy' => 'product_class'); 3$全カテゴリー = get_categories($taxonomyがproduct_classの全投稿); 4?> 5 6<?php foreach ($全カテゴリー as $各カテゴリー) : ?> 7 8 <h2 class="each-category"> 9 <?php echo $各カテゴリー->name; ?> 10 </h2> 11 12 <ul> 13 14 <?php 15 query_posts( 16 array( 17 'posts_per_page' => '99', 18 'post_type' => 'product', 19 'post_status' => 'publish', 20 'orderby' => 'Date', 21 'order' => 'ASC', 22 'taxonomy' => 'product_class', 23 'term' => $各カテゴリー->slug 24 ) 25 ); ?> 26 27 <?php if (have_posts()) : while (have_posts()) : the_post(); ?> 28 29 <div class="each-post"> 30 <li> 31 カテゴリーに該当する記事 32 </li> 33 </div> 34 35 <?php endwhile; ?> 36 <?php endif; ?> 37 <?php wp_reset_postdata(); ?> 38 </ul> 39 40<?php endforeach; ?>
しかし、一見同じに思えるコードを記述したのですが、うまく反映しないことがありました。
それは<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
の部分のコードを少し変えると以下のような違いがありました。
この部分で何がどう裏側で処理されているのか、詳しく教えていただけないでしょうか?
###1.<li>に出力されるはずの投稿記事がまったく反映されない
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
を以下のように記述するとうまく反映されません。
PHP
1<?php if ($have_posts()) : ?> 2<?php while (have_posts()) : the_post(); ?>
一見、同じに見えるのですが、if とwhile をわけて PHPを記述すると**<li> に出力されるはずの投稿記事がまったく反映されません。**
なぜ、同じ <?php ?>
の中で記述しいないというだけで出力されないのでしょうか?
###2.一番はじめのカテゴリーの投稿で無限ループになり抜け出せない
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
を以下のように記述するとうまく反映されません。
PHP
1<?php $全投稿 = have_posts(); ?> 2<?php if ($全投稿) : while ($全投稿) : the_post(); ?>
① have_posts(); を変数に代入
② if と while に変数を入れる
これだと、一番初めのカテゴリー今回だと【A】は問題なく取得できます。
しかし、以下のように[記事10]の後が無限ループになってしまいます。
【A】[記事1] [記事4] [記事6] [記事9] [記事10]・・・・・・・・・・・・・・・・・・・・・・・・・
なぜ、<?php endwhile; ?>
を記述しているにも関わらず、カテゴリー【A】から抜け出せずに無限ループになってしまうのでしょうか?
###3.$wp_query->have_posts() は問題なく反映させる
代入することがまったくダメなのかと言えばそうではありません。
以下の代入したコーディングだと問題なく反映しました。
PHP
1 <?php 2 $wp_query = new WP_Query( 3 array( 4 'posts_per_page' => '99', 5 'post_type' => 'product', 6 'post_status' => 'publish', 7 'orderby' => 'Date', 8 'order' => 'ASC', 9 'taxonomy' => 'product_class', 10 'term' => $各カテゴリー->slug 11 ) 12 ); ?> 13 14 <?php if ($wp_query->have_posts()) : while ($wp_query->have_posts()) : the_post(); ?>
query_posts
の部分を$wp_query = new WP_Query
に代入する。
そして、以下の様にコーディングすると問題なく反映しました。
<?php if ($wp_query->have_posts()) : while ($wp_query->have_posts()) : the_post(); ?>
私からすると、すべて同じ処理がされていると思うのです。
しかし、実際は何がどう違っているのでしょうか?
###「補足情報」
このコードの書き方で毎回エラーが起こるわけではありません。
普通のサブループの場合だとすべて問題なく、各投稿がループして反映されます。
つまり、今回は以下の特別な処理が入っています。
「事前にカテゴリーを抽出し、該当する記事だけを順番にループ」
今回、この壁にぶちあたって、実は違う処理が行われているのではないかと思い質問させていただきました。
詳しい方のアドバイスを頂きたく思います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/17 14:59