WordPress
Email checker for WordPress. Verify emails in contact forms, WooCommerce, and user registration.
WordPress サイトに EmailVerify を統合して、フォーム送信、ユーザー登録、コメントでメールアドレスを検証しましょう。
連携方法
| 方法 | 最適な用途 | 複雑さ |
|---|---|---|
| プラグイン | 一般的なフォーム | 低 |
| カスタムコード | 高度な連携 | 中 |
| Zapier | ノーコード自動化 | 低 |
方法 1:プラグイン連携
一般的なフォームプラグインとの連携
Contact Form 7
Contact Form 7 に検証を追加:
// functions.php に追加
add_filter('wpcf7_validate_email*', 'emailverify_validate_email', 20, 2);
function emailverify_validate_email($result, $tag) {
$email = isset($_POST[$tag->name]) ? trim($_POST[$tag->name]) : '';
if ($email) {
$verification = emailverify_check_email($email);
if ($verification['status'] === 'invalid') {
$result->invalidate($tag, '有効なメールアドレスを入力してください。');
}
if ($verification['result']['disposable']) {
$result->invalidate($tag, '一時的なメールアドレスは使用できません。');
}
}
return $result;
}Gravity Forms
Gravity Forms への連携:
add_filter('gform_field_validation', 'emailverify_gf_validation', 10, 4);
function emailverify_gf_validation($result, $value, $form, $field) {
if ($field->type === 'email' && $result['is_valid']) {
$email = is_array($value) ? $value[0] : $value;
$verification = emailverify_check_email($email);
if ($verification['status'] === 'invalid') {
$result['is_valid'] = false;
$result['message'] = '有効なメールアドレスを入力してください。';
}
if ($verification['result']['disposable']) {
$result['is_valid'] = false;
$result['message'] = '一時的なメールアドレスは使用できません。';
}
}
return $result;
}WPForms
WPForms への連携:
add_filter('wpforms_process_validate_email', 'emailverify_wpforms_validation', 10, 3);
function emailverify_wpforms_validation($field_id, $field_submit, $form_data) {
$email = $field_submit['value'];
$verification = emailverify_check_email($email);
if ($verification['status'] === 'invalid') {
wpforms()->process->errors[$form_data['id']][$field_id] = '有効なメールアドレスを入力してください。';
}
if ($verification['result']['disposable']) {
wpforms()->process->errors[$form_data['id']][$field_id] = '一時的なメールアドレスは使用できません。';
}
}方法 2:カスタム API 連携
ヘルパー関数の作成
// functions.php に追加
define('EMAILVERIFY_API_KEY', 'YOUR_API_KEY');
function emailverify_check_email($email) {
// キャッシュをチェック
$cache_key = 'bv_' . md5($email);
$cached = get_transient($cache_key);
if ($cached !== false) {
return $cached;
}
// API 呼び出し
$response = wp_remote_post('https://api.emailverify.ai/v1/verify', [
'headers' => [
'Authorization' => 'Bearer ' . EMAILVERIFY_API_KEY,
'Content-Type' => 'application/json',
],
'body' => json_encode(['email' => $email]),
'timeout' => 10,
]);
if (is_wp_error($response)) {
return [
'status' => 'error',
'error' => $response->get_error_message(),
];
}
$body = json_decode(wp_remote_retrieve_body($response), true);
// 結果をキャッシュ(24 時間)
set_transient($cache_key, $body, DAY_IN_SECONDS);
return $body;
}ユーザー登録での検証
add_filter('registration_errors', 'emailverify_registration_check', 10, 3);
function emailverify_registration_check($errors, $sanitized_user_login, $user_email) {
$verification = emailverify_check_email($user_email);
if ($verification['status'] === 'invalid') {
$errors->add('invalid_email', '<strong>エラー</strong>: 有効なメールアドレスを入力してください。');
}
if (isset($verification['result']['disposable']) && $verification['result']['disposable']) {
$errors->add('disposable_email', '<strong>エラー</strong>: 一時的なメールアドレスでは登録できません。');
}
return $errors;
}コメント送信での検証
add_filter('preprocess_comment', 'emailverify_comment_check');
function emailverify_comment_check($commentdata) {
$email = $commentdata['comment_author_email'];
if (!empty($email)) {
$verification = emailverify_check_email($email);
if ($verification['status'] === 'invalid' ||
(isset($verification['result']['disposable']) && $verification['result']['disposable'])) {
wp_die('有効なメールアドレスでコメントを送信してください。');
}
}
return $commentdata;
}方法 3:AJAX リアルタイム検証
JavaScript(フロントエンド)
// assets/js/email-verify.js
jQuery(document).ready(function($) {
let verifyTimeout;
const emailInputs = $('input[type="email"]');
emailInputs.on('blur', function() {
const $input = $(this);
const email = $input.val();
if (!email || !isValidEmailFormat(email)) {
return;
}
clearTimeout(verifyTimeout);
verifyTimeout = setTimeout(function() {
verifyEmail($input, email);
}, 500);
});
function verifyEmail($input, email) {
const $status = getStatusElement($input);
$status.html('<span class="bv-loading">確認中...</span>');
$.ajax({
url: bvAjax.ajaxUrl,
type: 'POST',
data: {
action: 'emailverify_check',
email: email,
nonce: bvAjax.nonce,
},
success: function(response) {
if (response.success) {
if (response.data.valid) {
$status.html('<span class="bv-valid">✓ メール確認済み</span>');
$input.removeClass('bv-invalid').addClass('bv-valid');
} else {
$status.html('<span class="bv-invalid">✗ ' + response.data.message + '</span>');
$input.removeClass('bv-valid').addClass('bv-invalid');
}
}
},
error: function() {
$status.html('');
}
});
}
function getStatusElement($input) {
let $status = $input.next('.bv-status');
if (!$status.length) {
$status = $('<div class="bv-status"></div>');
$input.after($status);
}
return $status;
}
function isValidEmailFormat(email) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}
});PHP(AJAX ハンドラー)
// functions.php に追加
// スクリプトをエンキュー
add_action('wp_enqueue_scripts', 'emailverify_enqueue_scripts');
function emailverify_enqueue_scripts() {
wp_enqueue_script(
'emailverify-js',
get_template_directory_uri() . '/assets/js/email-verify.js',
['jquery'],
'1.0.0',
true
);
wp_localize_script('emailverify-js', 'bvAjax', [
'ajaxUrl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('emailverify_nonce'),
]);
}
// AJAX ハンドラー
add_action('wp_ajax_emailverify_check', 'emailverify_ajax_check');
add_action('wp_ajax_nopriv_emailverify_check', 'emailverify_ajax_check');
function emailverify_ajax_check() {
check_ajax_referer('emailverify_nonce', 'nonce');
$email = sanitize_email($_POST['email']);
if (!is_email($email)) {
wp_send_json_error(['message' => '無効なメール形式です']);
}
$verification = emailverify_check_email($email);
if ($verification['status'] === 'invalid') {
wp_send_json_success([
'valid' => false,
'message' => '有効なメールアドレスを入力してください',
]);
}
if (isset($verification['result']['disposable']) && $verification['result']['disposable']) {
wp_send_json_success([
'valid' => false,
'message' => '一時的なメールアドレスは使用できません',
]);
}
wp_send_json_success(['valid' => true]);
}CSS スタイル
/* assets/css/email-verify.css */
.bv-status {
margin-top: 5px;
font-size: 14px;
}
.bv-loading {
color: #666;
}
.bv-valid {
color: #28a745;
}
.bv-invalid {
color: #dc3545;
}
input.bv-valid {
border-color: #28a745 !important;
}
input.bv-invalid {
border-color: #dc3545 !important;
}WooCommerce 連携
チェックアウトでの検証
add_action('woocommerce_checkout_process', 'emailverify_checkout_validation');
function emailverify_checkout_validation() {
$email = $_POST['billing_email'];
$verification = emailverify_check_email($email);
if ($verification['status'] === 'invalid') {
wc_add_notice('有効なメールアドレスを入力してください。', 'error');
}
if (isset($verification['result']['disposable']) && $verification['result']['disposable']) {
wc_add_notice('一時的なメールアドレスは使用できません。恒久的なメールアドレスを使用してください。', 'error');
}
}注文メタデータに検証結果を保存
add_action('woocommerce_checkout_order_processed', 'emailverify_save_verification', 10, 1);
function emailverify_save_verification($order_id) {
$order = wc_get_order($order_id);
$email = $order->get_billing_email();
$verification = emailverify_check_email($email);
update_post_meta($order_id, '_email_verification_status', $verification['status']);
update_post_meta($order_id, '_email_verification_score', $verification['score'] ?? '');
}ベストプラクティス
1. API エラーを適切に処理
function emailverify_check_email($email) {
// ... API 呼び出し ...
if (is_wp_error($response)) {
// API エラー時は許可(重要なフォーム送信をブロックしない)
error_log('EmailVerify API error: ' . $response->get_error_message());
return [
'status' => 'unknown',
'result' => ['disposable' => false],
];
}
// ...
}2. レスポンスをキャッシュ
// Transients API を使用してキャッシュ
$cache_key = 'bv_' . md5($email);
set_transient($cache_key, $result, DAY_IN_SECONDS);3. API キーを安全に保管
// wp-config.php で定義
define('EMAILVERIFY_API_KEY', 'YOUR_API_KEY');
// または環境変数を使用
define('EMAILVERIFY_API_KEY', getenv('EMAILVERIFY_API_KEY'));4. ユーザーに適切なフィードバックを提供
// 無効なメールの場合
'有効なメールアドレスを入力してください。'
// 使い捨てメールの場合
'一時的なメールアドレスでは登録できません。恒久的なメールアドレスを使用してください。'
// 不明なステータスの場合
'メールを確認できませんでした。入力内容をご確認ください。'