サポート » 使い方全般 » カテゴリー別にサイドメニューを変更したい

  • 解決済 goods.1971

    (@goods1971)


    カテゴリー別にサイドメニューに表示される内容を変えたいと思い、下記のようにしました。
    これで一応思い通りに表示されるのですが、同じ内容が何度もでてくるので、もっと簡単にしたいのですが、思いつきません。

    もっと、コードを簡単にする方法を教えてください。
    ——————————————————————————-

    <?php if(!(is_home() || is_404() || is_search() || in_category(3))): ?>
    <!-- カテゴリー「時事」に属するタイトルの表示 -->
    <?php if(in_category(current)): ?>
    
    <nav id="cate-current">
     <h2>カテゴリー|時事「異論反論オブジェクション」</h2>
     <ul>
      <?php
    	$myposts = get_posts('category_name=current&numberposts=20');
    	foreach($myposts as $post) : // $post を使う
    		setup_postdata($post);
    	?>
      <li><a href="<?php the_permalink(); ?>">
       <?php the_title(); ?>
       </a></li>
      <?php endforeach; ?>
     </ul>
     <?php wp_reset_postdata(); ?>
    </nav>
    <?php endif; ?>
    <!-- /cate-current -->
    <!-- カテゴリー「gmail関連」に属するタイトルの表示 -->
    <?php if(in_category(11)): ?>
    <nav id="cate-gmail">
     <h2>カテゴリー|Gmail関連</h2>
     <ul>
      <?php
    	$myposts = get_posts('category_name=gmail&numberposts=20');
    	foreach($myposts as $post) : // $post を使う
    		setup_postdata($post);
    	?>
      <li><a href="<?php the_permalink(); ?>">
       <?php the_title(); ?>
       </a></li>
      <?php endforeach; ?>
     </ul>
     <?php wp_reset_postdata(); ?>
    </nav>
    <?php endif; ?>
    <!-- /cate-gmail -->
    <!-- カテゴリー「chrome関連」に属するタイトルの表示 -->
    <?php if(in_category(12)): ?>
    <nav id="cate-chrome">
     <h2>カテゴリー|Chrome関連</h2>
     <ul>
      <?php
    	$myposts = get_posts('category_name=chrome&numberposts=20');
    	foreach($myposts as $post) : // $post を使う
    		setup_postdata($post);
    	?>
      <li><a href="<?php the_permalink(); ?>">
       <?php the_title(); ?>
       </a></li>
      <?php endforeach; ?>
     </ul>
     <?php wp_reset_postdata(); ?>
    </nav>
    <?php endif; ?>
    <!-- /cate-chrome -->
    <!-- カテゴリー「wordpress」に属するタイトルの表示 -->
    <?php if(in_category(wp)): ?>
    <nav id="cate-wp">
     <h2>カテゴリー|wordpress</h2>
     <ul>
      <?php
    	$myposts = get_posts('category_name=wp&numberposts=20');
    	foreach($myposts as $post) : // $post を使う
    			setup_postdata($post);
    	?>
      <li><a href="<?php the_permalink(); ?>">
       <?php the_title(); ?>
       </a></li>
      <?php endforeach; ?>
     </ul>
     <?php wp_reset_postdata(); ?>
    </nav>
    <?php endif; ?>
    <!-- /cate-wordpress -->
    <?php endif; ?>

    ——————————————————————————-
    ちなみに、同様のブロックが4つありますが、実際は10近くあります。

    もう一つ質問です。
    <?php if(!(is_home() || is_404() || is_search() || in_category(3))): ?>
    と指定すると、in_category(3)の子要素にも影響がでるようです。
    親要素には表示させず、子要素に表示させるにはどうすればよいのでしょうか?

    よろしくお願いいたします。

15件の返信を表示中 - 1 - 15件目 (全15件中)
  • こんにちは、

    http://d.hatena.ne.jp/tenman/20111109/p1

    のような感じでは、ダメですか?

    トピック投稿者 goods.1971

    (@goods1971)

    ありがとうございます。

    jQueryを使ったアコーディオン型メニューも魅力的ですが、
    希望としましては、上記の同じようなコードを簡略化したいと考えております。

    モデレーター gatespace

    (@gatespace)

    こんにちは
    in_category を使われているので、個別の投稿ページ(シングルページ)のサイドバーで
    その投稿が属するカテゴリーと同じカテゴリーの記事を表示する、と解釈します。

    投稿が属しているカテゴリーはget_the_categoryで取得でき、配列で返ってくるので、
    その配列をループすればコードは短くて済むのではないでしょうか?

    今ひとつ、条件分岐が伝わらないので汎用的なコードのみですが。

    <?php
    if( is_single()) :
      $cats = get_the_category();
      foreach( $cats as $cat ) :
        $myposts = get_posts('category_name='.$cat->slug.'&numberposts=20');
        if ($myposts) : ?>
        <nav id="cate-<?php echo $cat->slug; ?>">
          <h2>カテゴリー|<?php echo $cat->name; ?></h2>
          <ul>
            <?php foreach($myposts as $post) : setup_postdata($post); ?>
              <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
            <?php endforeach; ?>
          </ul>
        </nav>
        <?php endif; ?>
        <?php wp_reset_postdata(); ?>
      <?php endforeach; ?>
    <?php endif;  ?>

    トピック投稿者 goods.1971

    (@goods1971)

    gatespaceさん 
    アドバイスありがとうございます。

    in_category を使われているので、個別の投稿ページ(シングルページ)のサイドバーで
    その投稿が属するカテゴリーと同じカテゴリーの記事を表示する、と解釈します。

    その通りです。

    正直、PHPのことは全くわかりませんので、
    教えていただいたコードを読み解くことができませんが、とりあえず、設置してみました。
    結果は、何も表示されません。

    そこで、gatespaceさんのサイドを参考にデバックをONにしたところ、
    gatespaceさんのコード部分に問題はないようです。
    なぜ、メニューが表示されないのでしょうか???

    PS
    デバックをONにしたら、あちこちにNoticeの表示がでておりますが・・・
    大丈夫なのかな?

    モデレーター gatespace

    (@gatespace)

    なぜ、メニューが表示されないのでしょうか???

    私はエスパーじゃないので、コード見ないと分かりません。

    お使いになっているサイドバーの中身が分かりませんが、
    デフォルトテーマのTwentyElevenで表示に問題が無いことを確認しています。

    プラグインをすべて無効にした上で
    デフォルトテーマに戻して、sidebar.phpに上記コードを足した場合、表示されますか?

    トピック投稿者 goods.1971

    (@goods1971)

    エスパーじゃないって・・・笑えるね~ まっ確かにその通りですよね。

    ところで、何も知らないくせに一から作ったので、テーマが適用されません。
    ウィジェットを利用すると、ulやliで階層が深くなり、CSSの指定がわからなくなるので、
    ウィジェットを使用していないんです。これが問題なのでしょうか?

    モデレーター gatespace

    (@gatespace)

    ウィジェットを使用していないんです。これが問題なのでしょうか?

    ウィジェットは関係ありません。

    プラグインをすべて無効にした上で
    デフォルトテーマに戻して、sidebar.phpに上記コードを足した場合、表示されますか?

    ここに対するお返事がないのですが、少なくとも
    デフォルトテーマにコードを足して意図した通りに表示されるのであれば
    お使いになっているテーマの問題です。

    トピック投稿者 goods.1971

    (@goods1971)

    何度もすみません。

    プラグインをすべて停止し、デフォルトテーマにし、sidebar.phpの最下部に
    上記コードを貼り付けましたが、表示されません・・・

    手順が何か間違っているのでしょうか?

    ちなみに、
    ローカル環境(PC上)でやってみた結果です。
    Xampp1.7.7
    wordpress3.2.1

    横からすみません
    goods.1971さん

    手順が何か間違っているのでしょうか?

    あの、

    in_category を使われているので、個別の投稿ページ(シングルページ)のサイドバーで
    その投稿が属するカテゴリーと同じカテゴリーの記事を表示する
    、と解釈します。

    その通りです。

    シングルページで表示して確認していますか?

    正直、PHPのことは全くわかりませんので、
    教えていただいたコードを読み解くことができませんが、とりあえず、設置してみました。

    もし、PHPを少し勉強してもいいという気持ちがあればですが、

    同じパターンの繰り返しで、コードが長くなるようなら、関数をご自分で作れるようになると、同じコードを何回も繰り返して記述する面倒から開放されるかもしれないので、PHPの関数を調べてみてください。

    トピック投稿者 goods.1971

    (@goods1971)

    nobitaさん
    アドバイスありがとうございます。
    もう一度シングルページを確認したとろこ、サイドではなくコンテンツ部のページ最下部に表示されておりました。

    それと、PHPの関数ついて本(ポケットリファレンス)を購入しましたが・・・挫折しました。
    すぐ使えるようなサンプルが載った本を購入すればよかったのかぁ~

    gatespaceさん 
    やはり、私のテーマに問題があることがわかりました。
    このコードが私のテーマで使えるよう頑張ってみます。
    アドバイスありがとうございました。

    トピック投稿者 goods.1971

    (@goods1971)

    gatespaceさん 

    表示されました。
    ありがとうございました。

    ——————————————————
    ところで、今まで何も考えておりませんでしたが、
    シングルページのみに表示されるより、カテゴリーページにも表示されたほうが良いですね。
    そこで、下記のようにし、カテゴリーでも表示されるようになりました。

    <?php
    if( is_single() || is_category() ) :
    $cats = get_the_category();

    しかし、カテゴリーに階層があると、子カテゴリーと親カテゴリーのリストが表示されてしまいます。

    私の希望としては、

    • 親カテゴリーを選んだ場合、サイドメニューにはリストが表示されない。
    • 子カテゴリーを選んだ場合、サイドメニューには子カテゴリーリストのみ表示。
    • 記事を選んだ場合、サイドメニューには記事が属する子カテゴリーリストのみ表示。

    としたいのですが、希望通りの表示にするためにはgatespaceさんのコードをどうすれば良いのか・・・アドバイスをよろしくお願いいたします。

    トピック投稿者 goods.1971

    (@goods1971)

    訂正させてください。

    私の希望としては、

    • 親カテゴリーを選んだ場合、サイドメニューには親カテゴリーリストを表示。
    • 子カテゴリーを選んだ場合、サイドメニューには子カテゴリーリストのみ表示。
    • 記事を選んだ場合、サイドメニューには記事が属する子カテゴリーリストのみ表示。
    モデレーター gatespace

    (@gatespace)

    うーん。このフォーラムはコードの制作を依頼する場ではないので、
    もうちょっと努力して欲しいのですが・・・。

    ヒントだけ。

    • get_the_category は 投稿IDからその投稿の属するカテゴリーの情報を引き出す関数。
    • カテゴリーの情報を取得するなら get_categories という関数があるので、今回のカテゴリーアーカイブではそっちを使う
    • get_categories のパラメーターで "parent" =>0 とすれば一番上の階層のカテゴリーだけを取得する。
    • get_categories のパラメーターで "parent" => 1 とすればカテゴリーIDが1の直下の子カテゴリーのみ取得する。

    未検証ですが、

    <?php
    if ( is_category() ) { // カテゴリーアーカイブの時
      $cat = get_the_category();  // 現在のカテゴリー取得
      $cat = $cat[0]; // 配列で返ってくるのでこの処理を入れておく
      $parent_id = $cat->category_parent; // 親カテゴリーのID取得(0なら最上位)
      $cats=  get_categories('parent='.$parent_id); // 同じ親カテゴリーに属する子カテゴリーの一覧を取得
    } elseif ( is_single() ) { // シングルページの時
      $cats = get_the_category();
    }
    
    // 出力
    if ( !empty( $cats ) ) {
      foreach( $cats as $cat ) {
        // 略
      }
    }
    ?>
    トピック投稿者 goods.1971

    (@goods1971)

    親切ていないに教えて頂きありがとうございました。

    あとは自分でやってみます。
    本当にありがとうございました。

    トピック投稿者 goods.1971

    (@goods1971)

    ということで、一件落着。

    みなさまありがとうございました。

15件の返信を表示中 - 1 - 15件目 (全15件中)
  • トピック「カテゴリー別にサイドメニューを変更したい」には新たに返信することはできません。