2026年8月15日

2026年8月15日

WordPressのお問い合わせフォーム(CF7)をカスタマイズする方法

はじめに

「Contact Form 7のデフォルトデザインをカスタマイズしたい」「フォーム送信後に確認画面を表示したい」「スパムメールを減らしたい」——CF7はWordPressで最も使われているフォームプラグインですが、標準機能だけでは要件を満たせないケースも多くあります。

症状・原因

CF7のデフォルトはシンプルなフォームとメール送信機能のみで、確認画面・スパム対策・入力バリデーション強化・メール通知のカスタマイズなどは追加設定や拡張が必要です。

解決手順

ステップ1:CF7の基本フォームタグとCSSカスタマイズ

<!-- CF7フォームエディタ: カスタムフォームタグ -->
<div class="cf7-form-wrap">
    <div class="cf7-row">
        <label>お名前 <span class="required">*</span></label>
        [text* your-name placeholder "山田 太郎" minlength:2 maxlength:50]
    </div>

    <div class="cf7-row">
        <label>メールアドレス <span class="required">*</span></label>
        [email* your-email placeholder "example@example.com"]
    </div>

    <div class="cf7-row">
        <label>電話番号</label>
        [tel your-tel placeholder "090-1234-5678"]
    </div>

    <div class="cf7-row">
        <label>お問い合わせ種別 <span class="required">*</span></label>
        [select* inquiry-type "製品について" "サポート" "見積もり依頼" "その他"]
    </div>

    <div class="cf7-row">
        <label>メッセージ <span class="required">*</span></label>
        [textarea* your-message placeholder "お問い合わせ内容をご記入ください" minlength:10 maxlength:2000]
    </div>

    <div class="cf7-row">
        [acceptance accept-terms] プライバシーポリシーに同意する [/acceptance]
    </div>

    [submit "送信する"]
</div>
/* CF7フォームのCSSカスタマイズ */
.cf7-form-wrap {
    max-width: 680px;
    margin: 0 auto;
    padding: 2rem;
    background: #fff;
    border-radius: 8px;
    box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}

.cf7-row {
    margin-bottom: 1.5rem;
}

.cf7-row label {
    display: block;
    font-weight: 600;
    margin-bottom: 0.5rem;
    color: #1d2327;
}

.cf7-row .required {
    color: #d63638;
    margin-left: 4px;
}

/* 入力フィールド共通 */
.wpcf7-form input[type="text"],
.wpcf7-form input[type="email"],
.wpcf7-form input[type="tel"],
.wpcf7-form select,
.wpcf7-form textarea {
    width: 100%;
    padding: 10px 14px;
    border: 1px solid #dcdcde;
    border-radius: 4px;
    font-size: 1rem;
    transition: border-color 0.2s;
    box-sizing: border-box;
}

.wpcf7-form input:focus,
.wpcf7-form select:focus,
.wpcf7-form textarea:focus {
    outline: none;
    border-color: #2271b1;
    box-shadow: 0 0 0 2px rgba(34,113,177,0.15);
}

/* バリデーションエラー */
.wpcf7-not-valid {
    border-color: #d63638 !important;
}

.wpcf7-not-valid-tip {
    color: #d63638;
    font-size: 0.85rem;
    margin-top: 4px;
    display: block;
}

/* 送信ボタン */
.wpcf7-form input[type="submit"] {
    background: #2271b1;
    color: #fff;
    border: none;
    padding: 14px 40px;
    font-size: 1rem;
    font-weight: 600;
    border-radius: 4px;
    cursor: pointer;
    transition: background 0.2s;
    width: 100%;
}

.wpcf7-form input[type="submit"]:hover {
    background: #135e96;
}

/* 送信中スピナー */
.wpcf7-spinner {
    display: inline-block;
    margin-left: 10px;
}

ステップ2:メール通知テンプレートをカスタマイズする

【CF7メール設定 — 管理者通知メール】

差出人: [your-name] <wordpress@example.com>
宛先: admin@example.com
件名: 【お問い合わせ】[inquiry-type]: [your-name]様より

本文:
━━━━━━━━━━━━━━━━━━━━━━
お問い合わせを受け付けました
━━━━━━━━━━━━━━━━━━━━━━

■ お名前: [your-name]
■ メールアドレス: [your-email]
■ 電話番号: [your-tel]
■ 種別: [inquiry-type]
■ 送信日時: [_date] [_time]
■ IPアドレス: [_remote_ip]

■ メッセージ:
[your-message]

━━━━━━━━━━━━━━━━━━━━━━
このメールはWordPressサイトから自動送信されています
━━━━━━━━━━━━━━━━━━━━━━

【CF7メール設定 — 自動返信メール(メール(2))】

差出人: サイト名 <noreply@example.com>
宛先: [your-email]
件名: お問い合わせを受け付けました

本文:
[your-name] 様

お問い合わせいただきありがとうございます。
以下の内容でお問い合わせを受け付けました。
通常2〜3営業日以内にご返信いたします。

■ お問い合わせ種別: [inquiry-type]
■ メッセージ: [your-message]

─────────────────────────
会社名 | example.com
─────────────────────────

ステップ3:送信前確認画面をfunctions.phpで追加する

// functions.php: CF7送信前確認ポップアップ
add_filter( 'wpcf7_form_elements', function( $content ) {
    // 確認ボタンのラベルを変更
    $content = str_replace(
        'type="submit"',
        'type="submit" data-confirm="この内容で送信しますか?"',
        $content
    );
    return $content;
} );
// 確認ダイアログを表示するカスタムJS
document.addEventListener('DOMContentLoaded', function() {
    const form = document.querySelector('.wpcf7-form');
    if (!form) return;

    form.addEventListener('submit', function(e) {
        const submitBtn = form.querySelector('input[type="submit"]');
        const message = submitBtn?.dataset.confirm;

        if (message && !window._cf7Confirmed) {
            e.preventDefault();
            e.stopImmediatePropagation();

            if (confirm(message)) {
                window._cf7Confirmed = true;
                // Submitイベントを再発火
                submitBtn.click();
            }
        } else {
            window._cf7Confirmed = false;
        }
    }, true);
});

ステップ4:スパム対策を強化する

// functions.php: CF7にスパム対策を追加

// ハニーポットフィールドでボットを検出
add_filter( 'wpcf7_spam', function( $spam, $submission ) {
    if ( $spam ) return $spam;

    // ハニーポット: 人間には見えない隠しフィールドに値があればスパム
    $honey = isset( $_POST['website_url'] ) ? $_POST['website_url'] : '';
    if ( ! empty( $honey ) ) {
        $submission->set_response( 'スパムとして検出されました。' );
        return true;
    }

    // 送信速度チェック: 3秒以内の送信はボットの可能性
    $posted_at  = isset( $_POST['_wpcf7_posted_at'] ) ? (float) $_POST['_wpcf7_posted_at'] : 0;
    $elapsed    = time() - $posted_at;
    if ( $posted_at > 0 && $elapsed < 3 ) {
        $submission->set_response( '送信が早すぎます。しばらくしてから再試行してください。' );
        return true;
    }

    return $spam;
}, 10, 2 );

// 日本語チェック: メッセージに日本語が含まれていない場合はスパムの可能性
add_filter( 'wpcf7_spam', function( $spam, $submission ) {
    if ( $spam ) return $spam;

    $message = $submission->get_posted_data( 'your-message' );
    if ( $message && ! preg_match( '/[\x{3000}-\x{9FFF}\x{F900}-\x{FAFF}]/u', $message ) ) {
        // 日本語が一文字もなければスパムフラグ(サイトに応じて調整)
        // return true; // 必要に応じてコメントアウトを外す
    }

    return $spam;
}, 10, 2 );
【CF7スパム対策の選択肢】

1. Akismet Anti-spam (推奨)
   CF7と自動連携。API keyをAkismet設定で入力するだけ。

2. reCAPTCHA v3 (Google)
   CF7設定 → インテグレーション → reCAPTCHA
   Site Key / Secret KeyをGoogleから取得して設定

3. Cloudflare Turnstile
   より軽量なreCAPTCHA代替。
   CF7 + Cloudflare Turnstile プラグインで連携

4. ハニーポット(上記のPHPコード)
   見えない入力フィールドでボットを検出する

ステップ5:条件分岐フォームをJavaScriptで実装する

// お問い合わせ種別によってフィールドを切り替える
document.addEventListener('DOMContentLoaded', function() {
    const typeSelect = document.querySelector('[name="inquiry-type"]');
    if (!typeSelect) return;

    // 種別ごとに表示するフィールドを定義
    const conditionalFields = {
        '見積もり依頼': ['budget-field', 'deadline-field', 'company-field'],
        'サポート':     ['product-field', 'version-field'],
    };

    // 全条件フィールドを取得
    const allConditional = Object.values(conditionalFields).flat();

    function updateFields() {
        const selected = typeSelect.value;

        // 全フィールドを非表示
        allConditional.forEach(function(id) {
            const el = document.getElementById(id);
            if (el) {
                el.style.display = 'none';
                // バリデーションを無効化
                el.querySelectorAll('input,select,textarea').forEach(function(input) {
                    input.disabled = true;
                });
            }
        });

        // 選択した種別のフィールドを表示
        const showFields = conditionalFields[selected] || [];
        showFields.forEach(function(id) {
            const el = document.getElementById(id);
            if (el) {
                el.style.display = 'block';
                el.querySelectorAll('input,select,textarea').forEach(function(input) {
                    input.disabled = false;
                });
            }
        });
    }

    typeSelect.addEventListener('change', updateFields);
    updateFields(); // 初期化
});

注意事項

  • CF7はAJAX送信のため、送信後のページ遷移が不要です。wpcf7mailsentイベントをJavaScriptで検知してサンクスページにリダイレクトする場合はdocument.addEventListener('wpcf7mailsent', ...)を使います。
  • メールの差出人アドレスはWordPressがインストールされているドメインのアドレスを使用してください。異なるドメインのメールアドレスを使うとSPFエラーでスパム判定される場合があります。
  • CF7 + Flamingo プラグインを組み合わせると送信データをWordPressのDBに保存できます。メール到達の問題が発生した際のバックアップとして有効です。

まとめ

CF7のカスタマイズは「フォームタグとCSSでデザイン整備→メールテンプレートで通知文をカスタマイズ→確認ダイアログをJSで実装→Akismet/reCAPTCHA/ハニーポットでスパム対策→条件分岐フォームでUXを向上」の流れで整備します。関連記事:WooCommerceを初期設定してECサイトを構築する方法WordPressの404エラーページをカスタマイズする方法

お気軽にご相談ください

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