WebDesign Dackel

WordPressで記事毎のコメント一覧をプラグインを使わずに実装する

Hatena0
Google+0
Pocket0
Feedly0

WordPressのプラグインはとても便利なものが多くて重宝しますが、あまりプラグインを入れすぎるのは好きではなく、実装出来る箇所はプラグインを入れないという方針でやっています。
テーマは一から作成して、記事についているコメント欄もプラグインを使わずに、独自に実装をしています。

実装を進めているときにつまづいたのは、have_comments()という関数で記事にコメントデータがあるかどうか判定をしようしていたのですが、何故かコメントのある記事でもfalseが帰ってきてしまうという症状が出てしまい、うまく実装が出来ませんでした。

ぐぐってみると同じ症状で、悩んでいる方がいて、そこに良い解決法がありました。

トップページの記事一覧にコメントも表示したい

コメント用のテンプレートを呼び出す前にはhave_comments()が使えず、呼び出しを実行した後であれば使用できるそうです。
ただ、今回実装した方法は上記リンクの一番下にある

if ( $comments = get_approved_comments( $post->ID ) ) :
endif;

この構文を使って解決しました。
参考までに今回僕が実装したコメント欄の全体のコードを載せておきたいと思います。
(他の方のブログを参考につぎはぎな部分があり、ちゃんと理解できていない箇所がありますがご了承下さい)

<?php if( $comments = get_comments(array('status'=>'approve', 'order'=>'asc', 'post_id'=>$post->ID)) ) : ?>
<div>
  <h3>Comments</h3>
  <?php
  foreach($comments as $comment):
  $post = get_post($comment->comment_post_ID);
  ?>
  <dl>
    <dt>
      <span><i></i><?php comment_author_link(); ?>より</span>
      <span><i></i><?php comment_date("Y.m.d"); ?></span>
    </dt>
    <dd><?php comment_text(); ?></dd>
  </dl>
  <?php endforeach; ?>
</div>
<?php endif; ?>

1.記事に対するコメントが存在する場合は、コメントの一覧を表示

<?php if( $comments = get_comments(array('status'=>'approve', 'order'=>'asc', 'post_id'=>$post->ID)) ) :  ?>
記事に対するコメントがある場合は、ここにコメントの一覧を表示
<?php endif; ?>

get_comments()関数は使って、コメントのデータを取得してデータが取得できればtrueが一覧の表示を行います。
パラメータには、statusがapprove(承認済み)、orderが昇順(古いコメントが上に来るようにしたかったので)、post_idに現在の記事のIDをセットします。
返って来たコメントデータは$commentsに格納されます。

2.コメントを一覧表示

wp_list_comments()を使えば、<li>として簡単に一覧が表示出来るのですが、マークアップを自由に変更したかったので以下のように表示させています。

foreach($comments as $comment):
endforeach;

取得した$commentsをforeachにかけて、一覧表示を行います。

$post = get_post($comment->comment_post_ID);

$post変数に対して、コメントデータをセット?しちゃいます。(ここらへん理解が曖昧です)

3.各コメントの内容を出力

comment_author_link(); //コメントしたユーザ名+リンクを表示させます。
comment_date("Y.m.d"); //コメントした日付
comment_text(); //コメントの内容

この3つの関数で大体の表示は出来るかと思います。
アバターの画像を表示したい場合は、get_avatar()を使って表示出来るかと思います。
コメントの表示はプラグインを使わなくても意外と簡単に実装が出来ました。
ディスカッションみたいなものを実装しようとしたら面倒なのかな?またそれは調べてみたいなと思います。
間違っている箇所、こうした方がいいんじゃねぇか?などありましたらコメント頂けると非常に嬉しいです。