WordPress教學:免裝外掛防止機器人垃圾、廣告留言

簡單幾個步驟教你防止機器人的垃圾留言和一大堆廣告,不需要安裝外掛、插件,不怕WordPress不相容問題。

實際效果的好壞可能還要一段時間來看看,會有這篇是因為我把WordPress東升級西升級,還順便換了佈景後,後台就變得怪怪的。把外掛全關一關就又好了,所以目前外掛只留了兩個。原本拿來擋廣告用的SI CAPTCHA Anti-Spam也關掉了,雖然可以正常運作,但啟用的話我後台的選單頁面就會打不開。不過這應該是我這邊的問題,因為我的WordPress都是自己手動亂更新的,可能是哪裡出了點問題。

如果你要用插件(外掛、Plugin)來擋機器人的垃圾留言和廣告的話,那SI CAPTCHA Anti-Spam真的不錯用,可以試試看;若想自己做一個超簡易版,那就參考我這篇文吧!包括解析及說明。

首先要準備一個文字編輯工具,任何你平時使用、熟悉或愛好的文字編輯軟體都行。如果都沒有的話推薦以下幾個:Notepad++PSPadRJ TextEdNotepad 2還有Komodo Edit等等。

接著使用FTP軟體從網站伺服器(虛擬主機)上,到WordPress根目錄,把根目錄內的wp-comments-post.php和wp-includes資料夾內的comment-template.php都下載回來(可能不是wp開頭,看你的設定),這時候建議你把這兩個檔案都複製一份,免得不小心改壞了,可以有原始的檔案來回復。

再來就是開始編輯這兩個檔案了。先打開comments-template.php,裡面的程式碼有一千五百多行,別緊張,直接往下拉,到1521行,會看到$fields,它是一個用來存回覆時的姓名、Email和網址欄位html的陣列。

現在我們需要新增一個test欄位,來讓使用者輸入你自訂的驗證碼。只是一些簡單的html,你可以根據你的需求更改,也可以完全照我的版本來使用,驗證的文字是Human,使用者必須輸入才能發表。在裡面新增一行,定義test,內容為:

'test'   => '<p><label for"test">防垃圾訊息:請在此欄填入Human</label><br/><input id="test" name="test" type="text" size="30" /></p>',

直接把上面那段貼到新的一行裡就不會錯了!comments-template.php只需要改這樣就行了。再來是編輯wp-comments-post.php。移到第53行,並在下面再新增一行,定義$comment_test,用來儲存使用者在test欄位輸入了什麼:

$comment_test  = ( isset($_POST['test']) )  ? trim($_POST['test']) : null;

再來往下一點點,下面那段是如果使用者是登入狀態的話要做的事。因為登入的使用者看不到test欄位,當然已登入也不需要再驗證。但這時$comment_test的值就會是null,這樣等等就會出錯,已登入的使用者要回覆時就會叫你輸入驗證碼。所以我們要在這裡新增一行,如果使用者是登入狀態,那就直接把驗證文字傳給$comment_test

$comment_test  = 'human';

然後是最後一個部分:判斷使用者有沒有正確輸入驗證文字,如果沒有的話就會跑到錯誤畫面,有的話就繼續執行下面的程式。下面這段看你要擺哪裡,基本上從剛剛那邊到把文章發出去前都可以,我們就放在8x行,如圖片的地方就行了:

if ( strtolower($comment_test) != 'human'){
wp_die( '您沒有輸入正確的驗證碼!請在test欄位上填入Human,讓我們確定不是垃圾留言<br/>以下是您的原始訊息(建議您先保存下來再按上一頁,避免訊息被清空):<br/><div style="border:1px solid #999;">' .  nl2br($comment_content) . '</div>' );
}

來說明一下這段的意思,是個簡單的if判斷:如果使用者輸入的不是human,那就執行wp_die(),並顯示錯誤訊息。加了strtolower之後,驗證的文字就不區分大小寫,錯誤訊息內會把使用者原始的回覆內容也顯示出來,好讓使用者可以備份起來。

終於大功告成了!記得把這兩個檔案上傳上去,並覆蓋原本的檔案,你可以自己測試是不是能正常運作。基本上應該可以擋掉該死的機器人留言了。

適用WordPress版本應該是3.0以上!

2 thoughts on “WordPress教學:免裝外掛防止機器人垃圾、廣告留言

  1. 很有用的WordPress教學
    趕快來試試看

發表迴響

你的電子郵件位址並不會被公開。

限制時效已用盡。請重新載入驗證碼。