サポート » テーマ » コメント投稿のある記事一覧・その記事に対するコメント一覧 の作成

  • 解決済 worevl

    (@worevl)


    [ 目的 ] : コメント投稿のある記事一覧・その記事に対するコメント一覧 の作成

    [ 状況例 ] :

    1. 記事 [1], [2], [4] にコメント投稿があり、記事 [3] にはコメント投稿がない
    2. コメントがある記事のみ、一覧に表示する
    3. 記事一覧の表示の際に、各記事に投稿されたコメントの投稿者名をリンク付きで一覧表示する

    [ 表示させたい生成ソース ] :

    <p class="entry-name"><a href="記事 [4] のURL">記事 [4] タイトル</a></p>
      <p class="comment-author">・<a href="記事 [4] のURL#comment_2">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [4] のURL#comment_4">コメント投稿者名</a></p>
    
    <p class="entry-name"><a href="記事 [2] のURL">記事 [2] タイトル</a></p>
      <p class="comment-author">・<a href="記事 [2] のURL#comment_3">コメント投稿者名</a></p>
    
    <p class="entry-name"><a href="記事 [1] のURL">記事 [1] タイトル</a></p>
      <p class="comment-author">・<a href="記事 [1] のURL#comment_1">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [1] のURL#comment_5">コメント投稿者名</a></p>

    [ 自分で考えた テンプレートソース ] :

    <?php if( have_posts() ) : while( have_posts() ) : the_post(); if( have_comments() ) : ?>
    
    <p class="entry-name">
    
    <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
    <?php the_title_attribute(); ?>
    </a>
    
    </p>
    
    <?php foreach ( $comments as $comment ) : ?>
    
    <p class="comment-author">
    
    ・<a href="<?php the_permalink(); ?>#comment_<?php comment_ID(); ?>">
    <?php comment_author(); ?>
    </a>
    
    </p>
    
    <?php endforeach; php endif; endwhile; endif; ?>

    [ 実行結果 ] :

    <p class="entry-name"><a href="記事 [4] のURL">記事 [4] タイトル</a></p>
      <p class="comment-author">・<a href="記事 [4] のURL#comment_1">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [4] のURL#comment_2">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [4] のURL#comment_3">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [4] のURL#comment_4">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [4] のURL#comment_5">コメント投稿者名</a></p>
    
    <p class="entry-name"><a href="記事 [3] のURL">記事 [3] タイトル</a></p>
      <p class="comment-author">・<a href="記事 [3] のURL#comment_1">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [3] のURL#comment_2">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [3] のURL#comment_3">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [3] のURL#comment_4">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [3] のURL#comment_5">コメント投稿者名</a></p>
    
    <p class="entry-name"><a href="記事 [2] のURL">記事 [2] タイトル</a></p>
      <p class="comment-author">・<a href="記事 [2] のURL#comment_1">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [2] のURL#comment_2">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [2] のURL#comment_3">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [2] のURL#comment_4">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [2] のURL#comment_5">コメント投稿者名</a></p>
    
    <p class="entry-name"><a href="記事 [1] のURL">記事 [1] タイトル</a></p>
      <p class="comment-author">・<a href="記事 [1] のURL#comment_1">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [1] のURL#comment_2">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [1] のURL#comment_3">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [1] のURL#comment_4">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [1] のURL#comment_5">コメント投稿者名</a></p>

      自分なりに考えたソースで実行してみました。

      ですが、どうも have_posts() という関数が、
      「ある記事に対してコメントがあるかどうか?」 の判定ではなく、
      「ブログ全体を通してコメントがあるかどうか?」 という判定のような気がします。

      元々は、下記のソースのように、コメントがある記事を表示し、
      その記事に対するコメントの一覧を表示したいです。

      しかし、試しに作ってみたソースで実行したところ、
      どの記事にコメントがあったか関係なく、
      元々記事のない記事にさえもコメント一覧が表示されてしまっています。

    [ 表示させたい生成ソース ] :

    <p class="entry-name"><a href="記事 [4] のURL">記事 [4] タイトル</a></p>
      <p class="comment-author">・<a href="記事 [4] のURL#comment_2">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [4] のURL#comment_4">コメント投稿者名</a></p>
    
    <p class="entry-name"><a href="記事 [2] のURL">記事 [2] タイトル</a></p>
      <p class="comment-author">・<a href="記事 [2] のURL#comment_3">コメント投稿者名</a></p>
    
    <p class="entry-name"><a href="記事 [1] のURL">記事 [1] タイトル</a></p>
      <p class="comment-author">・<a href="記事 [1] のURL#comment_1">コメント投稿者名</a></p>
      <p class="comment-author">・<a href="記事 [1] のURL#comment_5">コメント投稿者名</a></p>

      長い文章になりましたが、指南いただけないでしょうか?
      どうかお願い致します。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • 記事一覧(index.php など)のときは have_comments, $comments を
    そのまま使っても正しく動作しないので以下のようにします。

    <?php if( have_posts() ) : while( have_posts() ) : the_post(); if(get_comments_number() > 0) : ?>
    
    <p class="entry-name">
    
    <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
    <?php the_title_attribute(); ?>
    </a>
    
    </p>
    
    <?php $comments = get_comments(null, ARRAY_A); foreach ( $comments as $comment ) : ?>
    
    <p class="comment-author">
    
    ・<a href="<?php the_permalink(); ?>#comment_<?php comment_ID(); ?>">
    <?php comment_author(); ?>
    </a>
    
    </p>
    
    <?php endforeach; endif; endwhile; endif; ?>
    トピック投稿者 worevl

    (@worevl)

    具体的なソースを書いていただき、ありがとうございます。

    無事、表示させることができました。

    ところで、コメントがあった日時を比較して記事を降順に並べることは可能ですか?

    例えば、1番最近にコメントがあった記事を1番上に表示する…
    といった感じです。

    こんな感じでどうでしょう。

    <?php
    $outputs = array();
    if(have_posts()) :
      while(have_posts()) :
        the_post();
        if(get_comments_number() > 0) :
          $output = '<p class="entry-name"><a href="' . get_permalink()
                  . '" title="' . the_title_attribute('echo=0') . '">■' . get_the_title() . '</a></p>';
          $comments = get_comments('status=approve&post_id=' . get_the_ID());
          foreach ($comments as $comment) :
            $output .= '<p class="comment-author">'
    	        .  '・<a href="' . get_permalink() .'#comment_' . get_comment_ID . '">'
    	        . $comment->comment_author . '</a></p>';
          endforeach;
          $outputs[$comments[0]->comment_date] = $output;
        endif;
      endwhile;
      krsort($outputs);
      echo implode("\n", $outputs);
    endif;
    ?>
    トピック投稿者 worevl

    (@worevl)

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

    コメント投稿が新しい記事を1番上に表示し、
    その記事のコメント一覧を表示することが出来ました。

    get_comment_ID ⇒ get_comment_ID()

    としてみたところ、投稿されたコメントの位置にジャンプ出来ました。

    ところで、kzさんはWordPressに詳しいようですが、
    テンプレートタグ以外のことはどう勉強されましたか?

    色々なWEBサイトを回ったり、本を読んでみたりしますが、
    なかなかグローバル変数や、データベースに触れているものがないため、
    今回のように、テンプレートタグだけでは実現できない機能をブログに持たせる際、
    どう対処して良いのか、また、どう勉強して良いのか分かりません。

    もし、おススメのサイトや書籍がございましたら、教えていただけませんか?

    どう勉強されましたか?

    必要になった時に Codex と WordPress のソースを見ます。
    Codex がウソくさいなと思ったらソースで確認すると良いです;)

    関数/タグ名がわかっているなら
    PHPXref 0.7:WordPress
    あたりも便利です。

    このフォーラムの回答は、ほとんど質問を見てから単語をヒントにソースを調べてます。
    開発者の意図を汲み取るようにするとソースを読み解くのが早くなりますよ。

    例)get_comments_number() を知った経緯。
    0.single.php 以外でコメント数が知りたい!
    1.Defaultテーマの index.php で コメントなし/1件/複数 を表示している。
    2.よく見かける comments_popup_link() が使われてる。
    3.comments_popup_link()内部で $number = get_comments_number( $id ); の記述がある。
    4.get_comments_number()内部で $post->comment_count を取得している。
    5.Codex が意味不明なので、テストコードを書いて動作確認。
    6.get_comments_number() は指定した投稿IDのコメント数を取得するのだと、確定。

    解決しましたら、
    このページの右側のわかりにくい場所に
    「このトピックは」とありますので
    [未解決]を[解決済]に変更して
    [変更]ボタンをクリックしていただくと
    良い感じです。

    トピック投稿者 worevl

    (@worevl)

    必要になった時に Codex と WordPress のソースを見ます。

    やはり経験と慣れということですね。
    そう考えると、苦しんだ分だけ前に進める気がします。

    またフォーラムで会う機会があれば、どうぞよろしくお願いいたします。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「コメント投稿のある記事一覧・その記事に対するコメント一覧 の作成」には新たに返信することはできません。