サポート » 使い方全般 » フロントページにカテゴリーの階層ごとに記事一覧を表示したい

  • 解決済 ken2pa

    (@ken2pa)


    お世話になります。

    [親カテゴリー1]
    ・記事1
    ・記事2
     [子カテゴリー1]
     ・記事3
     [子カテゴリー2]
     ・記事4
     ・記事5
    [親カテゴリー2]
    ・記事6
     [子カテゴリー3]
     ・記事7

    というような階層構造を持ったままカテゴリーごとに記事の一覧を表示したいのです。
    以下のようにしてみたのですが、階層がフラットで、親カテゴリーごとに記事一覧、子カテゴリーごとに記事一覧となってしまいます。

    <?php if(is_home() && !is_paged()): ?>
    <?php
    $categories = get_categories('orderby=name&order=DESC');
    foreach($categories as $category) :
    ?>
    <h3><?php echo $category->cat_name; ?></h3>
    <ul>
    <?php
    query_posts('showposts=999&cat='.$category->cat_ID);
    if (have_posts()) : while (have_posts()) : the_post();
    ?>
    <li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
    <?php endwhile; endif; ?>
    </ul>
    <?php endforeach; ?>
    <?php endif; ?>

    最近wordpressを扱ったもので、うまくいきません。
    どのようにするといいのかご教授いたければ大変助かります。
    よろしくお願い致します。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • カテゴリーは、親子関係にある場合にのみ「複数のチェック可」という前提です。

     ■
      ■


     □
    はいいけれども、

     ■
      ■


     □
    はダメです。

    ■ functions.php
    
    <?php
    function pinpon($the_cats,$cat_obj) {
      $rtn = false;
      $n = count($the_cats);
      if ($n==1) {
    	$rtn = true;
      } else {
    	if ($cat_obj->category_parent!=0) {
    	  $rtn = true;
    	  for ($i = 0; $i <$n ; $i++) {
    		if ($cat_obj->cat_ID!=$the_cats[$i]->cat_ID) {
    		  if (!(cat_is_ancestor_of($the_cats[$i]->cat_ID,$cat_obj->cat_ID))) {
    			$rtn = false;
    			break;
    		  }
    		}
    	  }
    	} else {
    	  $rtn = false;
    	}
      }
      return $rtn;
    }
    
    function disp_child($catid) {
    
      if ($catid==0) {
    	$categories = get_categories('parent=0&orderby=name&order=DESC');
      } else {
    	$categories = get_categories('orderby=name&order=DESC&child_of='.$catid);
      }
    
      if (!(empty($categories))) {
    
    	foreach($categories as $category) :
    ?>
    	  <h3><?php echo esc_html($category->cat_name); ?></h3>
    	  <ul>
    		  <?php
    		  query_posts('posts_per_page=-1&cat='.$category->cat_ID);
    		  if (have_posts()) : while (have_posts()) : the_post();
    			$cat_array = get_the_category();
    			if (pinpon($cat_array,$category)) :
    		  ?>
    			  <li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
    			<?php endif; ?>
    		  <?php endwhile; endif; ?>
    		  <?php disp_child($category->cat_ID);?>
    	  </ul>
    <?php
    	endforeach;
      }
    }
    ?>
    
    ■ フロントページ
    <?php if(is_home() && !is_paged()): ?>
    <?php
            disp_child(0);
            wp_reset_query();
    ?>
    <?php endif; ?>

    カテゴリーのネストが深かったり、記事が多い場合は遅いかもしれません。また、真剣にテストはしていないので、どこかにシクジリがあるかもしれません。

    トピック投稿者 ken2pa

    (@ken2pa)

    ありがとうございます。お返事が遅くなってすみません。
    提示いただいたコードで確認しましたところ、ほぼ近い形になりました。

    [親カテゴリー1]
    ・記事1
    ・記事2
    ・記事3
     [子カテゴリー1]
     ・記事1
     ・記事2
    [親カテゴリー2]
    ・記事4

    となりました。
    子カテゴリーにある記事が親カテゴリーにもリストアップされます。

    [親カテゴリー1]
    ・記事3
     [子カテゴリー1]
     ・記事1
     ・記事2
    [親カテゴリー2]
    ・記事4

    としたいのですが、その場合はどのようにするのでしょうか?

    カテゴリーは、親子関係にある場合にのみ「複数のチェック可」という前提です。

    すみません、この意味はどのようなことでしょう?

    よろしくお願いします。

    まずは、修正から、
    1) function disp_child($catid) { の上の方のelse節で、hierarchical=0 を追加してください。
    2) query_posts() はえらく遅いので、get_posts() に変更してください。

    function disp_child($catid) {
      if ($catid==0) {
    	$categories = get_categories('parent=0&orderby=name&order=DESC');
      } else {
    	$categories = get_categories('hierarchical=0&orderby=name&order=DESC&child_of='.$catid);
      }
    
      if (!(empty($categories))) {
    
          foreach($categories as $category) :
    ?>
    	  <h3><?php echo esc_html($category->cat_name); ?></h3>
    	  <ul>
    	  <?php
    	  $myposts = get_posts('numberposts=-1&orderby=menu_order&order=ASC&cat='.$category->cat_ID);
    	  foreach ($myposts as $p) {
    	      $cat_array = get_the_category($p->ID);
    	      if (pinpon($cat_array,$category)) {
    	  ?>
    	  	  <li><a href="<?php echo esc_url($p->guid); ?>"><?php echo esc_html($p->post_title); ?></a></li>
    	  <?php
    	      }
    	  }
    	  disp_child($category->cat_ID);
    	  ?>
    	  </ul>
    <?php
          }
      }
    }
    ?>
    
    ■ フロントページ
    <?php if(is_home() && !is_paged()): ?>
    <?php
            disp_child(0);
            // 不要 wp_reset_query();
    ?>
    <?php endif; ?>

    カテゴリーは、親子関係にある場合にのみ「複数のチェック可」という前提です。
     ↓
    直径の親子関係以外のものが含まれる場合は×。

    [すべて直径の親子関係の範囲内はOK]
    親子孫

     ■
      ■

     □
    —- or ——-
    親子孫

     □
      □

     ■
    —- or ——-
    親子孫

     □
      ■

     □

    [直径以外が含まれる場合はNG]
    親子孫

     □
      □

     □
    —- or ——-
    親子孫

     □
      ■
     ■

     □
    —- or ——-

     □
      ■
     □

     □

    <例>
    ■記事にチェックしても良い組み合わせ
    [親カテゴリー1]
    [子カテゴリー1]
    [子カテゴリー2]
    [親カテゴリー1,子カテゴリー1]
    [親カテゴリー1,子カテゴリー2]
    [親カテゴリー2]
    [子カテゴリー3]
    [親カテゴリー2,子カテゴリー3]
    etc

    ■記事にチェックしてはいけない組み合わせ
    [親カテゴリー1,親カテゴリー2]
     親カテゴリー1,親カテゴリー2 が親子関係ではない。
    [親カテゴリー1,子カテゴリー1,親カテゴリー2]
     親カテゴリー1,親カテゴリー2 が親子関係ではない。
    [親カテゴリー1,子カテゴリー1,子カテゴリー2]
     子カテゴリー1,子カテゴリー2 が親子関係ではない。
    [親カテゴリー1,親カテゴリー2,子カテゴリー3]
     親カテゴリー1,親カテゴリー2 が親子関係ではない。
    [親カテゴリー2,子カテゴリー1]
     親カテゴリー2,子カテゴリー1 が親子関係ではない。
    etc

    >子カテゴリーにある記事が親カテゴリーにもリストアップされます。
    あら?
    [親カテゴリー1]
    ・記事3
    となるように、pinpon() ではじいているはずなのですが??

    再び修正

    function pinpon($the_cats,$cat_obj) {
      $n = count($the_cats);
      if ($n==1) {
    	if ($cat_obj->cat_ID==$the_cats[0]->cat_ID) {
    		$rtn = true;
    	} else	{
    		$rtn = false;
    	}
      } else {
    	if ($cat_obj->category_parent!=0) {
    	  $rtn = true;
    	  for ($i = 0; $i <$n ; $i++) {
    		if ($cat_obj->cat_ID!=$the_cats[$i]->cat_ID) {
    		  if (!(cat_is_ancestor_of($the_cats[$i]->cat_ID,$cat_obj->cat_ID))) {
    			$rtn = false;
    			break;
    		  }
    		}
    	  }
    	} else {
    	  $rtn = false;
    	}
      }
      return $rtn;
    }
    $myposts = get_posts('numberposts=-1&orderby=menu_order&order=ASC&cat='.$category->cat_ID);
      ▽
    $myposts = get_posts('numberposts=-1&order=ASC&cat='.$category->cat_ID);
    (&orderby=menu_order を取る)

    —————————————–
    記事1 親カテゴリー1
    記事2 親カテゴリー1
    記事3 親カテゴリー1,子カテゴリー1
    記事4 親カテゴリー1,子カテゴリー2
    記事5 子カテゴリー2(親カテゴリー1なし)
    記事6 親カテゴリー2
    記事7 親カテゴリー2,子カテゴリー3
    —————————————–
    とすると、以下のようになるはずです。
    http://powercms.sitemix.jp/

    カテゴリーや記事の順番指定は適当に変更してください。

    もしかして、私が勘違いしていたのかもしれません。カテゴリーが必ず一つというのなら
    —————————————–
    記事1 親カテゴリー1
    記事2 親カテゴリー1
    記事3 子カテゴリー1
    記事4 子カテゴリー2
    記事5 子カテゴリー2
    記事6 親カテゴリー2
    記事7 子カテゴリー3
    —————————————–
    無条件に正しく表示することが出来ます。ただし、こうするとパンクズナビがネストして表示できないような気がします。

    トピック投稿者 ken2pa

    (@ken2pa)

    ありがとうございます!!
    出来ました!
    サンプルサイトまで作っていただいてありがとうございます。
    親子カテゴリーの関係、理解しました。
    提示いただいたコードを理解するよう精進します!
    ありがとうございました!

    トピック投稿者 ken2pa

    (@ken2pa)

    すみません、解決したと思ったのですが、一つ問題がでました。
    カテゴリータイトルにリンクをつける場合はどのようにするのでしょうか?

    <h3><a href="<?php echo esc_url($category->catid); ?>"><?php //echo esc_html($category->cat_name); ?></a></h3>

    等としてみましたが、思う結果が得られませんでした。
    よろしくお願いします。

    カテゴリーのリンク

    <h3><a href="<?php echo get_category_link($category->cat_ID); ?>"><?php echo esc_html($category->cat_name); ?></a></h3>

    投稿へのリンクも関数を使った方がいいかもしれません

    <li><a href="<?php echo esc_url($p->guid); ?>"><?php echo esc_html($p->post_title); ?></a></li>
      ▽
    <li><a href="<?php echo get_permalink($p->ID); ?>"><?php echo esc_html($p->post_title); ?></a></li>

    トピック投稿者 ken2pa

    (@ken2pa)

    回答ありがとうございます。
    ああ、そっかぁ!という感じで、自身ちょっとパニクっていました。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「フロントページにカテゴリーの階層ごとに記事一覧を表示したい」には新たに返信することはできません。