Contact Form 7 で営業メールだけ Slack 通知をスキップする方法 — 3 段階の実装パターン
Contact Form 7 の送信を Slack に流すと、営業メールで通知が埋まって本物の問い合わせを見落とす。NG ワードでの分岐、wpcf7 フックでの自前実装、AI 判定を使った高精度分岐の 3 パターンを、コード付きで実装手順から比較します。
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 分:
- プラグイン管理画面で YomuForm を有効化
- 「設定」→「YomuForm」→ API キー欄に Anthropic / OpenAI / Gemini の API キーを貼り付け
- 通知設定 (Plus 機能) で以下のように構成:
- 通知 1: 種別 = Slack、宛先 =
https://hooks.slack.com/...、発火条件 = 「問い合わせ判定のみ」 - 通知 2: 種別 = メール、宛先 =
archive@yourcompany.com、発火条件 = 「全ての判定」 (営業も含めて全部ここに記録)
- 通知 1: 種別 = Slack、宛先 =
これで Slack には問い合わせだけ流れ、営業メールはメールアーカイブにだけ残ります。
この実装が他の Slack 連携プラグインと違う点
CF7 to Slack 系のプラグインは「送信→ Slack 投稿」を機械的にやるだけで、本文判定機能はありません。YomuForm は判定エンジンを内蔵しているので、判定種別ごとに通知ルートを分岐できるのが本質的な違いです。
まとめ
| 実装 | 精度 | 工数 | メンテ性 |
|---|---|---|---|
| レベル 1: NG ワード | 低 (誤検知多) | 30 分 | 悪 (リスト維持地獄) |
| レベル 2: 自前 AI 判定 | 高 | 1〜3 日 + 継続改修 | 中 |
| レベル 3: YomuForm | 高 | 5 分 | 良 (プラグイン側に閉じる) |
「Contact Form 7 で営業メールだけ Slack 通知をスキップする」は、通知層ではなく送信前の判定層 で解決するのが本質です。
自前で組むのも教育的に価値はありますが、運用に乗せて 1 か月もすると「あ、これプラグインに任せた方が楽だ」と気付くポイントが必ず来ます。Free から試して、必要に応じて Plus を入れる流れがおすすめです。