• 解決済 wakaba2014

    (@wakaba2014)


    お世話になっております。
    子カテゴリの数が両手両足の指で数え切れないくらいありますのでなんとか自動で表示させたく思っております。

    検索をかけて解決策を探してみたところこちらの参考サイトのコード
    http://cat-speak.net/2011/05/15/64/

    <?php
    //$catに最上位カテゴリの情報を入れる
    $cat = get_category($cat);
    while ( $cat->parent > 0 )
    $cat = get_category( $cat->parent );
    
    //親カテゴリIDを取得
    $parentID = attribute_escape($cat->cat_ID);
    
    //子カテゴリIDを全て取得し、配列に入れる
    $catChildren = get_category_children($parentID);
    $catIDs = explode('/',$catChildren);
    array_shift($catIDs);
    sort ($catIDs);
    ?>
    
    <ul id="catChild">
    <?php
    //ループしてHTMLを作成
    for($i=0; $i<count($catIDs); $i++) {
    $cats=get_category($catIDs[$i]);
    ?>
    <li>
    <a href="<?php echo get_category_link($catIDs[$i]); ?>">
    <?php echo get_catname($catIDs[$i]); ?></a>
    </li>
    <?php } ?>
    </ul>

    をsidebar.phpに入れてみたところ子カテゴリが無事表示されました。
    しかし、元々sidebar.phpに入れていた、カテゴリ投稿記事を表示するコード

    <?php query_posts('posts_per_page=99&cat=123'); ?>
    <?php while (have_posts()) : the_post(); ?>
    <ul>
      <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    </ul>
    <?php endwhile;?>

    の前から後ろに記述場所を変えてみると途端にうんともすんとも言わなくなりました。
    これは素人目で見てループ処理がまずいのではと考えてこちらの参考コードをいじっていますが、for文はどうやってループ処理を終わらせればいいのか勉強不足のためわかりませんでした。

    どう書き直せばいいのか教えてください!
    お願いします!

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

    (@gatespace)

    query_posts の使い方が間違ってます。
    http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/query_posts

    <?php
    
    // クエリ
    query_posts( $args );
    
    // ループ
    if ( have_posts() ) :
      while ( have_posts() ) : the_post();
          echo '<li>';
    	  the_title();
    	  echo '</li>';
      endwhile;
    else:
    endif;
    
    // クエリをリセット
    wp_reset_query();
    ?>

    Codexのページでも書いてますが、サイドバーなどで利用する場合は、get_posts あるいは WP_Query を使った方が良いです。

    http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query

    トピック投稿者 wakaba2014

    (@wakaba2014)

    >gatespaceさん
    ご助言ありがとうございます!

    なんと!
    query_postsをサイドバーで使うのは間違いだったのですか…知らなかった…
    これはちゃんとした書き方を学ぶ必要がありますね!
    とりあずget_postsを使って投稿記事を引っ張ってくる書き方を覚えます!

    そしてget_postsを使えば目的のコードと干渉を起こさないと考えていいのでしょうか?
    検証しないとわからないことでしたらすみません…。
    (なぜquery_postsの記述で干渉しているのかもわからない…)

    でもやるべきことが見えたので非常に助かりました!ありがとうございます!

    トピック投稿者 wakaba2014

    (@wakaba2014)

    get_postsを使ってみましたが、できませんでした!

    (´;д;`)

    また何か間違えてると思います…。

    get_postsで特定のカテゴリ投稿記事を拾ってくるコード、
    その次に1レス目に記述した子カテゴリを拾ってくるコードを記入しました。
    sidebar.phpの状態としては以下の通りになってます。

    1.特定のカテゴリ投稿記事を表示するコード

    <?php
    $posts = get_posts('numberposts=20&category=12');
    global $post;
    ?>
    <?php
    if($posts): foreach($posts as $post): setup_postdata($post); ?>
    <a>"><?php the_title(); ?></a>
    <?php endforeach; endif;
    ?>

    2.上記のコードの次に記述されている子カテゴリを表示させるコード

    <?php
    //$catに最上位カテゴリの情報を入れる
    $cat = get_category($cat);
    while ( $cat->parent > 0 )
    $cat = get_category( $cat->parent );
    
    //親カテゴリIDを取得
    $parentID = attribute_escape($cat->cat_ID);
    
    //子カテゴリIDを全て取得し、配列に入れる
    $catChildren = get_category_children($parentID);
    $catIDs = explode('/',$catChildren);
    array_shift($catIDs);
    sort ($catIDs);
    ?>
    
    <ul id="catChild">
    <?php
    //ループしてHTMLを作成
    for($i=0; $i<count($catIDs); $i++) {
    $cats=get_category($catIDs[$i]);
    ?>
    <li>
    <a href="<?php echo get_category_link($catIDs[$i]); ?>">
    <?php echo get_catname($catIDs[$i]); ?></a>
    </li>
    <?php } ?>
    </ul>

    これをまた前後変えると2のコードも1のコードも動きだしますが、1が前だと動きません!!全く情報を拾ってくれません…
    サイドバーはget_postsを使ってもダメなんでしょうか?
    どなたか助けてくださーい。o゚(p´⌒`q)゚o。

    トピック投稿者 wakaba2014

    (@wakaba2014)

    あ!
    sidebar.phpの中に入れてたショートコードをいくつか消して試してたら表示されるようになりました。

    ヤッ━ヾ(*´∀)(∀`*)ノ゙━ッタ!!

    お騒がせしてすみませんでしたー!
    上のコードの並び順で問題なく表示されました!!
    gatespaceさん、改めましてありがとうございました!助かりました!!

    あと別件ですが上の2のコードを特定のカテゴリだけ除外させようと
    11行目の
    $catChildren = get_category_children($parentID);

    $catChildren = get_category_children($parentID,-100,-150);
    などと書き換えてみてるのですがこれだとID100や150のカテゴリを除外するどころか
    動作しなくなってしまいました…

    $parentIDが子カテゴリのID情報だとはわかっているのですが、ここからID100とID150のカテゴリだけ除外する方法がわかりません。

    トピック投稿者 wakaba2014

    (@wakaba2014)

    こちらも解決しました!
    まだ作業中なのでまたまとめておきます、一旦解決にしておきます!!
    ありがとうございました!

    モデレーター gatespace

    (@gatespace)

    get_posts であってもクエリはリセットしないとダメですよ。

    あとget_category_children はWordPress 2.8 で非推奨になってます。

    子カテゴリの数が両手両足の指で数え切れないくらいありますのでなんとか自動で表示させたく思っております。

    この部分の具体像が見えません。
    最上位のカテゴリだけリストで表示させたいのですか?

    そうであれば wp_list_categories をつかって 最上位のみのカテゴリーを表示させた方が楽です。
    http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/wp_list_categories

    トピック投稿者 wakaba2014

    (@wakaba2014)

    >gatespaceさん
    ご返信に気づかず申し訳ありません!
    お返事ありがとうございます。

    >get_posts であってもクエリはリセットしないとダメですよ。
    あとget_category_children はWordPress 2.8 で非推奨になってます。

    なるほどなるほど…全然知りませんでした、すごい勉強になります。
    クエリのリセットと推奨・非推奨は気をつけていきたいと思います。

    >この部分の具体像が見えません。
    最上位のカテゴリだけリストで表示させたいのですか?

    えっと、今回は例で書きますとA>B>Cと親>子>孫関係のカテゴリがありまして、
    子も孫もカテゴリ数が大量にありました。
    そこで親カテゴリのカテゴリページのときに、孫カテゴリを表示せずに子カテゴリのみの一覧を表示させたかったのです。孫カテゴリも含めて表示させると大変なことになるので…。
    ですが、さらにその状態でこのカテゴリいらないなあと思うものを一覧から除外して非表示にさせたかったのです。

    説明がわかりにくくてすみません。
    ですが今は希望通りの動作ができているのでとても助かりました。
    感謝です!ありがとうございました!

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「サイドバーに子カテゴリ一覧を表示させたいです!」には新たに返信することはできません。