wordpress WordPress コメントの表示に関するメモ

2014年6月22日

WordPress のコメントの表示に関する個人的なメモ。

目次

コメントテンプレートの読み込み

  • 通常は個々の投稿ページ(single.php)や固定ページ(page.php)で、コメントの一覧やコメントフォームを出力する。
  • コメント関係の処理はコメントテンプレート(comments.php)に共通化する。
  • 投稿・固定ページの各テンプレート(single.php, page.php)で「comments_template()」を使ってコメントテンプレートを読み込む。

single.php の例

...
  </div><!--/#content -->
    <div class="postlink">
        <p class="fLeft"><?php previous_post_link('%link', '&laquo; %title'); ?></p>
        <p class="fRight"><?php next_post_link('%link ', '%title &raquo; '); ?></p>
    </div><!-- end of .postlink -->
    
    <?php comments_template(); ?><!--はコメントテンプレートの読み込み -->
    
</div><!--/#main -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
comments_template()
コメントテンプレートを読み込む(組み込む)
パラメータ:ファイル名(オプション)、タイプで分離するかどうか(オプション)
戻り値:なし

テンプレートファイル名の指定
comments.php 以外のテンプレートを読み込むときは、comments_template() の第1パラメータに指定。その際に「/」を付ける。

<?php comments_template('/single_comments.php'); ?>

コメント・トラックバックの分離
コメントとトラックバックを分けて出力するには、第2パラメータに「true」を指定する。
但し、コメントとトラックバックを分けるには、コメントテンプレート側で、そのための処理が必要。

<?php comments_template('', true); ?>

comments.php

コメントの出力 wp_list_comments()

コメントの一覧を出力するには wp_list_comments() を使用する。

以下のようにパラメータを指定せずに記述すると、コメント・トラックバックが混在した一覧が出力される。

<?php  wp_list_comments(); ?>

デフォルトのパラメータ

<?php $args = array(
  'walker'            => null,
  'max_depth'         => '',
  'style'             => 'ul', //コメント一覧を囲むタグを指定
  'callback'          => null, //個々のコメントの出力処理のコールバック関数名
  'end-callback'      => null,
  'type'              => 'all', //タイプ(※)を指定
  'reply_text'        => 'Reply', //返信用リンクの文字列
  'page'              => '',
  'per_page'          => '',
  'avatar_size'       => 32,
  'reverse_top_level' => null, //true を指定すると最も新しいコメントから出力
  'reverse_children'  => '',
  'format'            => 'html5', //or xhtml if no HTML5 theme support
  'short_ping'        => false // @since 3.6,
        'echo'     => true // boolean, default is true
); ?>

タイプ(※)は以下が指定可能

  • all :全て
  • comment :コメントのみ
  • trackback :トラックバックのみ
  • pingback :ピンバックのみ
  • pings : トラックバックとピンバック
コールバック関数の指定

例えば、個々のコメントを「comlist」というコールバック関数を使って出力する場合は以下のように記述する。

<?php wp_list_comments('callback=comlist'); ?>

コールバック関数は通常 functions.php に記述。

//コールバック関数の形式
function コールバック関数名($comment, $args, $depth) {
  $GLOBALS['comment'] = $comment; ?>
  個々のコメントを出力する処理
  <?php
}

パラメータ:
$comment : コメントの内容を表すオブジェクト
$args : wp_list_comments() のパラメータに渡した連想配列
$depth : コメントの深さ(通常のコメントは深さが 1、返信は 2、その返信は 3…)

個々のコメントを出力する処理では、wp_list_comments() によって自動的に </li> が挿入されるのでコールバック関数内で </li> の記述は不要。

コールバック関数の例

//functions.php に記述
function comlist($comment, $args, $depth) {
  $GLOBALS['comment'] = $comment; ?>
  <li class="compost">
  <div id="comment-<?php comment_ID(); ?>">
  <?php comment_text(); ?>
  <div class="reply">
  <?php comment_reply_link(array_merge( $args, array('depth' => $depth, 'max_depth' => 3))); ?>
  </div>
  <p class="cominfo">
  <?php comment_date(); ?> <?php comment_time(); ?>
  |
  <?php comment_author_link(); ?>
  </p>
  </div>
  <?php
}
    
comment_reply_link()
返信のリンクを出力
パラメータ:パラメータの連想配列(オプション)、コメントのオブジェクト(オプション)、投稿のオブジェクト(オプション)
戻り値:なし
返信時の投稿フォームの処理は WordPress 内の JavaScript(comment-reply.js)により行われる。
この JavaScript を正しく動作させるには、個々のコメントを
<div id=”comment-コメントのID”>…</div> で囲む。

また、返信用の JavaScript(wp-includes/js/comment-reply.js)を読み込むように以下のコードを header.php の wp_head(); の直前に追加
(または functions.php に記述)

<?php if (is_singular()) wp_enqueue_script('comment-reply'); ?>

コメントフォームの出力: comment_form()

コメント投稿フォームを出力するには comment_form() を使う。

一般的なコメントフォームを出力するには、パラメータなしで実行するだけ。

<?php comment_form(); ?>

トラックバック URL の出力: trackback_url()

trackback_url() にはパラメータはない。

但し、投稿の編集画面で「このページでトラックバックとピンバックを許可する。」のチェックボックスをオフにしている場合は、トラックバック URL を出力しないように設定する必要があるので以下のようにする。

<?php if(pings_open()): ?>
  トラックバック URL: <?php trackback_url(); ?>
<?php endif; ?>

comments.php の例

コメントやトラックバックがある場合のみ出力するようにするため、if(have_comments()) を使う。

1ページあたりのコメント出力件数を設定すると、コメントが複数ページに分割されるのでその場合「previous_comments_link()」「next_comments_link()」で前後のコメントのページへのリンクを出力する。

comments.php の例

<div id="comments_area">

  <?php if(have_comments()): ?>
    <h3>Comments</h3>
    <ul class="comments_list">
    <?php wp_list_comments('callback=comlist'); ?>
    </ul>
    <?php if(get_comments_number()>5): ?>
      <div id="comments_link">
      <?php previous_comments_link('previous'); ?>  <?php next_comments_link('next'); ?>
      </div><!--/#comments_link -->
    <?php endif; ?>
  <?php endif; ?>
  <?php comment_form(); ?>

  <?php if(pings_open()): ?>
    <p id="trback">
    Track Back URL: <br>
    <?php trackback_url(); ?>
    </p>
  <?php endif; ?>

</div><!--/#comments_area -->