EmailVerify LogoEmailVerify

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');

関連リソース

On this page