サポート » 使い方全般 » カテゴリーページに該当カテゴリーの記事を1つだけ表示させたい

  • タイトルのとおりなのですが、カテゴリーページに該当カテゴリーの記事を1つだけ表示させたいです。

    http://www.abc.jp/def/
    http://www.abc.jp/def/ehi.html
    上記であったら、
    カテゴリー「def」と「def/ehi.html」が同じものが表示されるようにしたいのですが、
    どこを触ればいいのか、わかりません。

    MTばかり構築していたので、wpは2.6時代どまりの知識です。
    サーバーの関係で、phpの最新が対応していないため、wp3.1.4で構築中です。

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

15件の返信を表示中 - 1 - 15件目 (全35件中)
  • トピック投稿者 nakamy

    (@nakamy)

    http://a9se9.blogspot.com/2011/07/wordpress.htmlを教えてもらったのですが、以下を「ループ開始タグ」の直前に入れるとあります。

    <?php if (is_category()){ $posts = query_posts($query_string . ‘&showposts=10’); } ?>
    <?php if (is_month()){ $posts = query_posts($query_string . ‘&showposts=15’); } ?>
    <?php if (is_year()){ $posts = query_posts($query_string . ‘&showposts=20’); } ?>
    <?php if (is_search()){ $posts = query_posts($query_string . ‘&showposts=25’); } ?>

    「ループ開始タグ」はどこにあるのでしょうか。
    cotegory.php にはないようです。

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

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    <?php if(have_posts()): while(have_posts()): the_post(); ?>
    って書いてある部分、ないですか?

    それがループ開始タグです。
    もしあったら、その部分を
    <?php if (have_posts()) : query_posts($query_string.'&posts_per_page=1'); ?>
    に置き換えてみてください。
    posts_per_page=1 は、1ページに1件表示させるという意味です。

    サンプルで書いていただいた4行ですが、

    if (is_category()) →カテゴリアーカイブの場合
    if (is_month()) →月別アーカイブの場合
    if (is_year()) →年別アーカイブの場合
    if (is_search()) →検索結果の場合

    という意味なので、もし、category.phpを用意するのであればif分岐は必要ありません。
    (今回はカテゴリアーカイブの場合だけ適用出来ればいいのですよね)

    で、ループ開始タグがあれば当然終了タグもあるわけで、
    多分<?php endwhile; endif; ?>ってのが下の方にあるかと思います。
    それは<?php endif; ?>に書き換えてください。
    (開始タグのwhile(have_posts()): the_post(); を消したので、終了タグのendwhile;もいらなくなるわけです。)

    トピック投稿者 nakamy

    (@nakamy)

    mypacecreatorさん、ありがとうございます。

    触る場所は、loop.phpでいいんでしょうか?
    <?php if(have_posts()): while(have_posts()): the_post(); ?> と記載してある箇所はなく、
    <?php while ( have_posts() ) : the_post(); ?>があったので、それを置き換えてみましたが、うまくいきませんでした。

    loop-attachment.php
    page.phpの中に
    <?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>があったのですが、
    締めが<?php endwhile; endif; ?>ではなく、<?php endwhile; // end of the loop. ?>のようで、ためしにこれを直してみたんですが変化はなく。。。

    触る場所を間違えているんでしょうか。
    よろしくお願いいたします。

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    <?php if(have_posts()): while(have_posts()): the_post(); ?> と記載してある箇所はなく、
    <?php while ( have_posts() ) : the_post(); ?>があったので、それを置き換えてみましたが、うまくいきませんでした。

    「うまくいきませんでした。」という場合は、どううまくいかなかったかを書いて頂いたほうがいいです。
    たとえば、どういうエラーメッセージが出たとか、出なかったとか。

    また、テーマ全体のテンプレート構造がわからないので、使用テーマ名か(自作の場合はその旨)を明示したほうがいいです。(文面から推測するに、TwentyTenでしょうか?)

    TwentyTenだとすると、ちょっと説明が面倒なので詳しくはのちほど。

    とりあえず上記ご確認ください。

    トピック投稿者 nakamy

    (@nakamy)

    mypacecreatorさん、ありがとうございます。
    こちらは以下を使っています。
    サーバーの関係から、phpの最新バージョンが入れられないため、3.1.4で構築中です。
    wp:3.1.4
    テーマ:twentyten

    <?php while ( have_posts() ) : the_post(); ?>
    を<?php while ( have_posts() ) : query_posts($query_string.'&posts_per_page=1'); ?>
    に変更
    
    <?php endwhile; // End the loop. Whew. ?>
    を<?php endif; ?>
    カテゴリのページの本文が表示されなきくなりました。
    (ヘッダ、サイドメニュー、フッタは表示される)

    そして、サイドバーのリンク先表示がおかしくなってしまいました。

    <?php $posts = get_posts('numberposts=5&category=1"'); ?>
    <ul class="side">
    <?php foreach($posts as $post): ?>
    <li><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><span><?php the_title(); ?></span></a></li>
    <?php endforeach; ?>
    </ul>

    ↑のようにいれてあるのですが、吐き出したソースはちゃんと該当のurlになっているのに、
    リンク先の内容がふたつとも同じhttp://www.abc.jp/def/になるのですが、何が悪いのでしょうか(T-T)

    <ul class="side">
    <li><a href="http://www.abc.jp/def/" title="test2">http://www.abc.jp/def/</li>
    <li><a href="http://www.abc.jp/ehi/" title="test1">http://www.abc.jp/ehi/</li>
    </ul>
    トピック投稿者 nakamy

    (@nakamy)

    サイドメニューのリンク先表示内容がおかしいのは、どこか、loopを触ったときにおかしいことをしてしまったのでしょうか。

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    <?php while ( have_posts() ) : the_post(); ?>
    を<?php while ( have_posts() ) : query_posts($query_string.’&posts_per_page=1′); ?>
    に変更

    <?php endwhile; // End the loop. Whew. ?>
    を<?php endif; ?>
    カテゴリのページの本文が表示されなきくなりました。

    なるほど理解。

    まず大前提として、
    <?php if~ 文は<?php endif; ?>で、
    <?php while~ 文は <?php endwhile; ?>で閉じる、これ絶対です。

    書き換えていただいたものだと、while文をendifで閉じてるので本文が表示されないということです。
    すみません、TwentyTenを使ってることを知らずに書いてしまったので。。。

    ということで仕切りなおし。
    まず先ほど書き換えていただいたものはいったんもとに戻してください。

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    カテゴリアーカイブ用のテンプレート、category.phpを開いてください。
    中程に、

    get_template_part( 'loop', 'category' );

    と書いてあると思います。これは、
    「loop-category.phpがあればそれを、なければloop.phpを読み込む」という意味です。
    TwentyTenにはloop-category.phpはついていないので、loop.phpを読み込んでいることになります。
    (参考:関数リファレンス/get template part – WordPress Codex 日本語版

    今回、「カテゴリーページに該当カテゴリーの記事を1つだけ表示」、つまりカテゴリ以外では普通に表示させたいと思うので、loop.phpを書き換えるのではなく、loop-category.phpを新しく作ることにします。

    loop.phpをそのまま複製して、loop-category.phpという名前にしてください。
    このloop-category.phpを編集します。

    loop-category.phpの57行目くらいに
    <?php while ( have_posts() ) : the_post(); ?>
    というのがあると思います。

    その1行上に、
    <?php query_posts($query_string.'&posts_per_page=1'); ?>
    を追加してください。

    query_posts() 関数はメインのWordPressループの出力方法をいろいろ変えたりするものです。その下のwhileループの機能をカスタマイズしています。

    次に、<?php while ( have_posts() ) : the_post(); ?>の閉じタグを探します。
    ざざざっと見ていくと、188行目あたりに

    <?php endwhile; // End the loop. Whew. ?>

    ってのがありますよね。これです。
    これの1行下に、
    <?php wp_reset_query(); ?>
    を追加します。

    wp_reset_query()は、さっきカスタマイズしていますしたループを元通りに戻してあげるものです。

    これで保存してUPすれば、カテゴリアーカイブが1件表示になっているはずです。

    参考:テンプレートタグ/query posts – WordPress Codex 日本語版
    参考:関数リファレンス/wp reset query – WordPress Codex 日本語版

    トピック投稿者 nakamy

    (@nakamy)

    mypacecreatorさん、丁寧なご説明ありがとうございます!!
    wpほぼ初心者でご迷惑をおかけしております。

    やってみました。
    そうしましたら、各カテゴリーに「最新の記事」が1記事表示されるようになりました。

    ●くだもの
     -りんご
     -おれんじ
     -ぶどう
    ●やさい
     -トマト
     -きゅうり

    上記で、「きゅうり」が最新記事だとしたら、「くだもの」「やさい」のカテゴリをクリックすると、記事が「きゅうり」になってしまいました。
    そして、やっぱり、「サイドメニュー」からのリンクがurlはあっているのに内容が最新記事である「きゅうり」として表示されます。

    ■各カテゴリの記事を昇順で1記事表示させたい(できれば昇順で)

    よくばりにも昇順(カテゴリで最初に投稿した記事を表示させたい)のですが、
    どこを触ったらよいか教えていただけますか?

    また、「カテゴリに2記事あった場合のサイドメニューからのリンク先がおかしい」のは、上記を変更すると連動して直りますでしょうか?

    トピック投稿者 nakamy

    (@nakamy)

    何度もすみません。

    ●くだもの
     -りんご
    ●やさい
     -トマト

    だけにして、1カテゴリ1記事に変更しましたら、「最新の1記事」が全てのカテゴリのページに表示される現象はなくなりました。

    1カテゴリ2記事以上になるとおかしくなります。

    ↓のような現象になります。

    • 全てのカテゴリに「最新の1記事」が表示される
    • サイドメニューに置いてあるリンク先がurlはあっているのに、内容が「最新の1記事」として表示される

    シングルページの表示がおかしくなっているということでしょうか・・・。

    トピック投稿者 nakamy

    (@nakamy)

    さらに何度もすみません!

    1カテゴリ1記事に変更しましたら、「最新の1記事」が全てのカテゴリのページに表示される現象はなくなりました。

    と書きましたが、直っていませんでした。

    やはり、最新の1記事が全てのカテゴリに表示されている状態です。
    <?php query_posts($query_string.’&posts_per_page=1′); ?> になにかたさないといけないのでしょうか?

    混乱しています。
    申し訳ありません。

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    なんか要望が増えてきたので整理させてください。
    カテゴリアーカイブとサイドバーの処理は別物なので、一緒に考えるとハマります。

    ——————

    ・カテゴリアーカイブのメインループは、昇順(カテゴリで最初に投稿した記事を表示させたい)
     これはつまり、「1つだけ表示させたい」のではなく、ページ送りを出力して2件目以降も表示させる、という意味でしょうか。

    ・「サイドメニューに置いてあるリンク先」
     これは、何を表示させたいのでしょうか。上掲の<?php $posts = get_posts('numberposts=5&category=1"'); ?>だと、「カテゴリID=1の投稿の新着5件を取得」ってことなのですが、やりたいことと合っていますか?
    (カテゴリID=1がnakamyさんのサイトでどれにあたるかわかりませんが、おそらく一番最初に作ったカテゴリなので、”くだもの”でしょうか?)

    ——————-

    一気に書くと混同しそうなので、メインとサイドバー、片方ずつ確認していきましょう。
    「サイドメニュー」のget_postsの方が簡単なのでまずそちらから。

    【「サイドメニュー」で表示させたいものは何ですか?並びは何順ですか?】

    この返答をお待ちするあいだに、メインループのquery_postsの処理を見なおしておきますね。

    トピック投稿者 nakamy

    (@nakamy)

    mypacecreatorさん、本当にありがとうございます!!

    ■カテゴリーアーカイブ
    「1つだけ表示」させたいです。
    ページ送りを出力して2件目以降も表示させなくていいです。

    MTだと、「カテゴリ別ブログ記事リスト」で設定すると、カテゴリーの記事の数が「lastn=”1″」とかで指定できますよね。
    同じことをWPでやりたかったのですが難しい。。。
    「昇順」と書いたのは、いま、2つ記事を登録すると、最新の記事が出てきてしまうので、最初に登録した記事だけを出したかったので、書きました。

    ■「サイドメニューに置いてあるリンク先」
    該当のカテゴリーに登録してある記事のリストを表示させたいです。
    <?php $posts = get_posts(‘numberposts=5&category=1″‘); ?>であっているのですが、
    書いたものでいれると、「りんご」のurlで「ぶどう」の記事が表示されています。

    ●くだもの
     -りんご
     -おれんじ
     -ぶどう(最新記事)

    同様に「おれんじ」のurlで「ふどう」の記事が・・・。

    <?php $posts = get_posts(‘numberposts=5&category=1″‘); ?>はあっていて、loopとかシングルページのテンプレートを変にしてしまったのかなと思ったのですが。。。

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

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    ■「サイドメニューに置いてあるリンク先」
    該当のカテゴリーに登録してある記事のリストを表示させたいです。
    <?php $posts = get_posts(‘numberposts=5&category=1″‘); ?>であっているのですが、
    書いたものでいれると、「りんご」のurlで「ぶどう」の記事が表示されています。

    ●くだもの
     -りんご
     -おれんじ
     -ぶどう(最新記事)

    同様に「おれんじ」のurlで「ふどう」の記事が・・・。

    え。。。
    それはおかしな話ですね。

    先にサイドメニューを解決しましょう。

    1.メインループのことは一旦忘れて、
    TwentyTenをいったんまっ更な状態にもどして(新しくDLしてくるのでもいいです)、改めて

    <?php $posts = get_posts('numberposts=5&category=1'); ?>
    <ul class="side">
    <?php foreach($posts as $post): ?>
    <li><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><span><?php the_title(); ?></span></a></li>
    <?php endforeach; ?>
    </ul>

    だけを追加したものでは、正しく表示できますか?
    ちなみに私の環境では、問題ありませんでした。

    2.

     -りんご
     -おれんじ
     -ぶどう(最新記事)

    と書かれていますが、古い順にしたいのですか?
    もし古い順にする場合、
    ‘numberposts=5&category=1&order=ASC
    という感じで、リストを昇順にする引数を加えてください。

    ##
    ちなみに「category=1″‘」の部分、「”」が1つ余分です。

    トピック投稿者 nakamy

    (@nakamy)

    1.TwentyTen新しくDLして、改めて
    ‘<?php $posts = get_posts(‘numberposts=5&category=1’); ?>
    <ul class=”side”>
    <?php foreach($posts as $post): ?>

15件の返信を表示中 - 1 - 15件目 (全35件中)
  • トピック「カテゴリーページに該当カテゴリーの記事を1つだけ表示させたい」には新たに返信することはできません。