WordPress では、コメントフォームのテンプレートを作成する為に comments.php を作成するのですが、その方法が (見付けるのを含めて) パッと見て分かる様になっていませんでした。

多分調べるのとか試すのとか面倒臭くなってデフォルトで運用してる人も多いと思うので、備忘録がてら記事を書いておこうと思います。

comments.php の用途と方法

そもそも comments.php が何かって話ですが、これはコメントフォームのテンプレート用ファイルです。comments_template() を利用する事で埋め込む事が出来ます。

comments.php の中には大体二つの機能を入れる事になります。

一つは記事に対するコメントの表示で、もう一つはコメントのフォームです。

コメントの表示

コメントの表示は wp_list_comments() を使う事で可能になります。

使い方はこっちの方が分かり易いかも。

have_comments() を使う事で現在の記事へのコメントが存在するかを判別する事が出来ます。[WordPress] have_comments()がFALSEを返しコメントが表示されない現象によると、この関数は (WP でグローバル変数として扱われる) $post を利用している為、$post を書き換えていると正常に動作しなくなるので注意が必要です。

僕は、更にcomments_open()get_commnets_number() を利用してコメント欄の表示を決めています。

コードは下記の様にしています。

if ( comments_open() && have_comments() && get_comments_number() ) { ?>
<h3>この記事へのコメント</h3>
<ol class="comment-list">
  <?php wp_list_comments( array('style' => 'ol', 'short_ping' => true, 'avatar_size'=> 34) ); ?>
</ol>
<?php
}?>

カスタムフォームの作り方

コメントフォームを独自の物に変更する場合は comment_form() に連想配列を渡す必要があります。

僕は下記の様にしました。

<?php
function custom_fields( $args ) {
  $label = '<label for="'. $args["type"] .'">' . __( $args["label"] ) . '</label> ';
  $span = '<span class="required">*</span>';
  $p = '<p>'. $label . ( $args["req"] ? $span : '' ) .'</p>';
  $comment_form = '<div class="comment-form-'. $args["type"] .'">'. $p .'</div>';
  $input = '<input id="'. $agrgs["type"] .'" name="'. $args["type"] .'" type="text" value="'. esc_attr( $args["author"] ) .'" size="30"'. $args["aria"] .' />';
  $clearfix = '<div class="clearfix"></div>';
  return '<div class="input">'. $comment_form . $input .'</div>'. $clearfix;
}
?>
<?php
function custom_form() {
  $commenter = wp_get_current_commenter();
  $req = get_option( 'require_name_email' );
  $aria_req = ( $req ? " aria-required='true'" : '' );

  $fields =  array(
    'author' => custom_fields(
      array('type' => 'author',
            'label' => '名前',   /* コメント記入者の名前*/
            'req' => $req,       /* false にすると記入必須マークを消す */
            'author' => $commenter['comment_author'],
            'aria' => $aria_req) /* 空文字にすると記入必須では無くなる */
    ),
    'email' => custom_fields(
      array('type' => 'email',
            'label' => 'メール',
            'req' => $req,
            'author' => $commenter['comment_author_email'],
            'aria' => $aria_req)
    ),
    'url' => custom_fields(
      array('type' => 'url',
            'label' => 'URL',
            'req' => false,
            'author' => $commenter['comment_author_url'],
            'aria' => '')
    )
  );

  $comment_label = '<label for="comment">' . __( '' ) . '</label>';
  $comment_textarea = '<textarea id="comment" name="comment" cols="45"
  rows="8" aria-required="true"></textarea>';
  $comment_notes_before = NULL;
  $comment_field = '<div class="comment-form-comment">'. $comment_label . $comment_textarea .'</div>';

  $args = array(
    'fields' => $fields,
    'comment_notes_before' => $comment_notes_before,
    'comment_field' => $comment_field
  );

  return $args;
}?>

流用する場合は関数内のコードを変更して下さい。

comments.php には殆ど関数の呼び出ししか入れていません。

comments.php

<div class="comments-area" id="comments">
  <?php posted_comments(); ?><?php comment_form( custom_form() ); ?>
</div>

結構 functions.php にコードを詰め込んでるので、ファイルが肥大化してこちらの可読性が下がって来ているのを現在実感中です。割と良い感じに分割出来る仕組みはあるんですかね。
また調べておきます。