work.log

元エンジニアの備忘録的ブログ

WordPressのコメントフォームで名前のみを必須にする

投稿:2013-05-24 19:40  更新:

WordPress のコメントフォームで WordPress のコアファイルを弄ることなく名前のみを必須入力にする方法を書きたいと思います。

WordPress ディスカッション設定では “名前・メールアドレスの入力” を分けることができません。

名前は必要でもメールアドレスまでは不要というケースも多いと思います。TwentyTwelve をカスタマイズしていてずっと気になっていたので今回本腰を入れて調べました。

コメントフォームで名前のみを必須入力にする方法

コメントフォームの動作解説は後回しにして、方法から書きたいと思います。

まず、functions.php に下記コードを追加します。

function preprocess_comment_author( $commentdata ) {
    if ("" === trim( $commentdata['comment_author'] ))
    wp_die('名前を入力して下さい。');
    return $commentdata;
}
add_filter('preprocess_comment', 'preprocess_comment_author', 2, 1);

次に WordPress の管理画面より、[設定] → [ディスカッションの設定] を開き “名前とメールアドレスの入力を必須にする” のチェックを外します。

WordPressディスカッションの設定

twentytwelve-customize-023-01

設定としてはたったこれだけです。

最後にコメントフォームの動作チェックをします。コメント欄のみを入力して送信した場合に下記のようになれば OK です。

名前が未入力の場合

twentytwelve-customize-023-02

コメントフォームの判定動作 ? DB へコメントデータを渡すまでは以降で説明します。

参考にしたページ

たった6行追加するだけでコメントの名前だけを必須にする方法

WordPressコメントフォームの仕組み

今回はコメントフォームに入力されたデータが、どのように DB へ格納されるのかを細かく追ってみましたので下記で解説していきます。

コメントデータの処理フロー

TwentyTwelve では comments.php 内に comment_form という設定がありますが、これがコメント処理の開始位置になります。ここから DB インサートまではざっくりですが以下のような感じです。

  1. コメントフォームからデータを wp-comments-post.php へ POST
  2. wp-comments-post.php で入力内容の判定処理
  3. wp-includes/comment.php の wp_new_comment を呼び出し
  4. wp_new_comment 内でデータに preprocess_comment フィルターフック関数を適用
  5. preprocess_comment の処理後、環境変数等をデータに追加
  6. コメントデータとして DB にインサート

追加した処理を理解するため “2番と4番” を更に調べていきます。

コメントフォームの入力内容判定

“名前・メールアドレス” の判定は WordPress コアファイルの wp-comments-post.php で処理されています。

コメントデータが wp-comments-post.php へ POST された後、下記のような判定処理を行います。

if ( get_option('require_name_email') && !$user->exists() ) {
    if ( 6 > strlen($comment_author_email) || '' == $comment_author )
        wp_die( __('<strong>ERROR</strong>: please fill the required fields (name, email).') );
    elseif ( !is_email($comment_author_email))
        wp_die( __('<strong>ERROR</strong>: please enter a valid email address.') );
}

ディスカッションの設定で “名前・メールアドレスの入力” を必須にすると、76行目にある require_name_email にフラグが立ちフォーム入力の判定が有効になります。

この後に続く判定内容で “名前のみ” を判定するようにコードを書き換えても意図した動作になりますが、この方法では WordPress をアップデートした際に修正内容が消えてしまいます。

続いて、この判定処理を通過したコメントデータは wp_new_comment で処理されます。

$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID');

$comment_id = wp_new_comment( $commentdata );

wp-comments-post.php では (直接触らないと) 何もできそうにないので wp_new_comment を追って行きます。

wp_new_commentの処理内容

wp_new_comment は wp-includes/comment.php で定義されています。

コメントデータへの処理だったり DB に渡す部分はここでやっているみたいです。

function wp_new_comment( $commentdata ) {
        $commentdata = apply_filters('preprocess_comment', $commentdata);
.
.
.

開始まもなく apply_filters でフィルターフック関数名 preprocess_comment が設定されています。

ここからフィルターフックが使える状態になりますが、これには wp-comments-post.php の判定を通過している事が前提ですので、ディスカッション設定で “名前・メールアドレス” の必須項目を無効にしていた訳です。

続いて、preprocess_comment のフィルターフックについて追っていきます。

preprocess_commentをフィルターフックする

preprocess_comment は今回追加した preprocess_comment_author で更にフィルターフックしています。

この preprocess_comment の中身には下記データが格納されています。

  • comment_post_ID
  • comment_author
  • comment_author_email
  • comment_author_url
  • comment_content
  • comment_type
  • user_ID

関数名から大体何のデータかわかると思いますが、今回は “名前” のみをチェックすればよい訳ですから comment_author を以下の 2行目でチェックしています。

function preprocess_comment_author( $commentdata ) {
    if ("" === trim( $commentdata['comment_author'] ))
    wp_die('名前を入力して下さい。');
    return $commentdata;
}
add_filter('preprocess_comment', 'preprocess_comment_author', 2, 1);

add_filter の優先度については Akismet を有効にしている場合、“1以上” にしておけば良いと思います。

※ Akismet でも preprocess_comment をフィルターフックしていて優先度が 1 のためです。

そうすると “Akismet でスパム判定” → “名前の入力判定” の順にフィルターフックが適用されます。

WP Multibyte Patch もこのフィルターフックを利用して処理を行なっています。

WP Multibyte Patch の優先度は 99 なので今回は関係ないですが、これ以外に preprocess_comment をフィルターフックしている WordPress プラグインがある場合には、優先度をチェックしておく必要があると思います。

preprocess_comment の処理後は “送信元 IP, User Agent, 日付” 等が追加され DB にインサートされます。

簡単ですがコメントの処理内容としてはこんな感じです。WordPress のフィルターフックって良くできてますね。

WordPress – プラグイン API/フィルターフック一覧

諸事情により、当記事の設定は解除しております。そのため、当ブログでのコメントフォーム動作確認はお控えください。