コメントフォームを制御したい

コメントフォームはスパムコメントも多く登録されることから設置しない人も多いようですが、このサイトのコメントフォームは設置しています。わりと海外の方がメールで直接公開しているプラグインの問い合わせをしてくるので、そのうち問い合わせフォームを設置しようかなと思っているのですが、とりあえずコメントフォームを設置しました。

しかし、コメント欄はもちろんですがコメント投稿者の名前とメールアドレスが必須になっているとコメントすること自体を躊躇してしまいそうだなぁと思い(僕自身もしない気がする)、必須を外すと同時にメールアドレスのフォーム自体も非表示にしてしまおうと思って調べてみました。現在のコメントフォームは以下のような感じ。

現在のコメントフォーム
現在のコメントフォーム

コメントフォームのコメント投稿者の名前とメールアドレスの必須を解除

まずは何はともあれコメント投稿者の名前とメールアドレスの必須を解除します。これは既にWordPressの機能としてあるのでその設定を解除します。

管理メニューの「設定」から「ディスカッション」を開くと、他のコメント設定の項目に「コメントの投稿者の名前とメールアドレスの入力を必須にする 」のチェックを外します。これだけでOK。

コメントの投稿者の名前とメールアドレスの入力を必須にする

チェックを外すと、コメントフォームに変化が現れます。「*が付いている欄は必須項目です」というメッセージが非表示になりました。そしてコメント投稿者の名前とメールアドレスの項目名の横に表示されていた「*」マークも非表示になりました。

必須項目の記号「*」が非表示

チェックを外すとソースコードも少々変化します。input要素の属性として設定されていたaria-required=truerequired=requiredの必須項目をあらわす2つの属性もなくなっています。こういうところもちゃんと出来ているところが素敵だ、WordPress。

<input name="author" id="author" aria-required="true" required="required" type="text" size="30" maxlength="245" value="">
<input name="author" id="author" type="text" size="30" maxlength="245" value="">

コメントフォームのメールアドレスを非表示

コメントフォームのフックポイントとしてcomment_form_default_fieldsというものが準備されていて、フックポイントの引数としてコメントフォームのフィールド配列が引き継がれます。次のようなデータで返ってきました。

array (size=3)
  'author' => string '<p class="comment-form-author"><label for="author">名前 <span class="required">*</span></label> <input id="author" name="author" type="text" value="" size="30" maxlength="245" aria-required='true' /></p>' (length=225)
  'email' => string '<p class="comment-form-email"><label for="email">メールアドレス <span class="required">*</span></label> <input id="email" name="email" type="email" value="" size="30" maxlength="100" aria-describedby="email-notes" /></p>' (length=268)
  'url' => string '<p class="comment-form-url"><label for="url">ウェブサイト</label> <input id="url" name="url" type="url" value="" size="30" maxlength="200" /></p>' (length=151)

この連想配列の「email」に空白の値をセットすることでフォームが非表示(削除)できそうです。次のようにテーマの functions.php に書き込みました。

/**
 * Comment Control
 */
 function comment_form_control( $args ) {
	 $args['email'] = '';
	 return $args;
 }
 add_filter( 'comment_form_default_fields', 'comment_form_control' );

メールアドレスのフィールドが非表示になりました。コメント投稿者の名前を非表示にする場合は、$args['author'] = ''に。ウェブサイトを非表示にする場合は、$args['url'] = ''に空白をそれぞれセットすればOKです。

メッセージを非表示

これでOKかと思ったのですが、まだ「メールアドレスが公開されることはありません。」というメッセージが残ったままです。これも非表示にしたい。

フックポイントを探すとcomment_form_defaultというものが準備されていました。フックポイントの引数としてコメントフォーム関連のデフォルト値がセットされている配列が引き継がれます。次のようなデータで返ってきました。

array (size=23)
  'fields' => 
    array (size=3)
      'author' => string '<p class="comment-form-author"><label for="author">名前 <span class="required">*</span></label> <input id="author" name="author" type="text" value="" size="30" maxlength="245" aria-required='true' required='required' /></p>' (length=225)
      'email' => string '<p class="comment-form-email"><label for="email">メールアドレス <span class="required">*</span></label> <input id="email" name="email" type="email" value="" size="30" maxlength="100" aria-describedby="email-notes" aria-required='true' required='required' /></p>' (length=268)
      'url' => string '<p class="comment-form-url"><label for="url">ウェブサイト</label> <input id="url" name="url" type="url" value="" size="30" maxlength="200" /></p>' (length=151)
  'comment_field' => string '<p class="comment-form-comment"><label for="comment">コメント</label> <textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" aria-required="true" required="required"></textarea></p>' (length=205)
  'must_log_in' => string '<p class="must-log-in">コメントを投稿するには<a href="http://vccw.dev/wp-login.php?redirect_to=http%3A%2F%2Fvccw.dev%2Farchives%2F1">ログイン</a>してください。</p>' (length=185)
  'logged_in_as' => string '<p class="logged-in-as"><a href="http://vccw.dev/wp-admin/profile.php" aria-label="admin としてログイン中。プロフィールを編集。">admin としてログイン中</a>。<a href="http://vccw.dev/wp-login.php?action=logout&amp;redirect_to=http%3A%2F%2Fvccw.dev%2Farchives%2F1&amp;_wpnonce=58aad0fa2b">ログアウトしますか ?</a></p>' (length=352)
  'comment_notes_before' => string '<p class="comment-notes"><span id="email-notes">メールアドレスが公開されることはありません。</span> <span class="required">*</span> が付いている欄は必須項目です</p>' (length=200)
  'comment_notes_after' => string '' (length=0)
  'action' => string 'http://vccw.dev/wp-comments-post.php' (length=36)
  'id_form' => string 'commentform' (length=11)
  'id_submit' => string 'submit' (length=6)
  'class_form' => string 'comment-form' (length=12)
  'class_submit' => string 'submit' (length=6)
  'name_submit' => string 'submit' (length=6)
  'title_reply' => string 'コメントを残す' (length=21)
  'title_reply_to' => string '%s にコメントする' (length=24)
  'title_reply_before' => string '<h3 id="reply-title" class="comment-reply-title">' (length=49)
  'title_reply_after' => string '</h3>' (length=5)
  'cancel_reply_before' => string ' <small>' (length=8)
  'cancel_reply_after' => string '</small>' (length=8)
  'cancel_reply_link' => string 'コメントをキャンセル' (length=30)
  'label_submit' => string 'コメントを送信' (length=21)
  'submit_button' => string '<input name="%1$s" type="submit" id="%2$s" class="%3$s" value="%4$s" />' (length=71)
  'submit_field' => string '<p class="form-submit">%1$s %2$s</p>' (length=36)
  'format' => string 'xhtml' (length=5)

どうやら10行目に設定されているcomment_notes_beforeという連想配列に空の値をセットすればよさそう。コメントフォームのフィールド非表示と同様に次のようにテーマの functions.php に書き込みました。

function comment_notes_before( $args ){
	$args['comment_notes_before'] = '';
	return $args;
}
add_filter( 'comment_form_defaults', 'comment_notes_before' );

よしよし削除できた。これにて一件落着……と思ったのですが、comment_form_defaultの引数、よくよく見てみたら、コメントフォームのフィールドも含まれている!(4~6行目)

これ、フックポイント2つ利用するより今回のようなケースであれば、一つにまとめられるんじゃないかと思った。

comment_form_defaultで処理をまとめる

処理をcomment_form_defaultのフックポイント用関数にまとめました。5行目にあるように、field要素は2次元配列になっているので、ちょっとひと手間。

/**
 * Comment Control
 */
 function comment_form_control( $args ) {
	 $args['fields']['email']      = '';
	 $args['comment_notes_before'] = '';
	 return $args;
 }
 add_filter( 'comment_form_defaults', 'comment_form_control' );

完成!\(^o^)/ メールアドレスの非表示ができてコメント投稿者の名前の必須もなくなりました。

メールアドレスを非表示
メールアドレスを非表示にしたコメントフォーム

参照