← ブログ一覧

Contact Form 7 で営業メールだけ Slack 通知をスキップする方法 — 3 段階の実装パターン

Contact Form 7 の送信を Slack に流すと、営業メールで通知が埋まって本物の問い合わせを見落とす。NG ワードでの分岐、wpcf7 フックでの自前実装、AI 判定を使った高精度分岐の 3 パターンを、コード付きで実装手順から比較します。

·1·YomuForm 編集部

WordPress + Contact Form 7 の送信通知を Slack に流していて、営業メールで Slack が埋まっている ことに気付いた方向けの How-to 記事です。「全件 Slack に流す」のをやめて「真の問い合わせだけ Slack、営業はメールアーカイブだけ」に切り替える具体的な実装を、3 段階で紹介します。

ゴールの確認

最終的にやりたいこと:

  • Contact Form 7 の送信が起きると、本文を判定する
  • 問い合わせ判定 → これまで通り Slack に通知
  • 営業判定 → Slack には流さず、メールには記録だけ残す (アーカイブとして)

この 1 段噛ますだけで Slack の通知ストレスは劇的に下がります。

なぜ「Slack 側のフィルタ」では難しいのか

「Slack のキーワードフィルタで弾けないの?」と最初に思いますが、Slack の通知フィルタは チャンネル単位 / DM 単位 / メンション単位 が中心で、メッセージ本文の内容で動的に振り分ける 機能は無い (or 限定的) です。

加えて、WordPress 側から「営業っぽい本文」が Slack に届いた時点で チャンネル履歴には残ります。「通知だけ消す」を実現しても、後から見ると履歴が営業で埋まっていて、結局運用負荷は減りません。

送信前 (WordPress 側) で振り分ける のが本質的な解決です。

レベル 1: NG ワード + wpcf7_skip_mail で分岐 (お手軽だが誤検知)

最も簡素な実装。functions.php か小さなカスタムプラグインに以下を追加します:

add_action( 'wpcf7_before_send_mail', function ( $contact_form, &$abort, $submission ) {
    if ( ! $submission ) return;
    $posted = $submission->get_posted_data();
    $body   = (string) ( $posted['your-message'] ?? '' );

    // ざっくり NG ワード — 営業メールに出やすい表現を 5〜10 個ほど
    $sales_words = [ 'SEO 改善', '資料 DL', 'LP 制作', '採用代行', '貴社サイトを拝見' ];

    $is_sales = false;
    foreach ( $sales_words as $w ) {
        if ( mb_stripos( $body, $w ) !== false ) {
            $is_sales = true;
            break;
        }
    }

    if ( $is_sales ) {
        // メール送信 (= サイト管理者向け通知) は通常通り走る
        // Slack 連携プラグイン側で、CF7 の特定フラグを見てスキップする実装が前提
        // 例: WPCF7 -> Flamingo -> Slack 系プラグインなら、Tag を付けて分岐させる
        do_action( 'yomuform_dev_flag_sales' );
    }
}, 10, 3 );

問題点:

  • 誤検知: 「弊社の SEO 改善 を御社にお願いしたい」という本物の問い合わせも営業判定になる
  • メンテ地獄: 営業側が言い回しを変えると都度ワードリスト追加
  • 誰も「何が営業ワードか」を維持できなくなる

検索ボリュームの少ないニッチな業界用語が NG リストに混入したり、逆に大ヒットワードが漏れていたりして、長期的には誰も触れない blob になります。

レベル 2: wpcf7_before_send_mail + 自前で AI に判定させる

NG ワードを諦めて、送信本文を LLM に渡して判定 させます。

add_action( 'wpcf7_before_send_mail', function ( $contact_form, &$abort, $submission ) {
    if ( ! $submission ) return;
    $posted = $submission->get_posted_data();
    $body   = (string) ( $posted['your-message'] ?? '' );

    // Anthropic Claude API に判定を依頼 (例)
    $response = wp_remote_post( 'https://api.anthropic.com/v1/messages', [
        'headers' => [
            'x-api-key'         => get_option( 'my_anthropic_key' ),
            'anthropic-version' => '2023-06-01',
            'Content-Type'      => 'application/json',
        ],
        'body' => wp_json_encode( [
            'model'      => 'claude-haiku-4-5',
            'max_tokens' => 200,
            'messages'   => [[
                'role'    => 'user',
                'content' => "次の問い合わせフォーム送信が「営業の打診」か「製品/サービスへの問い合わせ」か判定して、JSON で {\"category\": \"sales\" | \"inquiry\", \"confidence\": 0-1} を返してください。\n\n本文:\n" . $body,
            ]],
        ] ),
        'timeout' => 8,
    ] );

    if ( is_wp_error( $response ) ) return; // API 障害時はそのまま通す
    $data    = json_decode( wp_remote_retrieve_body( $response ), true );
    $content = $data['content'][0]['text'] ?? '{}';
    $verdict = json_decode( $content, true );

    if ( ( $verdict['category'] ?? '' ) === 'sales' && ( $verdict['confidence'] ?? 0 ) >= 0.7 ) {
        // 「営業」判定 → Slack 連携プラグインの送信先タグを差し替える、
        // もしくは Slack 通知メソッド自体をスキップする実装に切り替える
        update_post_meta( $contact_form->id(), '_yomuform_last_verdict', 'sales' );
    }
}, 10, 3 );

精度はレベル 1 とは比較にならないほど高くなります。実装上のポイント:

  • API キーは get_option で wp_options に保存。コードに直書きしないこと
  • タイムアウトは 5〜8 秒以下。AI 判定で送信完了が遅延すると、フォーム側がタイムアウトで失敗します
  • API 障害時は判定をスキップ。フェイルセーフで「全件通す」が原則 (本物の問い合わせをロストするより安全)

ただし運用に入ると次の課題が出ます:

  • Slack 通知プラグインとの 連携が API ごとに違う (Slack Webhook 直書きなのか、WP Mail SMTP + Slack 用 Receiver なのか)
  • 判定ログを見たい (「どれが営業判定だったか後で見たい」)
  • 誤判定時にプロンプトを調整したい
  • 複数フォーム / 複数 AI プロバイダー対応

ここまで自作するのは結構な開発工数です。

レベル 3: YomuForm を入れる (実装ゼロ)

ここまでの実装をプラグインとしてパッケージしたのが YomuForm です。

設定手順は 5 分:

  1. プラグイン管理画面で YomuForm を有効化
  2. 「設定」→「YomuForm」→ API キー欄に Anthropic / OpenAI / Gemini の API キーを貼り付け
  3. 通知設定 (Plus 機能) で以下のように構成:
    • 通知 1: 種別 = Slack、宛先 = https://hooks.slack.com/...、発火条件 = 「問い合わせ判定のみ」
    • 通知 2: 種別 = メール、宛先 = archive@yourcompany.com、発火条件 = 「全ての判定」 (営業も含めて全部ここに記録)

これで Slack には問い合わせだけ流れ、営業メールはメールアーカイブにだけ残ります。

この実装が他の Slack 連携プラグインと違う点

CF7 to Slack 系のプラグインは「送信→ Slack 投稿」を機械的にやるだけで、本文判定機能はありません。YomuForm は判定エンジンを内蔵しているので、判定種別ごとに通知ルートを分岐できるのが本質的な違いです。

まとめ

実装 精度 工数 メンテ性
レベル 1: NG ワード 低 (誤検知多) 30 分 悪 (リスト維持地獄)
レベル 2: 自前 AI 判定 1〜3 日 + 継続改修
レベル 3: YomuForm 5 分 良 (プラグイン側に閉じる)

「Contact Form 7 で営業メールだけ Slack 通知をスキップする」は、通知層ではなく送信前の判定層 で解決するのが本質です。

自前で組むのも教育的に価値はありますが、運用に乗せて 1 か月もすると「あ、これプラグインに任せた方が楽だ」と気付くポイントが必ず来ます。Free から試して、必要に応じて Plus を入れる流れがおすすめです。

Contact Form 7SlackHow-toWordPress

YomuForm を試す

この記事の課題を、YomuForm を入れるだけで解決できます。 Free から始めて、必要に応じて Plus / Pro にアップグレード可能です。

YomuForm の機能を見る