A-A+
WP Anti Spam 小牆 1.84
相信大家对垃圾评论都恨之入骨,我这里有时一天竟然多达几百条,大都是英文(据说这些外文的spam都是出自我们国人的杰作...)虽然Akismet防垃圾留言插件会把大部分spam挡在后台,但可能也会误判部分正常留言,从密密麻麻的垃圾中捡回来,也是非易事。为了挡住这些机器发的spam,有的童鞋很无奈地添加一个验证码功能,但这样会影响真正浏览者的体验,可能会造成博客留言的锐减。还好Willin Kan大师提供的WP Anti Spam 小墙代码,比较完美地解决了这一问题。
防spam功能添加方法:
打开functions.php找到://全部设置结束
- /* <<小牆>> Anti-Spam v1.84 by Willin Kan. */
- class anti_spam {
- function anti_spam() {
- if ( !current_user_can('read') ) {
- add_action('template_redirect', array($this, 'w_tb'), 1);
- add_action('init', array($this, 'gate'), 1);
- add_action('preprocess_comment', array($this, 'sink'), 1);
- }
- }
- //設欄位
- function w_tb() {
- if ( is_singular() ) {
- ob_start(create_function('$input','return preg_replace("#textarea(.*?)name=(["'])comment(["'])(.+)/textarea>#",
- "textarea$1name=$2w$3$4/textarea><textarea name="comment" cols="100%" rows="4" style="display:none"></textarea>",$input);') );
- }
- }
- // 檢查
- function gate() {
- $w = 'w';
- if ( !emptyempty($_POST[$w]) && emptyempty($_POST['comment']) ) {
- $_POST['comment'] = $_POST[$w];
- } else {
- $request = $_SERVER['REQUEST_URI'];
- $way = isset($_POST[$w]) ? '手動操作' : '未經評論表格';
- $spamcom = isset($_POST['comment']) ? $_POST['comment'] : '';
- $_POST['spam_confirmed'] = "請求: ". $request. "n方式: ". $way. "n內容: ". $spamcom. "n -- 記錄成功 --";
- }
- }
- // 處理
- function sink( $comment ) {
- // 不管 Trackbacks/Pingbacks
- if ( in_array( $comment['comment_type'], array('pingback', 'trackback') ) ) return $comment;
- // 已確定為 spam
- if ( !emptyempty($_POST['spam_confirmed']) ) {
- // 方法一: 直接擋掉, 將 die(); 前面兩斜線刪除即可.
- die();
- // 方法二: 標記為 spam, 留在資料庫檢查是否誤判.
- // add_filter('pre_comment_approved', create_function('', 'return "spam";'));
- // $comment['comment_content'] = "[ 小牆判斷這是Spam! ]n". $_POST['spam_confirmed'];
- // $this->add_black( $comment );
- } else {
- // 檢查頭像
- $f = md5( strtolower($comment['comment_author_email']) );
- $g = sprintf( "http://%d.gravatar.com", (hexdec($f{0}) % 2) ) .'/avatar/'. $f .'?d=404';
- $headers = @get_headers( $g );
- if ( !preg_match("|200|", $headers[0]) ) {
- // 沒頭像的列入待審
- add_filter('pre_comment_approved', create_function('', 'return "0";'));
- //$this->add_black( $comment );
- }
- }
- return $comment;
- }
- // 列入黑名單
- // function add_black( $comment ) {
- // if (!($comment_author_url = $comment['comment_author_url'])) return;
- // if (strpos($comment_author_url, '//')) $comment_author_url = substr($comment_author_url, strpos($comment_author_url, '//') + 2);
- // if (strpos($comment_author_url, '/')) $comment_author_url = substr($comment_author_url, 0, strpos($comment_author_url, '/'));
- // update_option('blacklist_keys', $comment_author_url . "n" . get_option('blacklist_keys'));
- // }
- }
- $anti_spam = new anti_spam();
- // -- END ----------------------------------------
为了更彻底地防止spam,按Willin Kan的说法,同时将WP程序根目录中的wp-comments-post.php 文件更名,貌似机器发spam,会直接读取此文件,而不用填写表单,而主题集成了ajax评论特效,正常评论读取的是主题中的comments-ajax.php文件。