メインコンテンツまで移動する

WordPress に reCAPTCHA v2 をプラグインを使わず導入する方法

  • 公開日
  • 更新日

Akira Web クリエイター

はじめに

サイトを運営していて困るのが、スパムコメント。サイト運営者にとってもサイト訪問者にとっても迷惑な存在です。

そこで導入したいのが reCAPTCHA 。

Google が導入を推奨する reCAPTCHA は、スパムコメントやスパムメールからサイトを強力に守ってくれます。

WordPress で運営する当サイトに reCAPTCHA v2 を導入した際の方法を記事に残しておきます。

もし、reCAPTCHA v3 を WordPress に実装する場合は、WordPress に reCAPTCHA v3 をプラグインを使わず実装 をご覧ください。

登録

reCAPTCHA を使うには、reCAPTCHA への登録が必要です。

Google アカウントにログインした状態で、reCAPTCHA の公式サイトより登録します。

今回登録するのは reCAPTCHA v2 です。

発行されるキーの管理名となる Label は、サイト名などご自身が管理しやすい名前にします。

Domains は、サイトドメインを入力します。複数のサイトを登録する場合は、1 行毎に 1 つのドメインを入力します。

登録後は「Site key」と「Secret key」が発行されます。この 2 つの鍵は、サイトに reCAPTCHA を導入する際に必要です。

読み込み

「Site key」と「Secret key」を入手した後は、サイトに reCAPTCHA を設置していきます。

まずは、以下の reCAPTCHA の <script> タグを <head> タグ内に追加します。

<script src="https://www.google.com/recaptcha/api.js" async></script>

WordPress の場合は、wp_enqueue_script() を使えば <script> を追加できます。テーマの functions.php に下記コードを追加します。

/** reCAPTCHA スクリプトの読み込み */
add_action( 'wp_enqueue_scripts', function() {
  wp_enqueue_script( 'google-recaptcha', 'https://www.google.com/recaptcha/api.js', array(), false, false );
});

/** reCAPTCHA スクリプトに async と defer を追加し非同期で読み込み */
add_filter( 'script_loader_tag', function( $tag, $handle, $src ) {
  if ( 'google-recaptcha' === $handle ) {
    $tag = '<script src="' . esc_url( $src ) . '" async></script>';
  }

  return $tag;
}, 10, 3 );

Contact Form 7 の reCAPTCHA 機能を使う場合

Contact Form 7 でお問い合わせページを作成しているサイトは多いと思います。

Contact Form 7 には reCAPTCHA 機能が備わっているため、今回はお問い合わせページの reCAPTCHA は Contact Form 7 に任せます。

ただ、Contact Form 7 の reCAPTCHA 機能を使う場合は、Contact Form 7 もお問い合わせページに reCAPTCHA の <script> タグを追加します。

全てのページの <head> タグ内に reCAPTCHA の <script> タグを追加した場合、お問い合わせページで reCAPTCHA の <script> タグが 2 つになってしまいエラーが出ます。

そのため、投稿ページのみに <script> タグを追加するのがいいかもしれません。

<?php if ( is_single() ) { ?>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<?php } ?>

wp_enqueue_script() を使う場合は、下記のコードです。

/** reCAPTCHA スクリプトの読み込み */
add_action( 'wp_enqueue_scripts', function() {
  if ( is_single() ) {
    wp_enqueue_script( 'google-recaptcha', 'https://www.google.com/recaptcha/api.js', array(), false, false );
  }
});

/** reCAPTCHA スクリプトに async と defer を追加し非同期で読み込み */
add_filter( 'script_loader_tag', function( $tag, $handle, $src ) {
  if ( 'google-recaptcha' === $handle ) {
    $tag = '<script src="' . esc_url( $src ) . '" async defer></script>';
  }

  return $tag;
}, 10, 3 );

これでお問い合わせページでのエラーを回避できます。

設置

次にコメントフォームに reCAPTCHA を設置します。

設置方法は 2 種類あります。

functions.php で設置

簡単なのは functions.php を使っての設置です。コメントフォームのテンプレートを変更したくない方に適した方法です。

下記のコードをテーマの functions.php に追加します。

add_filter( 'comment_form_default_fields', function( $fields ) {
  $fields['recaptcha'] = '<div class="g-recaptcha" data-sitekey="ここにSite keyを入力"></div>';

  return $fields;
});

2 行目の ここにSite keyを入力 に、発行された「Site key」を入力します。

これでコメント送信ボタンの上に、reCAPTCHA が設置されます。

テンプレートに設置

もう 1 つの設置方法が、コメントフォームを呼び出しているテンプレートに直接設置するもの。

すでにコメントフォームのテンプレートを変更されている方に適した方法です。

ほとんどのテーマは、comments.php でコメントフォームを呼び出しているはずです。例えば、下記のようにコメントフォームを変更します。

$commenter = wp_get_current_commenter();
$req       = get_option( 'require_name_email' );
$aria_req  = ( $req ? " aria-required='true'" : '' );
$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>',
  'recaptcha' => '<div class="g-recaptcha" data-sitekey="ここにSite keyを入力"></div>',
);

$args = array(
  'fields' => apply_filters( 'comment_form_default_fields', $fields ),
);

comment_form( $args );

11 行目の ここにSite keyを入力 に発行された「Site key」を入力します。

コメントフォーム変更の詳細は、comment_form() をご参考ください。

認証

あとは reCAPTCHA の認証を動かせば終わりです。

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

add_action( 'pre_comment_on_post', function( $parameter = true ) {
  if ( isset( $_POST['g-recaptcha-response'] ) ) {
    $response = json_decode( wp_remote_retrieve_body( wp_remote_get( 'https://www.google.com/recaptcha/api/siteverify?secret=ここにSecret keyを入力&response=' . $_POST['g-recaptcha-response'] ) ), true );
    if ( $response['success'] ) {
      return $parameter;
    } else {
      wp_die( '<h1>認証に失敗しました</h1><p>「私はロボットではありません」にチェックを入れてください。</p>', '', array( 'back_link' => true ) );
    }
  } elseif ( ! isset( $_POST['g-recaptcha-response'] ) && ! is_user_logged_in() ) {
    wp_die( '<h1>ロボットと判定されました</h1><p>あなたがロボットでなければ、ブラウザの JavaScript を有効にしてください。</p>', '', array( 'response' => 403, 'back_link' => true ) );
  }
});

3 行目の ここにSecret keyを入力 に、発行された「Secret key」を入力します。

コードは Using Googles NoCaptcha ReCaptcha In WordPress を参考にしており、2 つの処理を追加しています。

reCAPTCHA のチェックが入っていない時には、「認証に失敗しました「私はロボットではありません」にチェックを入れてください。」と記載したエラーページに移動します。

「戻る」をクリックすると元のコメントフォームに戻る上に、フォームに入力した内容は消えずに維持されます。

また、ブラウザの JavaScript が無効になっており、reCAPTCHA が表示されていない状態でコメントを送信すると「ロボットと判定されました あなたがロボットでなければ、ブラウザの JavaScript を有効にしてください。」とのエラーページに移動します。

ただし、ログインユーザーは、エラーページに移動しません。

これでコメントフォームに reCAPTCHA を設置するカスタマイズは終了です。

ログイン画面にも設置

コードを参考にした Using Googles NoCaptcha ReCaptcha In WordPress に記載のとおり、WordPress のログインページにも自前で reCAPTCHA を設置できます。

一部正常に動作しない箇所があったので、変更しまとめます。

設置するには、下記のコードをテーマの functions.php に追加します。

add_action( 'login_enqueue_scripts', function() {
  wp_enqueue_script( 'recaptcha', 'https://www.google.com/recaptcha/api.js' );
});

add_action( 'login_form', function() {
  echo '<div class="g-recaptcha" data-sitekey="ここにSite keyを入力"></div>';
});

add_action( 'wp_authenticate', function( $parameter = true ) {
  if ( isset( $_POST['g-recaptcha-response'] ) ) {
    $response = json_decode( wp_remote_retrieve_body( wp_remote_get( 'https://www.google.com/recaptcha/api/siteverify?secret=ここにSecret keyを入力&response=' . $_POST['g-recaptcha-response'] ) ), true );
    if ( $response['success'] ) {
      return $parameter;
    } else {
      wp_die( '<h1>認証に失敗しました</h1><p>「私はロボットではありません」にチェックを入れてください。</p>', '', array( 'back_link' => true ) );
    }
  }

  return false;
});

6 行目の ここにSite keyを入力 に「Site key」を、11 行目の ここにSecret keyを入力 に「Secret key」を入力します。

フォローする