2026年9月16日

2026年9月16日

MC4WP(Mailchimp for WordPress)のエラーを解決する方法

はじめに

MC4WP(Mailchimp for WordPress)でフォームを送信してもMailchimpにメールアドレスが登録されない・「サブスクリプション追加に失敗しました」エラーが出る・ダブルオプトインの確認メールが届かない・既存会員がフォームを再送信するとエラーになるといった問題は、APIキーの設定・リストID・Mailchimpのコンプライアンス設定が原因です。

症状・原因

  • フォームから登録しても「登録完了」と表示されるがMailchimpにデータがない
  • APIキーは正しいのに「APIキーが無効」エラーが出る
  • ダブルオプトイン確認メールがスパムフォルダに入るかまったく届かない
  • 海外IPからの登録が自動的に拒否される

解決手順

ステップ1:MC4WPの状態を確認する

# MC4WPのバージョンとAPIキーを確認
wp eval "
if (function_exists('mc4wp')) {
    echo 'MC4WP version: ' . MC4WP_VERSION . PHP_EOL;
}

// API接続テスト
\$api = mc4wp_get_api_v3();
try {
    \$lists = \$api->get_lists(['count' => 5]);
    echo 'Mailchimp lists:' . PHP_EOL;
    foreach (\$lists->lists as \$list) {
        printf('  ID: %s | Name: %s | Members: %d' . PHP_EOL,
            \$list->id,
            \$list->name,
            \$list->stats->member_count
        );
    }
} catch (Exception \$e) {
    echo 'API error: ' . \$e->getMessage() . PHP_EOL;
}
"

# 登録ログを確認
wp eval "
global \$wpdb;
\$logs = \$wpdb->get_results(
    \"SELECT * FROM {\$wpdb->prefix}mc4wp_log ORDER BY created_at DESC LIMIT 10\"
);
foreach (\$logs as \$log) {
    printf('%s | %s | %s' . PHP_EOL,
        \$log->created_at,
        \$log->email_address,
        \$log->message
    );
}
"

ステップ2:APIとリスト設定を修正する

// functions.php: MC4WPのAPI設定カスタマイズ

// ① 購読者を手動でMailchimpに追加
function mc4wp_subscribe_email(string $email, string $list_id, array $merge_fields = []): bool {
    if (!function_exists('mc4wp_get_api_v3')) return false;

    $api = mc4wp_get_api_v3();

    try {
        $api->add_list_member($list_id, [
            'email_address' => $email,
            'status'        => 'subscribed', // 'pending' でダブルオプトイン
            'merge_fields'  => $merge_fields,
        ]);
        return true;
    } catch (\Exception $e) {
        error_log('[MC4WP] Subscribe failed: ' . $e->getMessage());
        return false;
    }
}

// ② WooCommerce注文完了時に自動登録
add_action('woocommerce_order_status_completed', function(int $order_id): void {
    $order = wc_get_order($order_id);
    if (!$order) return;

    $email     = $order->get_billing_email();
    $first     = $order->get_billing_first_name();
    $last      = $order->get_billing_last_name();
    $list_id   = get_option('mc4wp_woocommerce_list_id', '');

    if (!$email || !$list_id) return;

    // 購読確認チェックボックスが選択されていた場合のみ登録
    $opted_in = get_post_meta($order_id, '_mc4wp_opted_in', true);
    if (!$opted_in) return;

    mc4wp_subscribe_email($email, $list_id, [
        'FNAME' => $first,
        'LNAME' => $last,
    ]);
}, 20);

// ③ フォームデータに追加フィールドをマージ
add_filter('mc4wp_merge_vars', function(array $merge_vars, object $form, array $data): array {
    // 登録元URLをカスタムフィールドとして送信
    $merge_vars['SOURCE'] = wp_get_referer() ?: get_permalink();
    // 登録日時
    $merge_vars['SIGNUP'] = current_time('Y-m-d');
    return $merge_vars;
}, 10, 3);

ステップ3:フォームとメッセージをカスタマイズする

// functions.php: MC4WPフォーム設定

// ① フォームのエラーメッセージをカスタマイズ
add_filter('mc4wp_form_messages', function(array $messages, object $form): array {
    $messages['subscribed'] = [
        'text'  => 'メールアドレスを登録しました。確認メールをご確認ください。',
        'type'  => 'notice',
    ];
    $messages['already_subscribed'] = [
        'text'  => 'このメールアドレスはすでに登録済みです。',
        'type'  => 'notice',
    ];
    $messages['error'] = [
        'text'  => '登録中にエラーが発生しました。しばらくしてから再試行してください。',
        'type'  => 'error',
    ];
    $messages['invalid_email'] = [
        'text'  => '有効なメールアドレスを入力してください。',
        'type'  => 'error',
    ];
    return $messages;
}, 10, 2);

// ② フォーム送信前にバリデーション
add_filter('mc4wp_form_data', function(array $data, object $form): array {
    // メールアドレスのドメインチェック
    $blocked_domains = ['example.com', 'test.com', 'spam.net'];
    $domain          = substr(strrchr($data['EMAIL'] ?? '', '@'), 1);

    if (in_array(strtolower($domain), $blocked_domains)) {
        // フォームエラーを発生させる
        throw new \Exception('このメールドメインは登録できません。');
    }

    return $data;
}, 10, 2);

// ③ 登録完了後のリダイレクト
add_action('mc4wp_form_subscribed', function(object $form): void {
    $thank_you_page = get_page_by_path('newsletter-thanks');
    if ($thank_you_page) {
        wp_redirect(get_permalink($thank_you_page->ID));
        exit;
    }
});

ステップ4:Webhookとオートメーションを設定する

// functions.php: MC4WP Webhook設定

// ① Mailchimp WebhookでWordPressユーザーを同期
add_action('mc4wp_webhook_unsubscribe', function(array $data): void {
    $email = $data['email'] ?? '';
    if (!$email) return;

    // WordPressユーザーのメタ情報を更新
    $user = get_user_by('email', $email);
    if ($user) {
        update_user_meta($user->ID, 'mailchimp_subscribed', '0');
        update_user_meta($user->ID, 'mailchimp_unsubscribed_at', current_time('mysql'));
        error_log('[MC4WP] User unsubscribed from Mailchimp: ' . $email);
    }
});

// ② 購読者情報が更新されたときの処理
add_action('mc4wp_webhook_upemail', function(array $data): void {
    $old_email = $data['old_email'] ?? '';
    $new_email = $data['new_email'] ?? '';

    if ($old_email && $new_email) {
        $user = get_user_by('email', $old_email);
        if ($user) {
            wp_update_user(['ID' => $user->ID, 'user_email' => $new_email]);
            error_log('[MC4WP] Email updated: ' . $old_email . ' → ' . $new_email);
        }
    }
});

ステップ5:デバッグとログ確認

# Mailchimp APIの接続テスト
wp eval "
\$api_key = get_option('mc4wp_api_key', '');
if (empty(\$api_key)) {
    echo 'API key not set' . PHP_EOL;
} else {
    // APIキーのデータセンターを確認
    preg_match('/-([a-z0-9]+)$/', \$api_key, \$matches);
    echo 'API key datacenter: ' . (\$matches[1] ?? 'unknown') . PHP_EOL;
    echo 'API endpoint: https://' . (\$matches[1] ?? 'us1') . '.api.mailchimp.com/3.0/' . PHP_EOL;
}
"

# フォームの登録エラーを詳細確認
wp eval "
add_filter('mc4wp_debug', '__return_true');
echo 'Debug mode enabled - check error log for details' . PHP_EOL;
"
// functions.php: MC4WPデバッグ

// ① 登録エラーの詳細をログに記録
add_action('mc4wp_form_error', function(string $error, object $form): void {
    error_log(sprintf('[MC4WP] Form error: %s | Form ID: %d | URL: %s',
        $error,
        $form->ID,
        $_SERVER['REQUEST_URI'] ?? ''
    ));
}, 10, 2);

注意事項

  • Mailchimp APIキーは「アカウント → API Keys」から取得します。末尾の-us21などのデータセンターサフィックスが重要で、これが一致しないとAPIリクエストが失敗します
  • ダブルオプトインが有効な場合、購読者はメール内のリンクをクリックするまでpendingステータスになります。pendingのアドレスは登録リストには表示されますが、メール配信の対象外です
  • GDPRコンプライアンス対応が必要な場合はmc4wp_form_dataフィルターで同意チェックボックスの確認を追加し、merge_varsフィルターで同意日時をMailchimpのカスタムフィールドに送信することを推奨します

まとめ

MC4WP修復は①mc4wp_get_api_v3()->get_lists()でAPI接続確認・wp_mc4wp_logテーブルで登録ログ診断、②mc4wp_get_api_v3()->add_list_member()で手動登録・woocommerce_order_status_completedフックでWooCommerce連携、③mc4wp_form_messagesフィルターでエラーメッセージを日本語化・mc4wp_form_dataフィルターでバリデーション追加、④mc4wp_webhook_unsubscribeフックでMailchimpの配信停止をWordPressユーザーメタに同期、⑤mc4wp_form_errorフックで登録エラーを詳細ログに記録する手順で解決します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲