トリコロールな猫

猫とつくばと茨城をこよなく愛するnekotricolorのブログです

Wordpressのコメントフォーム(comment_form)をカスタマイズ

デフォルトのはなんか変。なんとかしなきゃと思いつつ放ってましたがついに手を出すぞ。 結構めんどくさいんですよこれ。

コメントフォームはcomments.phpのcomment_form()の引数で決まる

トリコロールな猫のテンプレートはnekotricolorオリジナルです。コメントに関するPHPファイルcomments.phpも必要最低限のみですが自分で書いています。 comments.phpを作成し、表示方法をカスタマイズするところまでは以前「comments.phpを1から作る」で書きました。書き込まれたコメントを表示するための関数はwp_list_comments()ですね。

コメントの入力フォームは、comments.php内でcomment_form()を呼び出すことで表示されます。カスタマイズはcomment_form()の引数を設定することで行います。

どんな引数があるか?

Wordpress Codex 日本語版 テンプレートタグ/comment formによると、comment_form()には$argsと$postidという引数を持っており、それぞれ以下のようなデフォルト値になっています。

$args

<?php $defaults = array(
    'fields'               => apply_filters( 'comment_form_default_fields', $fields ),
    'comment_field'        => '<p class="comment-form-comment"><label for="comment">' . _x( 'Comment', 'noun' ) . '</label><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p>',
    'must_log_in'          => '<p class="must-log-in">' .  sprintf( __( 'You must be <a href="%s">logged in</a> to post a comment.' ), wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>',
    'logged_in_as'         => '<p class="logged-in-as">' . sprintf( __( 'Logged in as <a href="%1$s">%2$s</a>. <a href="%3$s" title="Log out of this account">Log out?</a>' ), admin_url( 'profile.php' ), $user_identity, wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>',
    'comment_notes_before' => '<p class="comment-notes">' . __( 'Your email address will not be published.' ) . ( $req ? $required_text : '' ) . '</p>',
    'comment_notes_after'  => '<p class="form-allowed-tags">' . sprintf( __( 'You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: %s' ), ' <code>' . allowed_tags() . '</code>' ) . '</p>',
    'id_form'              => 'commentform',
    'id_submit'            => 'submit',
    'title_reply'          => __( 'Leave a Reply' ),
    'title_reply_to'       => __( 'Leave a Reply to %s' ),
    'cancel_reply_link'    => __( 'Cancel reply' ),
    'label_submit'         => __( 'Post Comment' ),
);
?>

さらに$fieldsのデフォルト値は:

<?php
$fields =  array(
    'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Name' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
                '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>',
    'email'  => '<p class="comment-form-email"><label for="email">' . __( 'Email' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
                '<input id="email" name="email" type="text" value="' . esc_attr(  $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' /></p>',
    'url'    => '<p class="comment-form-url"><label for="url">' . __( 'Website' ) . '</label>' .
                '<input id="url" name="url" type="text" value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="30" /></p>',
); ?>

$postid 現在の投稿

$args大量。読む気しないけど折れない。

各パラメータの意味は以下の通り。

fields コメント入力フォーム以外のフィールドの表示方法
comment_field コメント入力フォームの表示方法
must_log_in ログインないとコメントを送信できない旨の表示
logged_in_as 「[ユーザ名]としてログインしています。ログアウトしますか ?」という部分の表示方法
comment_notes_before コメント欄の前に表示する文字列の表示方法
comment_notes_after コメント欄の後ろに表示する文字列の表示方法
id_form
タグのID
id_submit タグのID
title_reply 「コメントを残す」の表示方法
title_reply_to コメントに対する返信(TwentyElevenでいうところの「返信↓」)の表示方法
cancel_reply_link コメントに対する返信のキャンセル(TwentyElevenでいうところの返信時の「コメントのキャンセル」)の表示方法
label_submit 送信ボタンの表示方法

さらに$fields

author 名前
email メールアドレス
url サイトアドレス

ということで、comments.php内で$argsを設定し、comment_form($args)と呼び出せば変更することができるはずです。

どんなフォームにしようか

今はこんな感じ。 2013-01-10-1

とりあえずは改行を入れてこんな感じにしたい。「メールアドレスが公開されることはありません」という文言は「メールアドレス」の後ろに。 2013-01-10-2

comments.php修正

comments.php

<?php comment_form(); ?>

を以下のように変更。

<?php
// デフォルト値取得
$commenter = wp_get_current_commenter();
$req = get_option( 'require_name_email' );
$aria_req = ( $req ? " aria-required='true'" : '' );

// $fields設定
$fields = array(
    'author' => '<p id="inputtext">' . '<label for="author">' . __( 'Name' ) 
                . ( $req ? '(必須)' : '' ) . '</label> ' .
                '<br /><input id="author" name="author" type="text" value="' 
                . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>',

    'email'  => '<p id="inputtext"><label for="email">' . __( 'Email' ) 
                . ( $req ? '(必須/公開はされません)' : '' ) . '</label> ' .
                '<br /><input id="email" name="email" type="text" value="' 
                . esc_attr(  $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' /></p>',

    'url'    => '<p id="inputtext"><label for="url">' . __( 'Website' ) . '</label>' .
                '<br /><input id="url" name="url" type="text" value="' 
                . esc_attr( $commenter['comment_author_url'] ) . '" size="60" /></p>',
    ); 

// $comment_field設定
$comment_field = '<p class="comment-form-comment"><label for="comment">' . _x( 'Comment', 'noun' ) . '(必須)</label><br /><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p>';

// $comment_notes_before設定
$comment_notes_before = NULL;

// $args設定
$args = array(
    'fields'       => apply_filters( 'comment_form_default_fields', $fields ),
    'comment_field'        => $comment_field,
    'comment_notes_before'     => $comment_notes_before,
);
?>

<?php comment_form($args); ?>

9、14、19行目$fields設定で「お名前」「メールアドレス」「ウェブサイト」の後に、25行目$comment_field設定で「コメント」の後にそれぞれ「(必須)」とを入れています。メールアドレスの部分には公開されない旨も。

ログインの有無の表示はこのサイトではいらないので、$comment_notes_beforeは空にしました。

31行目で$fields、$comment_fields、$comment_notes_beforeを$argsという配列に入れ、38行目でcomment_form()を引数$args付きで呼び出しています。

これで、以下のような表示になります。 2013-01-10-3

なーんかスマートじゃないなぁ。コメントの表示(wp_list_comments())のカスタマイズはスマートなのに。

参照