WordPress Commentをちょっと工夫する

よくある話だとは思いますが、コメントスパムを大量に送りつけられて、困る事があります。


WordPressのコメントフォームは、ログインフォーム同様にシンプルで、特に投稿の、特定の、フォームからの入力でなければならない。といったチェックは行われていません。


このため、プラグインなどを使わないと、機械的にコメントを送る事が出来てしまうので、嫌がらせや、

自分自身で、削除するべきコメントが、間違って承認しちゃったなんて事も、おきてしまうかもしれません。


このような、徒労から、一抜けするために、スパムの多いブログに、コメントスパまーの皆さんの胸を借りて、「門前払い」のカスタマイズを試みてみました。


もちろん、強く門前払いをするつもりもありませんし、スパムの多いブログといっても、そのブログに限れば、それほど多くの人が、スパムを送ってきているとも考えずらいので、あくまで、「私のブログの場合」今のところうまくいきそうという条件がつきますが、


WordPressのhookというカスタマイズの機能を理解していれば、個別の環境での困りごとへの対応の役に立つかもしれないと思い、メモに残す事にしました


テーマのfunctions.phpに書くと動作します

<?php


	$nobita_unique = '諸行無常 是生滅法 生滅滅已 寂滅爲樂 なんか適当な、ありえない文章とかを書いておきましょう';

	$nobita_strech = date('h');//このあたりは、工夫してくださいね
	
	for( $i = 0; $i < $nobita_strech; $i++ ){
	 
		$nobita_unique = md5( $nobita_unique );
	}
	
	/* 
	適当すぎるかもしれないですが 一時間に一回ぐらいは、追加フィールドの値を変更して
	
	やっぱり、手作業で、フォームに入力する人やフォームをコピーする人も、いるみたいなんで、 
	
	*/
/*  2013/3/5 ログインしているとコメントできなくなるようだったので、変更 */
if( ! is_user_logged_in() ){
/* これが、アクションで、フォームで受け取った$_POSTを処理する前に処理を書く事が出来ます。*/
	add_action( 'pre_comment_on_post', 'nobita_comment_only_form');
/* これがフィルターというもので、フィールドを追加することが出来ます*/
	add_filter( 'comment_form_default_fields', 'nobita_add_comment_field' );
}



	
	function nobita_comment_only_form(){
/* ここから、こんな内容だったら、exitしちゃうよ という事を書きます*/	
		global $nobita_unique;
		if( isset($_POST) and 
			(!isset( $_POST['local_check'] ) or 
				( isset( $_POST['local_check'] ) and $_POST['local_check'] !== $nobita_unique ) 
			)
			/* 追加フィールドがない(リモートアクセス)や、あっても、フィールドの値が正しくない */ 
		){
			wp_die( 'Sorry a comment is unreceivable' );
		}
		
		if( isset($_POST['comment']) and
			/* コメントがあって*/
			strlen($_POST['comment'] ) == mb_strlen( $_POST['comment'],"UTF-8") and
			/* コメントが英文で */
			! preg_match('!\n!',$_POST['comment'] ) and
			/* 改行がなくて*/
			strlen($_POST['comment'] ) > 140
			/* 短いコメントでなかったら、門前払い*/
		 ){
			wp_die( 'Sorry comments language only Japanese' );
		}
		
		if( isset($_POST['comment']) ){
			/* コメントがあって*/
			preg_match_all("|http://|",$_POST['comment'], $urls, PREG_SET_ORDER);
			/* http://という文字列をカウントして、リンクっぽいものを数えて、多ければ、門前払い */
			
			if( count( $urls ) > 2 ){
				wp_die( 'Sorry 1 links per comments' );			
			}
			
		}
	}



	function nobita_add_comment_field( $fields ){
	
		global $nobita_unique;
	
		$fields[] = '<input type="hidden" name="local_check" value ="'. $nobita_unique. '" />';
		return $fields;
	}
?>

コピペで使う事は、お勧めしません。自分のブログをひいきしてくれるスパマーさんに合わせて、ご自身で工夫してくださいね。

TOP