サポート » 使い方全般 » トップページに親子カテゴリの記事一覧を表示

  • お世話になります。

    トップページにカテゴリ別に投稿記事を一覧表示させたいのですが、
    うまくいかずに悩んでいます。

    カテゴリは親と子で、親のみの場合もあります。
    トップページに以下のように表示するにはどうすればよいか教えていただけますでしょうか。

    親カテゴリA
     子カテゴリ1
     ・子カテゴリ1に属する記事タイトル(1)
     ・子カテゴリ1に属する記事タイトル(2)

     子カテゴリ2
     ・子カテゴリ2に属する記事タイトル(1)
     ・子カテゴリ2に属する記事タイトル(2)

    親カテゴリB……(子カテゴリなし)
     ・親カテゴリBに属する記事タイトル(1)
     ・親カテゴリBに属する記事タイトル(2)

    教えていただけると大変助かります。
    どうぞよろしくお願いします。

    —–
    すみません、先ほどトッピックを間違えて投稿してしましました。申し訳ございません。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • モデレーター jim912

    (@jim912)

    1. get_categories で親カテゴリーを取得する
    2. 親カテゴリーのループ処理開始
    3. get_categories で、子カテゴリーを取得する
    4. 子カテゴリーがあったら、子カテゴリーのループ処理開始、なければ親カテゴリーに属する記事を取得し、ループ処理で表示
    5. 子カテゴリーに属する記事を取得し、ループ処理で表示(子カテゴリーがある場合)
    6. 子カテゴリーのループ終了(子カテゴリーがある場合)
    7. 親カテゴリーのループ終了

    のような処理ロジックになるかと思います。

    トピック投稿者 lilico

    (@meiico)

    ありがとうございます!

    ロジック処理を教えていただいて、なるほどという感じなのですが、
    どうにもこうにも初心者なもので、コードをどう書いていいのかわからない状態です。

    お手数で恐縮なのですが、コードを教えていただくことはできますでしょうか…

    モデレーター gatespace

    (@gatespace)

    記事の取得は手前味噌ですが以前ブログ書きましたので。
    WordPressでカテゴリ(タクソノミー)毎に投稿を表示
    http://gatespace.jp/2012/05/14/view-posts-each-category/

    あとフォーラムにも投稿ありましたので
    カテゴリごとの記事の一覧をトップページに羅列したい
    http://ja.forums.wordpress.org/topic/3160?replies=5

    jim912さんのロジックはこんな感じ(未検証)

    <?php
    $args = array(
      'parent' => 0
      );
    $topcategories = get_categories( $args ); // 1. 親カテゴリーを取得する
    foreach ( $topcategories as $topcategory ) { //2. 親カテゴリーのループ処理開始
    	$childcategories = get_categories(  array( 'child_of' => $topcategory->term_id ) ); // 3. 子カテゴリーを取得する
    	if ( ! empty( $childcategories ) ) { // 4. 子カテゴリーがあったら、
    		foreach ( $topcategories as $topcategory ) { //4. 子カテゴリーのループ処理開始
    			// 5. 子カテゴリーに属する記事を取得し、ループ処理で表示
    		} // 6. 子カテゴリーのループ終了
    	} else { // 4. 子カテゴリーがなければ
    		// 4. 親カテゴリーに属する記事を取得し、ループ処理で表示
    	}
    } // 7.親カテゴリーのループここまで
    ?>

    分からない関数などはCodexで調べてください。

    トピック投稿者 lilico

    (@meiico)

    ご回答いただきましてありがとうございます!

    教えていただいたコードを元に試行錯誤しながらも実現しつつあるのですが…
    (もっとスマートなコードがあるのだとは思いますが…^^;)

    ただ、とても単純なことだと思われますが
    なぜか、記事へのリンクがうまくいかず a hrefの外にリンク先が表示されてしまいます。

    このような状態→http://リンク先〜<li><a href=””>記事タイトル
    リンク先をきちんとaの配下に表示するにはどうしたらよいか教えていただけますか。。
    たびたびすみません、どうぞよろしくお願いします。

    <?php
    $args = array(
      'parent' => 0
      );
    $topcategories = get_categories( $args ); // 1. 親カテゴリーを取得する
    foreach ( $topcategories as $topcategory ) { //2. 親カテゴリーのループ処理開始
    	$childcategories = get_categories(  array( 'child_of' => $topcategory->term_id ) ); // 3. 子カテゴリーを取得する
    	if ( ! empty( $childcategories ) ) { // 4. 子カテゴリーがあったら、
            echo '<h3> 親カテゴリタイトル:'. $topcategory->cat_name . '</h3>';
              foreach ( $childcategories as $childcategory ) { //4. 子カテゴリーのループ処理開始
              echo '<h4> 子カテゴリタイトル:'. $childcategory->cat_name . '</h4><ul class="ptbtn">';
              //記事
    
         if (have_posts()) : query_posts('cat=' . $childcategory->cat_ID);
            while(have_posts()) :
            the_post();
            echo '
    <li><a href="' . the_permalink() . '">'. get_the_title() . '</a>';
            endwhile;
            wp_reset_query();
            echo '';
         endif;
            //ここまで
    // 5. 子カテゴリーに属する記事を取得し、ループ処理で表示
    		} // 6. 子カテゴリーのループ終了
    	} else { // 4. 子カテゴリーがなければ
    	echo '<h3> 親カテゴリタイトル:'. $topcategory->cat_name . '</h3><ul class="ptbtn">';
      if (have_posts()) : query_posts('cat=' . $topcategory->cat_ID);
      while(have_posts()) :
      the_post();
      echo '</li>
    <li><a href="' . the_permalink() . '">'. get_the_title() . '</a>';
      endwhile;
      echo '';
      endif;
    
            // 4. 親カテゴリーに属する記事を取得し、ループ処理で表示
    	}
    } // 7.親カテゴリーのループここまで
    ?>
    </li>
    モデレーター gatespace

    (@gatespace)

    肝心な部分がエンコードされて読めないので、コードを投稿する時は「b-quote」ではなく「code」で囲ってください。

    あと、この場合は query_posts ではなく get_posts を使いましょう

    モデレーター gatespace

    (@gatespace)

    あと、 echo してるのに the_permalink() はおかしいです。
    echo するならget_permalink()

    トピック投稿者 lilico

    (@meiico)

    投稿の方法を間違えてしまい、すみませんでした。

    教えていただいたget_permalinkに変更することで、前回投稿した不具合は解消されました!
    ありがとうございます!!
    ただ、query_postsではなく、get_postsを使うと思ったような表示ができなくなってしまいます。(query_postsだと表示されるのですが…)
    単純にget_postsに変更するだけではダメなんでしょうか…。
    何度もすみません、、、以下コードを投稿します。
    アドバイスいただけたら嬉しいです。よろしくお願いします。

    <?php
    $args = array(
      'parent' => 0
      );
    $topcategories = get_categories( $args ); // 1. 親カテゴリーを取得する
    foreach ( $topcategories as $topcategory ) { //2. 親カテゴリーのループ処理開始
    	$childcategories = get_categories(  array( 'child_of' => $topcategory->term_id ) ); // 3. 子カテゴリーを取得する
    	if ( ! empty( $childcategories ) ) { // 4. 子カテゴリーがあったら、
            echo '<h3> 親カテゴリタイトル:'. $topcategory->cat_name . '</h3>';
              foreach ( $childcategories as $childcategory ) { //4. 子カテゴリーのループ処理開始
              echo '<h4> 子カテゴリタイトル:'. $childcategory->cat_name . '</h4><ul class="ptbtn">';
              //記事
    
         if (have_posts()) : query_posts('cat=' . $childcategory->cat_ID);
            while(have_posts()) :
            the_post();
            echo '<li><a href="'. get_permalink() .'">'. get_the_title() . '</a></li>';
            endwhile;
            wp_reset_query();
            echo '</ul>';
         endif;
            //ここまで
    // 5. 子カテゴリーに属する記事を取得し、ループ処理で表示
    		} // 6. 子カテゴリーのループ終了
    	} else { // 4. 子カテゴリーがなければ
    	echo '<h3> 親カテゴリタイトル:'. $topcategory->cat_name . '</h3><ul class="ptbtn">';
      if (have_posts()) : query_posts('cat=' . $topcategory->cat_ID);
      while(have_posts()) :
      the_post();
      echo '<li><a href="' . get_permalink() . '">'. get_the_title() . '</a></li>';
      endwhile;
      wp_reset_query();
      echo '</ul>';
      endif;
    
            // 4. 親カテゴリーに属する記事を取得し、ループ処理で表示
    	}
    } // 7.親カテゴリーのループここまで
    ?>

    get_posts() でどのようなコードを書いたのかわかりませんが、query_posts() を get_posts() に置き換えただではダメです。

    gatespace さんが紹介してくれている
    http://gatespace.jp/2012/05/14/view-posts-each-category/
    に get_posts() と foreach ~ endforeach; で表示する方法が書いてあります。

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