WordPressに限らずブログサービスなどで投稿したものに対してコメントなどで反応があると、公開してよかった!また誰かの役に立つコンテンツ作ろう!と励みになりますね(と言ってもこのサイトは寂しい限りですが..)。
でもそこで問題となるのがスパムコメント。日本語サイトだと海外のものが目立つようにも感じますが、実はそうでもなかったりして、日本語でもその投稿と何の関連性もないコメントがあったりします。
WordPressでは、標準の機能として以下のようなコメントスパム対策が備わっているのはご存じかと思います。
- 登録してログインしたユーザーからのみコメントを受け付ける
- コメントはすべて一旦承認待ちにし、手動で公開するようにする
- すべてのコメントを一旦承認待ちにする(逆に一旦承認した人からのコメントは次回からすぐに公開するようにする)
- 〇個のURLまたはリンクが本文内にあるコメントは承認待ちにする
- コメントの内容、投稿者名、URL、メールアドレス、IP アドレス、ブラウザーのユーザーエージェントに以下の単語のうちいずれかでも含んでいる場合には承認待ちにする
- コメントの内容、投稿者名、URL、メールアドレス、IP アドレス、ブラウザーのユーザーエージェントに以下の単語のうちいずれかが含まれている場合、そのコメントはゴミ箱に入れる
一見すると結構なバリデーション(検証)がされているようにも思うのですが、結局は承認待ちになるかゴミ箱行きになるかということになり、一度は目にしなければならないし、削除するという作業も必要になります。
本ページで紹介するコードは、この中の「〇個のURLまたはリンクが本文内にあるコメントは承認待ちにする」機能を変更して、1つでも本文内にURLが入っていたり、リンクが入っていたりするものは、コメント送信者には普通にコメントが送信できたような体にした上で、管理側では見ることなく完全に破棄するというものです。
経験則として、国内外に関わらず、何かの宣伝をしたいという目的で相談めいた内容やべた褒めしつつこのサイト見てね調のものがスパムのほとんどだと思うので、簡単なコードで実装できるのでぜひやってみてください。
以下のコードを有効化しているテーマのfunctions.phpへ追加するだけで機能します。
/* 1つでもURLやリンクが挿入されているコメントは完全破棄する */
function pwcn_auto_delete_with_url_comments( $commentdata ){
$content = $commentdata['comment_content'];
// URL(http/https)または <a>タグが含まれているかチェック
if ( preg_match( '/https?:\/\//i', $content ) || preg_match( '/<a\s/i', $content ) ) {
// Ajaxリクエスト(wp-admin/admin-ajax.php)経由の場合
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
// WordPress標準のAjaxコメント投稿成功時のレスポンスを模倣
// これにより、ブラウザ側には「承認待ちプレビュー」が表示される
$message = 'コメントありがとうございます');
wp_send_json_success([
'comment_html' => '<article class="comment-body"><p>'.esc_html( $message ).'</p></article>',
'message' => 'Success'
]);
exit;
}
// 通常のPOST送信(JavaScriptオフなど)の場合のフォールバック
// 元の記事ページにリダイレクトさせ、クエリパラメータ等で成功を装うことも可能
wp_safe_redirect( wp_get_referer() );
exit;
}
return $commentdata;
}
add_filter('preprocess_comment','pwcn_auto_delete_with_url_comments' ,1);
/* コメントフォームの下へ無視する旨を表示する */
function pwcn_add_message_for_comment_auto_delete_with_url() {
$message = 'リンクやURLが含まれたコメントは無視されます';
echo '<p>'.esc_html( $message ).'</p>';
}
add_action( 'comment_form_after_fields', 'pwcn_add_message_for_comment_auto_delete_with_url' );
add_action( 'comment_form_logged_in_after', 'pwcn_add_message_for_comment_auto_delete_with_url' );
結構簡単なコードで実装できますね。
コードの前半はコメントが送信される時にリンクやURLがないかを検証して、含まれていなければ通常動作を、含まれていれば送信が完了した体にしてそのページを再表示するというものです。
後半のコードは、一応URLやリンクがあったら無視(破棄)しちゃうぞというのを、送信ボタンの上に表示させるためのものです。
先ほども書きましたがこの措置で一番有用な点は、リンクやURLを入れることが多いスパムコメントを一切見なくて済むということです。承認待ちにもならず、ゴミ箱に格納されることもありませんから、データベースを汚すこともありません。
最後に余談として、このコードを作る前は「Throws SPAM Away」というプラグインを必ず入れていたんです。
このプラグインは本当に有用で、いろいろな条件を追加してその条件に合ったものはすべて破棄してくれ、さらにどれだけの効果があったかの分析もできるという本当に優れたありがたいプラグインです。
そんな中私のわがままで申し訳ないのですが、このサイトのように一部のコンテンツをカスタム投稿タイプを使って英語ページとして公開している場合に英語ページ側ではコメントが一切受け付けられない、かといって日本語のページに来る英語のスパムコメントも対処したいという両立ができないのが難点だったのと、英語のコメントの中には本当に純粋にコメントしてくれる人もいて、無碍に破棄するのも..となり、どうにかならないものかといろいろ検証してたどり着いたのが今回の措置でした。
もしも本当に日本語のみのサイトで、日本語を使う人以外からのコメントを見ないで削除したいということであれば、恐らく「Throws SPAM Away」以上のものはないと思いますので、本ページのコードを使うか、プラグインを使うかを判断してもらえたらと思います。












コメントを残す