2.10 コメントバイパス(スパム対策)

 コメントが寄せられると通常、次のフローになるようです。
 1. データベースにコメントのデータが保存される。
 2. Akismet でスパム判定される。
 3. コメントがメールで管理者に送られる。
 4. スパムコメントの場合は、メールを削除する。
 5. スパムコメントの場合は、WordPress にログインしてそのコメントを削除する。

 スパムコメントの場合、わざわざログインして削除する手間をかけさせられるのは不愉快です。また、(今使っているレンタルサーバーではありませんが)あるレンタルサーバーではメールの受信に欧米のスパム判定システムを使っており、まともなメールまでスパムと判定されたことが何件かありました。Akismet で日本語のコメントに対して、どの程度スパム判定できるのかとの疑問もあります。

 コメントバイパスのフローは次の通りです。
 1. データベースにコメントのデータを保存しない。
 2. コメントを直接メールで作成者に送る。
 3. スパムコメントの場合は、メールを削除するだけ。

 フック'pre_comment_on_post'は、“分岐”に使っています。
 下記関数に関しては“共通関数”をご覧ください。
  hk_func_post_read
  hk_func_spam_check
  hk_func_get_local_time
  hk_func_site_name

コード

// --------------------------------
// コメントバイパス
// --------------------------------
function hk_functions_comment_bypass( $comment_post_id ) {
    // POSTのチェック
    if ( ! isset( $_POST['author'] ) )          die;
    if ( ! isset( $_POST['email'] ) )           die;
    if ( ! isset( $_POST['comment'] ) )         die;
    // POSTされたデータの取り込み
    $author  = hk_func_post_read( 'author', 1 );
    $email   = hk_func_post_read( 'email', 1 );
    $comment = hk_func_post_read( 'comment', 2 );
    // コメントを送信された投稿・ページのタイトル
    $post_info  = get_post( $comment_post_id ); 
    $post_title = $post_info->post_title;
    if ( $post_title == '' )                    die;
    // 作成者のメールアドレス
    $post_author = $post_info->post_author;
    $author_obj  = get_userdata( $post_author );
    $author_mail = $author_obj->user_email;
    // 送信者の名前のチェック
    $length_mb = mb_strlen( $author );
    if ( $length_mb == 0 )
        wp_die('<h1>エラー</h1><h3>お名前を入力してください。</h3>');
    else if ( $length_mb > 10 )
        wp_die('<h1>エラー</h1><h3>お名前は全角10文字以内でお願いします。</h3>');
    // 送信者のメールアドレスのチェック
    $length = strlen( $email );
    if ( $length == 0 )
        wp_die('<h1>エラー</h1><h3>メールアドレスを入力してください。</h3>');
    else if ( $length > 60 )
        wp_die('<h1>エラー</h1><h3>メールアドレスは60文字以内でお願いします。</h3>');
    else if ( filter_var( $email, FILTER_VALIDATE_EMAIL ) === false )
        wp_die('<h1>エラー</h1><h3>メールアドレスの書式が正しくありません。</h3>');
    // コメントの有無のチェック
    $length = strlen( $comment );
    if ( $length == 0 )
        wp_die('<h1>エラー</h1><h3>コメントを入力してください。</h3>');
    // コメントのマルチバイト有無チェック
    $length_mb = mb_strlen( $comment );
    if ( $length == $length_mb )
        wp_die('<h1>エラー</h1><h3>日本語で入力してください。</h3>');
    // コメントの文字数チェック
    if ( $length_mb > 400 )
        wp_die('<h1>エラー</h1><h3>コメントは全角400字以内でお願いします。</h3>');
    // コメントのスパムチェック URL HTML
    $rtc = hk_func_spam_check( $comment );
    if ( $rtc == 1 )
        wp_die('<h1>エラー</h1><h3>URLを含むコメントは受付ません。</h3>');
    if ( $rtc == 2 )
        wp_die('<h1>エラー</h1><h3>HTMLを含むコメントは受付ません。</h3>');
    // 送信者の情報
    $host_addr  = $_SERVER["REMOTE_ADDR"];
    $host_name  = gethostbyaddr( $host_addr );
    $host_agent = $_SERVER["HTTP_USER_AGENT"];
    // 送信時刻
    $date = hk_func_get_local_time();
    //------------------------------
    // メール送信
    //------------------------------
    $site_name = hk_func_site_name();
    // メールアドレス
    $to   = $author_mail;
    $from = get_bloginfo('admin_email');
    // メールタイトル
    $title = '【'.$site_name.'】コメントが送信されました';
    // HEADER
    $header = 'From: '.$from;
    // MESSAGE BODY
    $body  = '【'.$site_name.'】から下記のコメントが送信されました。'."\n\n";
    $body .= "────────────────────────────\n";
    $body .= "▼ コメントの内容 ▼\n";
    $body .= "────────────────────────────\n\n";
    $body .= "【送信日時】\n  ".$date."\n";
    $body .= "【ページタイトル】\n  ".$post_title."\n";
    $body .= "【送信者】\n  ".$author."\n";
    $body .= "【メールアドレス】\n  ".$email."\n";
    $body .= "【コメント】\n".$comment."\n";
    $body .= "\n─── 送信者の情報 ─────────────────\n\n";
    $body .= "【送信者のIPアドレス】\n  ".$host_addr."\n";
    $body .= "【送信者のホスト名】\n  ".$host_name."\n";
    $body .= "【送信者のUSER AGENT】\n".$host_agent."\n";
    // 送信
    mb_language('ja');
    $result = mb_send_mail( $to , $title , $body , $header );
    if ( $result ) {
        // THANKSメッセージ
        $message_1 = 'コメントありがとうございます';
        $message_2 = '<a href="'.$_SERVER['HTTP_REFERER'].'" >元のページに戻る</a>';
    }
    else {
        // エラーメッセージ
        $message_1 = 'エラー';
        $message_2 = 'システム障害のためコメント受付が行われませんでした。<br />元のページに戻り、再度「送信」ボタンを押して下さい。';
    }
    // メッセージを表示
    get_header();
    echo '<div id="primary" class="site-content">'."\n";
    echo '  <div id="content" role="main">'."\n";
    echo '    <article>'."\n";
    echo '      <header class="entry-header">'."\n";
    echo '        <h1 class="entry-title">'.$message_1.'</h1>'."\n";
    echo '      </header>'."\n";
    echo '      <div class="entry-content">'."\n";
    echo '        <p>'.$message_2.'</p>'."\n";
    echo '      </div><!-- .entry-content -->'."\n";
    echo '    </article>'."\n";
    echo '  </div><!-- #content -->'."\n";
    echo '</div><!-- #primary -->'."\n";
    get_sidebar();
    get_footer();
    exit;
}
add_action( 'pre_comment_on_post', 'hk_functions_comment_bypass' );

 このプログラムをお使いになる場合は、お使いになる方の自己責任でお願いします。

関連

更新日:2016/03/23
掲載日:2014/05/05