デフォルトのはなんか変。なんとかしなきゃと思いつつ放ってましたがついに手を出すぞ。 結構めんどくさいんですよこれ。
コメントフォームは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_submit | |
title_reply | 「コメントを残す」の表示方法 |
title_reply_to | コメントに対する返信(TwentyElevenでいうところの「返信↓」)の表示方法 |
cancel_reply_link | コメントに対する返信のキャンセル(TwentyElevenでいうところの返信時の「コメントのキャンセル」)の表示方法 |
label_submit | 送信ボタンの表示方法 |
さらに$fields
author | 名前 |
メールアドレス | |
url | サイトアドレス |
ということで、comments.php内で$argsを設定し、comment_form($args)と呼び出せば変更することができるはずです。
どんなフォームにしようか
とりあえずは改行を入れてこんな感じにしたい。「メールアドレスが公開されることはありません」という文言は「メールアドレス」の後ろに。
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付きで呼び出しています。
なーんかスマートじゃないなぁ。コメントの表示(wp_list_comments())のカスタマイズはスマートなのに。