
公司網站放上聯絡信箱之後,垃圾信越收越多。原因之一是有程式專門在網路上爬網頁,看到 xxx@xxx.com 這種格式就收集起來,拿去寄廣告信。
WordPress 內建一個小函式 antispambot(),可以把 Email 改寫成網頁編碼:
原本:service@example.com
處理後:service@example.com瀏覽器會把編碼轉回來,訪客看到的還是 service@example.com,點了也能直接寫信;但網頁原始碼裡找不到完整的地址,只會比對文字格式的簡單爬蟲就收集不到。每次產生的編碼還會隨機變化。
程式碼
放在子佈景主題的 functions.php,或用 Code Snippets 這類外掛新增:
// 短代碼 [zw_email address="service@example.com"]:輸出打亂過的 Email 連結
add_shortcode( 'zw_email', function ( $atts ) {
$email = sanitize_email( $atts['address'] ?? '' );
if ( ! is_email( $email ) ) {
return '';
}
return '<a href="mailto:' . antispambot( $email ) . '">' . antispambot( $email ) . '</a>';
} );
// 文章內容、摘要和留言裡直接打的 Email,顯示時自動打亂
function zw_hide_emails( $content ) {
// WordPress 自動產生摘要時,會先跑一次 the_content 再截字;這時先不處理,
// 等摘要截好之後(下面的 get_the_excerpt)再處理,免得把打亂後的字截斷
if ( 'the_content' === current_filter() && doing_filter( 'get_the_excerpt' ) ) {
return $content;
}
return preg_replace_callback(
'/(?<![\w.\-+=\/@])[\w.+\-]+@[\w\-]+(?:\.[\w\-]+)+/u',
function ( $m ) {
return is_email( $m[0] ) ? antispambot( $m[0] ) : $m[0];
},
$content
);
}
add_filter( 'the_content', 'zw_hide_emails', 20 );
add_filter( 'get_the_excerpt', 'zw_hide_emails', 20 );
add_filter( 'comment_text', 'zw_hide_emails', 20 );短代碼 [zw_email]
在頁面放一個「短代碼」區塊,填入:
[zw_email address="service@example.com"]會輸出一個可以點的 Email 連結,連結和顯示的文字都經過編碼。
文章、摘要、留言自動處理
下半段讓文章內容、摘要和留言裡直接打出來的 Email,在顯示時自動編碼,不用一篇一篇改:
- 規則只抓「看起來像 Email」的文字,再用
is_email()確認一次。 - 網址裡的
@(例如圖片檔名logo@2x.png前面接著/)不會被當成 Email。 - 處理的是顯示的時候,資料庫裡的文章內容不會被改掉,拿掉程式碼就恢復原狀。
實際測試的結果
測試文章裡放了:兩個直接打的 Email、一個 mailto 連結、一個短代碼、程式碼區塊裡的 Email、一張檔名有 @2x 的圖片,留言裡再放一個 Email。
- 網頁原始碼:找不到任何一個完整的 Email。
- 瀏覽器顯示:每個 Email 都正常顯示,mailto 連結點下去的地址正確(
mailto:boss@example.com、mailto:hello@example.com)。 - 圖片網址
logo@2x.png沒有被改到,圖片正常。 - 留言裡的 Email,WordPress 本來就會自動變成連結,處理後連結也正確。
測試時發現的問題:摘要被截斷
第一版程式只處理 the_content,結果文章列表的自動摘要出現一段亂碼,像 	 […]。
原因是 WordPress 產生摘要時,會先把文章內容跑一次 the_content(這時 Email 已經被編碼成一長串),再截取前面幾十個字。剛好截在編碼的中間,就變成亂碼了。
現在的寫法是:產生摘要的過程中先不編碼,等摘要截好之後,再透過 get_the_excerpt 處理。測試一篇 Email 在摘要範圍內的長文章,摘要顯示正常,原始碼裡也沒有完整的 Email。
這種做法擋不住什麼
antispambot() 只是把字換成網頁編碼,比較進階的爬蟲會先把網頁編碼還原再收集,一樣抓得到。它能減少的是最簡單、數量最多的那一類。
更有效的做法:
- 用聯絡表單取代公開 Email。客人填表單,信由網站寄給你,Email 完全不出現在網頁上。表單記得加上防垃圾機制。
- 用專用信箱。網站上公開的信箱和自己平常用的分開,垃圾信太多時可以換掉。
- 網站有用 Cloudflare 的話,它有「Email 位址混淆」功能,開啟後會自動處理整個網站。
- 不建議把 Email 做成圖片。看不到圖的人沒辦法讀,也不能點擊或複製,對客人很不方便。
延伸閱讀
- WordPress 防垃圾留言總整理:外掛、留言設定、蜜罐與字數限制
- 不用外掛,替 WordPress 登入頁和留言表單加簡單驗證題
- 用 Gmail 收發公司企業信箱:寄件(SMTP)設定與 Gmail 停用 POP 後的收信方式
網站的聯絡方式要讓客人好找,又不能讓機器人太好找。正威網路行銷是 25 年經驗的基隆網頁設計工作室,會依你的接單方式規劃表單、LINE、電話這些聯絡入口,台北與全台客戶也歡迎來聊聊。







發表留言
還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。