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フックで登録エラーを詳細ログに記録する手順で解決します。