Contact Form 7 是 WordPress.org 外掛目錄裡少數幾支有效安裝數跨過「10+ million」門檻的外掛,也是免費聯絡表單類別裡數一數二熱門的選擇。它從 2007 年由日本開發者 Takayuki Miyoshi 首次發布至今,根據 WordPress.org 外掛頁面的統計,累計下載次數已經超過 4.2 億次,幾乎每個管理過 WordPress 網站的人都在後台看過它的名字。
這麼多網站在用,不代表它容易上手。Contact Form 7 不靠滑鼠拖拉元件組表單,而是用一串方括號組成的「表單標籤」定義每個欄位,第一次打開編輯畫面的人常常對著 [text* your-name] 這種語法愣住,搞不清楚星號代表什麼、名稱又要怎麼取才對得上後面的郵件範本。Contact Form 7 是一款永久免費、開放原始碼的 WordPress 聯絡表單外掛,建表單、送通知信、擋垃圾訊息這幾件核心的事都內建在同一支外掛裡,沒有另外要付費解鎖的進階版本。
外掛好不好用,決定了訪客願不願意把資料留下來,而 Contact Form 7 這幾年還多了一件事得放進評估,開發者在 2026 年公開了外掛長期走向的重大調整,直接牽動已經在用它的網站接下來該怎麼規劃。它的開發者背景與核心定位,決定了後面那些欄位語法為什麼會設計成現在這個樣子。

Contact Form 7 是什麼?免費、輕量的 shortcode 表單外掛
Contact Form 7 由日本開發者 Takayuki Miyoshi 在 2007 年首次發布,是 WordPress.org 外掛目錄裡歷史最久的聯絡表單外掛之一。外掛頁面的官方說明,把它定位成服務所有認同自由與開放原始碼精神的 WordPress 使用者的實用工具,這句話講的是它的哲學,不是行銷詞。從第一版到現在,Contact Form 7 的核心功能一直維持永久免費,沒有另一個要付費解鎖的「專業版」。想要更多進階功能,得靠第三方外掛搭配,而不是掏錢升級同一支外掛。
它跟市面上主流的拖拉式表單外掛(在編輯畫面裡直接把欄位元件拖進版面、即時看到成品)走的是完全不同的操作邏輯。Contact Form 7 用「表單標籤」這種方括號語法定義欄位,建表單的方式比較接近寫一小段標記語言,而不是用滑鼠排版;而且它沒有內建的即時視覺化預覽,設定完存檔後,得回到前台實際頁面才看得到表單長什麼樣子。這個特性對熟悉程式邏輯的人來說上手很快,對完全不碰程式碼的人則需要多一點適應。
目前這款外掛已經被翻譯成 68 種語言,繁體中文也在其中;如果你在用區塊編輯器,還可以透過一個 Gutenberg 區塊直接插入表單,不必手動複製貼上任何語法。
安裝完成後,後台新增的 Contact 選單與 4 個設定分頁
跟大多數 WordPress 外掛一樣,Contact Form 7 的安裝只有 2 步:在後台「外掛」搜尋到它、按下安裝並啟用,不需要跑過任何設定精靈。啟用完成後,左側選單會多出一個「Contact」項目,底下管理著這個網站所有的聯絡表單;第一次啟用時,系統會自動幫你建好一個示範表單,名字通常叫「Contact form 1」,可以直接拿來用,也可以刪掉重建。

點進任一個表單的編輯畫面,會看到固定排成一列的 4 個分頁:Form(表單模板,定義有哪些欄位)、Mail(郵件模板,定義通知信怎麼寄)、Messages(提示文字,定義使用者送出後看到什麼訊息)、Additional Settings(附加設定,用一行一行的程式碼片段控制比較進階的行為)。這 4 個分頁各自管一塊:Form 決定畫面上出現什麼欄位,Mail 決定資料怎麼變成一封信,Messages 決定使用者按下送出後看到什麼字,Additional Settings 則是留給進階需求的程式碼入口。一個表單能不能正常運作,其實是這 4 份設定疊在一起的結果,不只是畫面上看到的那些欄位而已。

表單設定完成後,取得 shortcode 是最基本的插入方式,把類似 [contact-form-7 id="1234" title="Contact form 1"] 這樣一段字串貼進頁面內容裡就會顯示表單;5.3 版之後也可以改用區塊編輯器裡的「聯絡表單選擇器」區塊,直接從清單挑選要插入哪個表單,不必手動複製貼上 shortcode 字串。
表單標籤由型別、名稱、選項與預設值 4 個部分組成
打開 Form 分頁看到的那一串方括號語法,叫做「表單標籤」(form-tag),每一個標籤最多拆成 4 個部分:型別(決定這個欄位要渲染成什麼元件,像是單行文字框還是下拉選單)、名稱(識別這個欄位,後面郵件範本要靠同樣的名稱把值抓出來)、選項(控制這個欄位的行為與外觀,可以省略)、預設值(欄位一開始顯示的內容,同樣可以省略)。這 4 個部分不能隨便排序,規則是選項不能出現在名稱前面、預設值不能出現在選項前面,名稱本身則必須以英文字母開頭,後面才能接數字、連字號或底線。
![表單分頁裡用 [text* your-name] 這類方括號表單標籤定義每個欄位](https://www.pongo.com.tw/wp-content/uploads/2026/09/cf7-form-tag-syntax.webp)
不熟悉語法也不用整段硬背,後台編輯畫面裡有一顆「插入標籤」按鈕,點開會跳出對應型別的設定視窗,填完選項系統自動幫你組出正確的標籤字串,貼進 Form 分頁就好,不必自己手刻方括號。
![文字欄位的表單標籤產生器,填好選項後自動組出 [text text-233] 標籤字串](https://www.pongo.com.tw/wp-content/uploads/2026/09/cf7-tag-generator.webp)
很多人一開始會把「表單標籤」跟「郵件標籤」(mail-tag)搞混,這兩套語法看起來像,規則卻完全不一樣,表單標籤是 4 段式的完整語法,郵件標籤只有單一個詞。舉例來說,Form 分頁裡寫的是 [text* your-name],到了 Mail 分頁對應要抓這個欄位的值,只需要寫 [your-name],不能照抄整段表單標籤貼過去,也不能在表單標籤裡用郵件標籤的簡寫格式。分清楚這兩套語法各自用在哪個分頁,才不會讓郵件通知漏抓欄位資料。
文字、數字與日期類欄位的標籤寫法
最常用的一組欄位屬於文字類:text 與加星號的 text* 是最基本的單行文字框,星號代表這個欄位是必填,不加星號則可以留空;email/email* 用法相同,差別是系統會檢查使用者填的內容是不是合法的信箱格式;tel/tel* 檢查電話號碼格式,url/url* 檢查網址格式;需要讓使用者填比較長內容的欄位,像是留言或需求說明,就用 textarea/textarea* 這種多行文字框。這幾種型別的加星號規則完全一致,型別後面有沒有星號,直接決定這個欄位在送出前會不會被擋下來。
除了文字,還有兩種數值相關的型別。number 用來收純數字的輸入,像是數量或年齡;range 則會顯示成一條可以左右拖曳的滑桿,適合用在「選一個範圍內的數值」這種情境,例如預算區間。日期則靠 date 型別處理,除了基本的日曆選擇器,還可以另外設定最小值與最大值,把可選的日期範圍限制在某個區間內,避免使用者選到不合理的日子,例如把出生日期的上限鎖在今天。
核取方塊、下拉選單與檔案上傳欄位
第二組欄位處理「讓使用者從清單裡挑」這件事。checkbox/checkbox* 是可以複選的核取方塊,radio 是只能選一個的圓形選項,select/select* 則是下拉選單,還可以另外設定成多選,或是在清單最前面加一個空白選項當作預設狀態。這幾種型別的選項清單寫法都一樣,在標籤產生器裡一行輸入一個選項,系統會自動排成對應的清單,不需要自己在方括號裡手動拼接。
檔案上傳靠 file/file* 這個型別處理,跟前面幾種選擇型欄位不同的是,它多了兩個實際上手時常常忘記設定的地方:檔案大小上限與可接受的副檔名。上傳的檔案大小限制單位是位元組,忘記換算清楚就容易把上限設得太小,讓使用者上傳一份正常大小的履歷或圖片都被擋下來;副檔名限制則決定使用者能上傳哪幾種格式的檔案,沒有另外設定的話,預設允許的格式範圍可能比你想像的更寬,值得在設定當下就順手檢查一次。
測驗、同意欄位,2 種免安裝外掛的防呆機制
這 2 種欄位不需要另外裝外掛,是寫進 Contact Form 7 核心裡的防呆設計。quiz(測驗)型別用一條直線「|」分隔問題與答案,例如 [quiz capital-quiz "日本的首都是?|東京"],可以放進多組問答,系統送出表單時會隨機挑一組要求作答;因為答案是固定的文字比對,不需要仰賴任何外部服務,也能達到一定程度的擋機器人效果,對不想串接第三方驗證服務的網站是個輕量選項。
acceptance(同意)欄位則用來確認使用者勾選同意某段條款,語法有開始與結束標籤,中間夾著要顯示的文字內容。它預設是必勾欄位,加上 optional 選項可以改成選填,加上 invert 選項則會反過來,變成使用者要主動清空勾選才能送出表單。同意欄位的驗證邏輯跟其他一般欄位不太一樣,預設是等所有其他驗證都通過之後才檢查這一項,如果想讓它比照一般欄位、一有問題就立刻顯示錯誤訊息,得在 Additional Settings 分頁加一行 acceptance_as_validation: on。如果站上還裝了 Flamingo 這支留存訊息的外掛,使用者的同意勾選結果也會一併存進資料庫,日後真的需要查證「這個人當初有沒有勾同意」時,才調得出紀錄。
郵件分頁用 mail-tag 語法,把表單欄位轉成通知內容
送出表單之後,通知信怎麼組成,靠的是 Mail 分頁裡 5 個欄位:To 是收件地址,要符合合法信箱格式;From 是寄件地址;Subject 是信件主旨;Additional headers 可以加 Cc、Bcc 等其他標頭欄位,一行寫一個;Message body 則是信件實際內容,勾選「使用 HTML 內容類型」之後,內容還能支援 HTML 排版,不只是純文字。

信件內容要帶進使用者實際填寫的資料,靠的是郵件標籤(mail-tag)。跟前面提到的規則一樣,郵件標籤只有一個詞,大多對應同名的表單欄位名稱,送出時會被替換成使用者當下填的內容。這裡最常出錯的地方是,表單新增了一個欄位,卻忘記在 Mail 分頁裡也補上對應的郵件標籤,結果通知信收到了,裡面卻獨獨少了那一筆資料,看起來像是使用者根本沒填。官方文件把這個現象列進常見問題,原因很單純,欄位名稱要在 Form 與 Mail 兩個分頁裡對上,少補一邊就會漏資料。另外,勾選「排除含空白郵件標籤的行」這個選項,可以讓沒有填寫的選填欄位不要出現在通知信內容裡,避免信件裡出現一堆空白行。
除了主要的通知信,Mail 分頁下方還有一份「Mail (2)」,是額外的第二份郵件範本,只有在主要郵件成功送出之後才會另外寄出,很多網站拿它當自動回覆信,直接寄給填表的人,讓對方知道資料已經送達。
寄件人設定看似只是填一個信箱,實際上直接影響通知信會不會被當成垃圾郵件。From 欄位如果填的信箱跟網站不同網域,收件端很難分辨這是不是偽造的寄件人,容易被歸進疑似垃圾信處理;比較保險的做法是另外準備一個真實存在、跟網站同網域的信箱(例如 wordpress@你的網域),因為外掛預設的郵件範本本來就會用這個地址當 From,有些主機甚至會直接擋掉從不存在信箱寄出的郵件。同時啟用 SPF、DKIM 這類郵件驗證機制,可以再進一步降低通知信被誤判成偽造郵件的風險;而信件內容本身留白或太短,同樣容易被系統判定為垃圾內容,甚至在部分主機環境直接寄送失敗,寫 Message body 時值得多放一點實際內容,不要只留一句空泛的「有新留言」。
訊息分頁能依情境自訂各種提示文字
使用者按下送出鍵之後看到的那句話,是在 Messages 分頁裡改的。這個分頁列出好幾種情境各自對應的預設提示文字:送出成功、送出失敗、驗證失敗、必填欄位未填、信箱格式錯誤、上傳檔案過大等等,每一種情境都有一句英文的內建文案,而且每一句都可以直接在後台改寫成自己想要的文字,不必動到程式碼。

把這些提示文字換成貼合品牌語氣的說法,是很容易被忽略、卻能明顯提升體驗的小地方,把預設生硬的英文錯誤訊息換成符合網站調性的中文提醒,使用者填錯欄位時的感受會有明顯落差。需要特別留意的是,Messages 分頁改的只是前台顯示給訪客看的文字,純粹是介面呈現的問題,不會影響郵件實際有沒有寄出成功;郵件送不送得出去,要回頭檢查的是 Mail 分頁的設定與寄件環境,兩者是完全獨立的兩件事,不要以為改對了提示文字,通知信的問題就一併解決了。
附加設定分頁用程式碼片段,控制表單背後的進階行為
Additional Settings 是 4 個分頁裡最偏工程師導向的一塊,不是用滑鼠點選,而是一行接一行貼上像 設定名稱: 值 這種格式的字串,用來控制表單背後比較進階的行為。前面提到的 acceptance_as_validation: on 就是一個例子,其他像是控制 Flamingo 要不要記錄某個表單、自訂 Flamingo 對應的欄位名稱,也都是寫在這個分頁裡。

一個很多人會想動、但官方其實不太建議的需求,是「送出後要不要導到另一個網址」。Contact Form 7 預設送出後會停留在原本的表單頁面,官方文件明確說明這個技巧對絕大多數使用者其實沒有必要,也不建議直接使用。真的有導頁需求時,例如想在送出後帶使用者到一個感謝頁,官方建議的做法不是在 Additional Settings 裡加設定字串,而是在主題範本裡加入一段監聽 wpcf7mailsent 這個 DOM 事件的 JavaScript,範例大致是這樣:
document.addEventListener('wpcf7mailsent', function(event) {
setTimeout(() => {
location = 'https://example.com/thanks/';
}, 3000);
}, false);Code language: JavaScript (javascript)
這段程式碼的意思是,等表單真的成功送出、觸發 wpcf7mailsent 事件之後,延遲 3 秒再把使用者導去指定的網址,留這 3 秒是讓使用者先看到 Messages 分頁設定的成功訊息,不會畫面一送出就馬上跳走。比較舊的 on_sent_ok 掛勾寫法,官方目前也不再建議使用,改用監聽事件的方式取代。
reCAPTCHA v3、Turnstile 與 Akismet 3 層垃圾訊息防護
Contact Form 7 整合了好幾種垃圾訊息防護機制,其中變動最大的是 reCAPTCHA。從 5.1 版開始,這款外掛只支援 reCAPTCHA v3,不再支援舊版的 v2;v3 不像 v2 那樣需要使用者勾選「我不是機器人」的方塊,而是在背景針對每一次送出行為評分,判斷這個行為像不像真人操作,對訪客來說整個驗證過程幾乎是無感的。
這個版本差異最常讓照抄舊教學的人找不到方向:v3 用的 API 金鑰跟 v2 不是同一組,既有的 v2 金鑰沒辦法直接沿用,得重新到 Google reCAPTCHA 的管理主控台註冊網站,拿到新的一組金鑰。設定路徑在後台 Contact > Integration,把 Site Key 與 Secret Key 貼進去就完成串接;因為 v3 不需要顯示任何小工具,舊版表單裡如果殘留 [recaptcha] 這種舊標籤,系統會直接忽略、當成空字串處理,不會噴出錯誤。如果你的網站真的有非用 v2 打勾方塊不可的理由,得另外找第三方外掛補上,Contact Form 7 本身已經不提供這個選項。

除了 reCAPTCHA,Akismet 整合可以延用 WordPress 內建的垃圾留言判斷邏輯,直接套用到聯絡表單的送出內容上;Cloudflare 的 Turnstile 也列在官方支援的整合選項裡,作為另一種不需要使用者互動的防護機制。這 3 種防護服務性質不完全一樣,但共同點是都在後台同一個 Contact > Integration 頁面設定,啟用之後,使用者的 IP 位址等個資可能會傳送給對應的服務商處理,這點在啟用前值得先了解清楚。
搭配 Flamingo 外掛,把送出訊息留存進資料庫
Contact Form 7 本身完全不會把送出的訊息存進資料庫的任何地方,單純只靠寄信通知這一條路徑,這件事直接關係到這款外掛值不值得裝。這代表一旦郵件伺服器出狀況、或是 Mail 分頁的設定有誤,那則留言就永久遺失了,網站管理者不會知道曾經有人填過表單,使用者也拿不回自己填過的紀錄。
解決這個風險的作法,是搭配同一位開發者做的另一支免費外掛 Flamingo,它會把所有透過 Contact Form 7 送出的訊息完整存進資料庫,即使通知信真的沒送到,也能回頭在 Flamingo 的收件匣裡把留言撈出來。裝好之後,後台會多一個 Inbound Messages 選單,列表裡的主旨與寄件人資訊,預設是抓 your-subject、your-name、your-email 這 3 個表單裡的預設欄位名稱去對應。
如果你的表單自訂過欄位名稱,沒有沿用這 3 個預設名稱,就得在 Additional Settings 手動補上對應設定,Flamingo 才抓得到正確的寄件人資訊,例如寫成 flamingo_email: "[the-email-field]"、flamingo_name: "[the-name-field]",一行也可以放進多個郵件標籤組合起來,像是姓氏與名字分開填的表單,可以寫成 flamingo_name: "[first-name-field] [last-name-field]"。反過來,如果某個表單基於隱私考量不希望被 Flamingo 記錄,同樣在 Additional Settings 加一行 do_not_store: true 就能關閉。
串接 Constant Contact、Brevo 與 Stripe 的行銷及金流功能
Contact Form 7 免費核心之外,官方也直接內建了幾組外部服務的整合模組,不必額外找第三方外掛拼湊。Constant Contact 整合可以把填過表單的使用者自動加進電子報訂閱名單,對想把聯絡表單順便當成收信名單入口的網站很實用;Brevo(前身是 Sendinblue)整合的功能定位類似,同樣是把表單資料接進電子郵件行銷系統,讓後續的名單經營不必再手動匯出匯入。
金流方面,Stripe 整合可以讓表單附帶收款功能,不只是收集聯絡資訊,還能在同一個表單流程裡完成付款,適合報名費、小額捐款這類不需要完整購物車系統的收款情境。這幾項都列在官方文件的外部 API 整合分類底下,設定入口統一在後台 Contact > Integration,跟前面 reCAPTCHA、Akismet 的設定位置是同一個頁面,只是串接的目的從防護垃圾訊息換成串接行銷與金流服務。啟用任何一項整合之前,同樣要留意使用者資料會被傳送給對應的服務商,值得先確認清楚這些外部服務各自的隱私權政策。
功能凍結後,免費核心定位和長期維護的取捨
2026 年 4 月,開發者 Takayuki Miyoshi 在 WordCamp Asia 上公開了一項會影響長期規劃的重大決定,Contact Form 7 即將進入功能凍結,6.2 版是最後一次會加入新功能的版本,之後的更新只處理安全性與程式錯誤修復,不會再有主動的功能開發。這不代表外掛不安全或即將停止維護,已經在用的網站不會因此突然出問題,原本的欄位語法、郵件設定、防護整合也都會照常運作,只是往後不會再看到新增的欄位型別或新的整合服務。

真正需要留意的是長期趨勢,核心功能已經穩定成熟到不太會再變動,但也代表不會再進化。如果你的需求是條件邏輯(某個欄位依另一個欄位的答案決定要不要顯示)、內建留存(不靠 Flamingo 也能把資料存進資料庫)、或是視覺化的拖拉編輯介面,這些能力短期內不會出現在 Contact Form 7 本身,得靠前面提到的 Flamingo 這類第三方外掛自己補,或是評估國際上主打這些內建功能的付費表單方案,依實際需求權衡值不值得換一套系統。
開發者本人並沒有停下腳步,他正在做的下一個專案叫 Contactable.io,預計 2028 年推出,採用完全不同的架構,建構在 Cloudflare Workers 上、以 RESTful API 的形式提供服務,而不是延續現在這種外掛安裝在單一 WordPress 網站裡的模式。這代表 Contactable.io 不是 Contact Form 7 的下一個大版本,而是同一位開發者另起爐灶的全新專案,兩者之間目前沒有直接的升級路徑;對現在還在用 Contact Form 7 的網站來說,這件事短期內不影響任何運作,但長期要不要跟著轉移,是另一個需要獨立評估的問題。
回頭看,Contact Form 7 能撐住這麼高的安裝數,靠的從來不是花俏的介面,而是那套用方括號寫成的表單標籤,把型別、名稱、選項、預設值 4 個部分講清楚之後,剩下的郵件設定、防護整合、資料留存,其實都是同一套邏輯的延伸。它把「輕量」這件事做到底,免費、開源、沒有付費升級版,但也因為這樣,能不能用得順手,很大程度取決於你願不願意花點時間搞懂這套語法規則,而不是指望介面幫你把一切都想好。
功能凍結之後,這款外掛不會消失,也不會突然變得不安全,只是接下來會停在一個穩定但不再進化的狀態。對已經在用它的網站來說,現階段最實際的做法,是先確認自己真正需要的功能,現在的版本能不能滿足;真的碰到條件邏輯、內建留存這類進階需求,再回頭評估要靠外掛補,還是整個換一套系統。這個判斷沒有標準答案,但至少現在,你已經知道 Contact Form 7 這套系統裡每一塊分別在做什麼,自己動手調整或找人協助時,都能更清楚該從哪裡下手。
