WooCommerce
Email checker for WooCommerce. Verify emails at checkout and in WordPress forms.
WooCommerce ストアに EmailVerify を統合し、チェックアウト時やユーザー登録時にメールを検証しましょう。
連携方法
| 方法 | 最適な用途 | 複雑さ |
|---|---|---|
| プラグイン | クイックセットアップ | 低 |
| カスタムコード | 完全な制御 | 中 |
| Zapier | ノーコード自動化 | 低 |
方法 1:カスタムプラグイン
カスタム WooCommerce プラグインを作成して完全な制御を実現:
プラグイン構造
wp-content/plugins/emailverify-woocommerce/
├── emailverify-woocommerce.php
├── includes/
│ ├── class-bv-email-verifier.php
│ └── class-bv-checkout-handler.php
└── assets/
├── js/
│ └── checkout-verify.js
└── css/
└── checkout-verify.cssメインプラグインファイル
<?php
/**
* Plugin Name: EmailVerify for WooCommerce
* Description: WooCommerce チェックアウトでメール検証を行います
* Version: 1.0.0
*/
defined('ABSPATH') || exit;
class EmailVerify_WooCommerce {
private static $instance = null;
private $verifier;
public static function instance() {
if (is_null(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
public function __construct() {
$this->includes();
$this->init_hooks();
}
private function includes() {
require_once plugin_dir_path(__FILE__) . 'includes/class-bv-email-verifier.php';
require_once plugin_dir_path(__FILE__) . 'includes/class-bv-checkout-handler.php';
}
private function init_hooks() {
add_action('woocommerce_checkout_process', [$this, 'validate_checkout_email']);
add_action('woocommerce_checkout_order_processed', [$this, 'save_verification_result'], 10, 3);
add_action('wp_enqueue_scripts', [$this, 'enqueue_scripts']);
// AJAX ハンドラー
add_action('wp_ajax_bv_verify_email', [$this, 'ajax_verify_email']);
add_action('wp_ajax_nopriv_bv_verify_email', [$this, 'ajax_verify_email']);
}
public function validate_checkout_email() {
$email = sanitize_email($_POST['billing_email']);
if (empty($email)) {
return;
}
$verifier = new BV_Email_Verifier();
$result = $verifier->verify($email);
if ($result['status'] === 'invalid') {
wc_add_notice(
__('有効なメールアドレスを入力してください。', 'emailverify-woo'),
'error'
);
}
if (!empty($result['result']['disposable'])) {
wc_add_notice(
__('一時的なメールアドレスは使用できません。恒久的なメールアドレスを使用してください。', 'emailverify-woo'),
'error'
);
}
}
public function save_verification_result($order_id, $posted_data, $order) {
$email = $order->get_billing_email();
$verifier = new BV_Email_Verifier();
$result = $verifier->verify($email);
update_post_meta($order_id, '_bv_email_status', $result['status']);
update_post_meta($order_id, '_bv_email_score', $result['score'] ?? '');
update_post_meta($order_id, '_bv_email_disposable', $result['result']['disposable'] ?? false);
}
public function enqueue_scripts() {
if (is_checkout()) {
wp_enqueue_script(
'bv-checkout-verify',
plugin_dir_url(__FILE__) . 'assets/js/checkout-verify.js',
['jquery'],
'1.0.0',
true
);
wp_localize_script('bv-checkout-verify', 'bvCheckout', [
'ajaxUrl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('bv_verify_nonce'),
]);
wp_enqueue_style(
'bv-checkout-verify',
plugin_dir_url(__FILE__) . 'assets/css/checkout-verify.css',
[],
'1.0.0'
);
}
}
public function ajax_verify_email() {
check_ajax_referer('bv_verify_nonce', 'nonce');
$email = sanitize_email($_POST['email']);
if (!is_email($email)) {
wp_send_json_error(['message' => __('無効なメール形式です', 'emailverify-woo')]);
}
$verifier = new BV_Email_Verifier();
$result = $verifier->verify($email);
$valid = $result['status'] === 'valid' && empty($result['result']['disposable']);
wp_send_json_success([
'valid' => $valid,
'status' => $result['status'],
'message' => $valid ? '' : __('有効なメールアドレスを入力してください', 'emailverify-woo'),
]);
}
}
function BV_WooCommerce() {
return EmailVerify_WooCommerce::instance();
}
add_action('plugins_loaded', 'BV_WooCommerce');メール検証クラス
<?php
// includes/class-bv-email-verifier.php
class BV_Email_Verifier {
private $api_key;
private $api_url = 'https://api.emailverify.ai/v1/verify';
public function __construct() {
$this->api_key = defined('EMAILVERIFY_API_KEY')
? EMAILVERIFY_API_KEY
: get_option('emailverify_api_key');
}
public function verify($email) {
// キャッシュをチェック
$cache_key = 'bv_' . md5($email);
$cached = get_transient($cache_key);
if ($cached !== false) {
return $cached;
}
// API 呼び出し
$response = wp_remote_post($this->api_url, [
'headers' => [
'Authorization' => 'Bearer ' . $this->api_key,
'Content-Type' => 'application/json',
],
'body' => json_encode(['email' => $email]),
'timeout' => 10,
]);
if (is_wp_error($response)) {
// API エラー時は許可
return [
'status' => 'unknown',
'result' => ['disposable' => false],
];
}
$body = json_decode(wp_remote_retrieve_body($response), true);
// 結果をキャッシュ(24 時間)
set_transient($cache_key, $body, DAY_IN_SECONDS);
return $body;
}
}チェックアウト JavaScript
// assets/js/checkout-verify.js
jQuery(function($) {
let verifyTimeout;
let lastVerifiedEmail = '';
const $emailField = $('#billing_email');
const $statusEl = $('<span class="bv-email-status"></span>');
$emailField.after($statusEl);
$emailField.on('blur change', function() {
const email = $(this).val();
if (!email || email === lastVerifiedEmail) {
return;
}
if (!isValidFormat(email)) {
$statusEl.html('').removeClass('valid invalid checking');
return;
}
clearTimeout(verifyTimeout);
verifyTimeout = setTimeout(function() {
verifyEmail(email);
}, 500);
});
function verifyEmail(email) {
$statusEl
.html('<span class="bv-spinner"></span> 確認中...')
.removeClass('valid invalid')
.addClass('checking');
$.ajax({
url: bvCheckout.ajaxUrl,
type: 'POST',
data: {
action: 'bv_verify_email',
email: email,
nonce: bvCheckout.nonce,
},
success: function(response) {
$statusEl.removeClass('checking');
lastVerifiedEmail = email;
if (response.success) {
if (response.data.valid) {
$statusEl
.html('✓ メール確認済み')
.addClass('valid')
.removeClass('invalid');
} else {
$statusEl
.html('✗ ' + response.data.message)
.addClass('invalid')
.removeClass('valid');
}
}
},
error: function() {
$statusEl.html('').removeClass('checking valid invalid');
}
});
}
function isValidFormat(email) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}
});CSS スタイル
/* assets/css/checkout-verify.css */
.bv-email-status {
display: block;
margin-top: 5px;
font-size: 14px;
}
.bv-email-status.checking {
color: #666;
}
.bv-email-status.valid {
color: #28a745;
}
.bv-email-status.invalid {
color: #dc3545;
}
.bv-spinner {
display: inline-block;
width: 14px;
height: 14px;
border: 2px solid #ccc;
border-top-color: #666;
border-radius: 50%;
animation: bv-spin 1s linear infinite;
}
@keyframes bv-spin {
to { transform: rotate(360deg); }
}方法 2:functions.php での実装
シンプルな連携の場合、テーマの functions.php に直接追加:
// 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;
}
$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' => 'unknown', 'result' => ['disposable' => false]];
}
$body = json_decode(wp_remote_retrieve_body($response), true);
set_transient($cache_key, $body, DAY_IN_SECONDS);
return $body;
}
// チェックアウト検証
add_action('woocommerce_checkout_process', 'emailverify_validate_checkout');
function emailverify_validate_checkout() {
$email = sanitize_email($_POST['billing_email']);
$result = emailverify_check_email($email);
if ($result['status'] === 'invalid') {
wc_add_notice('有効なメールアドレスを入力してください。', 'error');
}
if (!empty($result['result']['disposable'])) {
wc_add_notice('一時的なメールアドレスは使用できません。', 'error');
}
}
// 検証結果を注文に保存
add_action('woocommerce_checkout_order_processed', 'emailverify_save_to_order', 10, 1);
function emailverify_save_to_order($order_id) {
$order = wc_get_order($order_id);
$email = $order->get_billing_email();
$result = emailverify_check_email($email);
update_post_meta($order_id, '_email_verification_status', $result['status']);
update_post_meta($order_id, '_email_verification_score', $result['score'] ?? '');
}管理画面での表示
注文詳細ページに検証結果を表示:
// 注文詳細に検証情報を追加
add_action('woocommerce_admin_order_data_after_billing_address', 'emailverify_show_order_status');
function emailverify_show_order_status($order) {
$status = get_post_meta($order->get_id(), '_email_verification_status', true);
$score = get_post_meta($order->get_id(), '_email_verification_score', true);
if ($status) {
echo '<p><strong>メール検証:</strong> ';
echo '<span style="color: ' . ($status === 'valid' ? 'green' : 'red') . ';">';
echo esc_html(ucfirst($status));
if ($score) {
echo ' (スコア: ' . esc_html($score) . ')';
}
echo '</span></p>';
}
}ベストプラクティス
1. API エラー時はチェックアウトをブロックしない
if (is_wp_error($response)) {
// エラーをログに記録して続行を許可
error_log('EmailVerify API error: ' . $response->get_error_message());
return ['status' => 'unknown', 'result' => ['disposable' => false]];
}2. 結果をキャッシュ
// WordPress Transients API を使用
set_transient($cache_key, $body, DAY_IN_SECONDS);3. 明確なフィードバックを提供
// 無効なメール
wc_add_notice('有効なメールアドレスを入力してください。', 'error');
// 使い捨てメール
wc_add_notice('一時的なメールアドレスは使用できません。恒久的なメールアドレスを使用してください。', 'error');