• 解決済 kikuzo

    (@kikuzo)


    いつも勉強させていただいています。表題について質問させて下さい。
    あるカテゴリ(仮にidが50、51とします)のトップ、およびそのカテゴリに投稿した記事の表示の際のみ、サイドバーを変更したいと思います。まず、下記のようにやってみました。
    【方法1】
    1)sidebar-2.phpをつくる
    2)category-50.php、category-51.phpをつくり、その中では<?php get_sidebar(2); ?>と記載。50、51のカテゴリトップが表示されたときはsidebar-2で表示させる。
    3)wordpress codexのテンプレートタグ/in category内、「ループ外で使う」を参考にして、single.php、single1.php、single2.phpを用意。カテゴリ50、51に投稿した記事の表示にsingle2.phpを使うこととし、その中で<?php get_sidebar(2); ?>と記載。

    とりあえず、上記で見た目はちゃんと希望通り表示されています。しかし、category-50.phpをcategory-51.php、single1.php、single2.phpというphpが増えてしまい、あとあと面倒かなと思います。

    フォーラムの過去記事「投稿記事ごとに違うサイドバーを表示させたい」を参考に、category.phpの<?php get_sidebar(); ?>の部分で、振り分けたら良いのかなと思いやってみました。
    jim912さんのテスト用ソース(条件に合えばa、そうでなければbが返ってくるもの)をつかって、カテゴリ50と51の時にだけsidebar-2.phpを表示させるべくやってみたのですが、どうしても”b”が返ってきて、sidebar-2.phpを表示させることができません。
    ソースとしては下記のように記載しました。
    <?php
    if( is_category(’50’) || is_category(’51’)) {
    echo ‘a’;
    include(‘sidebar-2.php’);
    } else {
    echo ‘b’;
    get_sidebar();
    }
    ?>
    間違いを指摘していただければうれしいです。
    どうぞよろしくお願いします。

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

    記載いただいたコード自体には、おかしいところはありません。
    ただし、記載いただいたコードより前にquery_postsを実行していたりすると、aに該当しうなくなる可能性がありますが、いかがでしょうか。

    トピック投稿者 kikuzo

    (@kikuzo)

    jim912さん、書き込みありがとうございます。
    確かにこのコードより前に下記のようなquery_postsを実行しています。
    <?php query_posts(‘pagename=info’); ?>
    <?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>
    <h2 class=”title”><?php the_title(); ?></h2>
    <?php the_content(); ?>
    <?php endwhile; ?>
    <?php endif; ?>
    ためしに削除してみると、きちんとaが返って来ました。

    ということは、このようなsidebarの振り分け方法は不可能、ということでしょうか。

    あと、なぜquery_postsを実行すると振り分けが出来なくなるのか疑問です。jim912さんのお時間が許す時に、この点について少し教えていただけないでしょうか。
    お忙しいと思いますが、どうぞよろしくお願いします。

    kikuzoさん、こんにちは。

    query_postsを使った時に振り分けができなくなる点については、下記スレッドを参照ください。(少々長いですが。。。)

    検索結果を記事中に表示したい

    回避させるには、query_postsではなくget_postsを使えば解決します、ただし、get_postsを使った場合は、記事のループ部分の記述が少々変わりますので留意ください。

    <?php query_posts(‘pagename=info’); ?>
    <?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>
    <h2 class=”title”><?php the_title(); ?></h2>
    <?php the_content(); ?>
    <?php endwhile; ?>
    <?php endif; ?>

    に続けて
    wp_reset_query();
    とすると query_posts の実行前の状態に戻ります。

    sidebar の振り分けは sidebar.php 内にまとめるとすっきりかもです。

    if(is_category(’50’) || is_category(’51’)){
    include(TEMPLATEPATH . ‘/sidebar-2.php’);
    } else {
    include(TEMPLATEPATH . ‘/sidebar-default.php’);
    }

    トピック投稿者 kikuzo

    (@kikuzo)

    kzさん、書き込みありがとうございます。
    wp_reset_query();を使う方法を試してみたところ、queryの指定が解除され”a”が返ってくるようになりました。さらに、wp_reset_query();についてネットで調べて勉強させていただきました。有益な情報をありがとうございました!
    sidebarについてのアイデアも大変参考になります。ありがとうございます。

    jim912さんから教えていただいた「query_postsではなくget_postsを使えば解決」という方法も使えるようになろうと、この前からフォーラムの過去記事の中をいったりきたりしています。が、、お見せしてご意見を仰ぐほどソースがまとまりません。自分には「get_posts」というのはなかなか手ごわいです・・・。がんばります。

    get_posts を使うなら以下のどちらか。

    plan A:

    <?php
    $myposts = get_posts('pagename=info');
    foreach($myposts as $post) :
      setup_postdata($post);
    ?>
    <h2 class="title"><?php the_title(); ?></h2>
    <?php
    the_content();
    endforeach;
    wp_reset_query();
    ?>

    the_〜 を使おうとすると、
    setup_postdata を呼ぶか(the_content 使用時に必要)
    $post を global にして (the_title 程度ならこちらでOK)
    元々のクエリを破壊しないといけないので
    結局 query_posts 使用時のように wp_reset_query で元に戻す必要があります。

    plan B:

    <?php
    $myposts = get_posts('pagename=info');
    foreach($myposts as $mypost) :
    ?>
    <h2 class="title"><?php echo $mypost->post_title; ?></h2>
    <?php
    echo $mypost->post_content;
    endforeach;
    ?>

    get_posts で global な $posts・$post や the_〜 のタグを使わず
    $mypost->〜 のようにwp_posts のフィールド値を使うようにすれば
    元々のクエリが破壊されません。

    個人的には get_posts が必要になる場面がないので
    query_posts だけ使ってれば幸せです。

    $post を global にして (the_title 程度ならこちらでOK)
    元々のクエリを破壊しないといけないので
    結局 query_posts 使用時のように wp_reset_query で元に戻す必要があります。

    $postは、the_post関数実行時に上書きされる一時的なオブジェクトでしかありませんから、クエリが破壊というのは適切ではありません。
    ループが独立しているのであれば、get_postsは本来のソースになんら影響なく用いることができますし、wp_reset_queryを使う必要もありません。

    ループが独立しているのであれば、get_postsは本来のソースになんら影響なく用いる

    後世のために、これ!という書き方を例示していただけると、
    不幸になる人が減って良い感じです。

    トピック投稿者 kikuzo

    (@kikuzo)

    kzさん、書き込みありがとうございます。
    さっそくplanA,Bを試してみたところ、きちんと「a」が返ってきました。planA,B、さらに「wp_reset_query();」を使う方法と、3つも詳細に教えていただいて本当にありがとうございます。いろいろなアプローチ方法があるのだなと感心しました!

    jim912さん、書き込みありがとうございます。
    「ループが独立しているのであれば、wp_reset_queryを使う必要もありません。」とのお話、「get_posts」の使い方がなかなか手ごわく思うようになりませんが、大変勉強になります。ありがとうございます。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「あるカテゴリとそのカテゴリ投稿記事のサイドバー変更」には新たに返信することはできません。