スパム対策として標準で入っている重複コメントの規制を解除する方法を解説します。同じコメントを投稿すると『重複しているコメントが見つかりました。同じコメントをすでに投稿しているようです。』と表示されるやつです。
検索しても良い情報が見つからなかったのでまとめておきます。お役に立てれば嬉しいです。
回避するにはWordPressのコアファイルを直接編集するか、フィルターフックする方法があります。コアファイルの動作解説と、フィルターフックのコード例を紹介します。
comment.php wp_allow_commentの解説
/wp-includes/comment.php
function wp_allow_comment( $commentdata, $avoid_die = false ) {
global $wpdb;
// Simple duplicate check
// expected_slashed ($comment_post_ID, $comment_author, $comment_author_email, $comment_content)
$dupe = $wpdb->prepare(
"SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = %s AND comment_approved != 'trash' AND ( comment_author = %s ",
wp_unslash( $commentdata['comment_post_ID'] ),
wp_unslash( $commentdata['comment_parent'] ),
wp_unslash( $commentdata['comment_author'] )
);
if ( $commentdata['comment_author_email'] ) {
$dupe .= $wpdb->prepare(
"AND comment_author_email = %s ",
wp_unslash( $commentdata['comment_author_email'] )
);
}
$dupe .= $wpdb->prepare(
") AND comment_content = %s LIMIT 2",
wp_unslash( $commentdata['comment_content'] )
);
$dupe_id = $wpdb->get_var( $dupe );
//フィルターフックで利用できるフィルタ
$dupe_id = apply_filters( 'duplicate_comment_id', $dupe_id, $commentdata );
if ( $dupe_id ) {
do_action( 'comment_duplicate_trigger', $commentdata );
if ( true === $avoid_die ) {
return new WP_Error( 'comment_duplicate', __( 'Duplicate comment detected; it looks as though you’ve already said that!' ), 409 );
} else {
if ( wp_doing_ajax() ) {
die( __('Duplicate comment detected; it looks as though you’ve already said that!') );
}
wp_die( __( 'Duplicate comment detected; it looks as though you’ve already said that!' ), 409 );
}
}
$dupe:投稿されるコメントからクエリを生成しています。(string)
最終的にコメントID(comment_ID)を取得するようなクエリになっています。同じ記事の同じ内容のコメントで一番初めに投稿された物を取得しています。返信(親を持つ)を利用した入れ子の状態も区別しています。
$dupe_id:生成したクエリでDBに問い合わせて結果を受け取ります。該当するコメントIDが返ってきます。
duplicate_comment_id:フィルターフックで使えるフィルタ。引数を2つ持ち、$dupe_idと$commentdataを使えますが$commentdataは今回のコメントのデータなので扱いにくいです。
if ( $dupe_id ):重複があれば以降の処理を行います。以降の処理で重複投稿が弾かれます。今回はduplicate_comment_idにフィルターフックをして、規制を回避するNULLに変更して返すようにします。
解説した範囲のコアファイルを直接編集しても良いと思います。
フィルターフックで重複規制を10分間隔にする
function.phpに追加してください。
//重複コメントの規制を解除するフィルターフック
add_filter('duplicate_comment_id', 'my_duplicate', 10, 2 );
function my_duplicate($dupe_id,$comment_data){
global $wpdb;
$prevQuery = $wpdb->prepare(
"SELECT comment_date FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_content = %s ORDER BY comment_ID DESC LIMIT 1",
wp_unslash( $comment_data['comment_post_ID'] ),
wp_unslash( $comment_data['comment_content'] )
);
$prevTime = $wpdb->get_var($prevQuery);
$prevTime = strtotime($prevTime);
$current = current_time('timestamp');
$span = $current - $prevTime;
if($span > 600){ //600秒 = 10分
return;
}
return true;
}
$prevTime:直近の重複コメントの投稿時間を取得しています。
$current:現在の時間を取得してます。
環境によってDBと現在の時間の基準が違う場合があるので、機能しているか要確認です。投稿した時間と直近の重複コメントの投稿時間の差が600s、10分以上だった場合はNULLを返します。それ以下だった場合はTRUEを返して重複が弾かれるようにします。
時間規制なんてそもそも要らねえ!という方はこちらで
重複規制を完全に解除する
//重複コメントの規制を解除するフィルターフック
add_filter('duplicate_comment_id', 'my_duplicate', 10, 2 );
function my_duplicate($dupe_id,$comment_data){
return;
}
これで重複コメントを全て許可します。スパム対策が弱くなってしまうのでDB汚染などは別途対策を考えてください。
IPで選別するならコアファイルを直接弄ったほうがスマートに出来ると思います。初めのクエリにIPも入れるだけ。
> コメント0件!書き込みのチャンス! <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄