【Drupal】Spamコメントがコメント数に含められてしまってファッカブル

Submitted by yao on Fri, 2005/03/04 - 01:34.

各ノード(エントリ)の下のほうにコメントの数が表示されていますが、これにSpamフィルターにひっかかったコメントの数まで含まれていてむかついたので直しました。
それ以前に5分に一度スパムが来るのがむかついて仕方ありません。

どうやら原因は、

  1. コメント数はcommentsテーブルを直接数えてるのではなく、node_comments_statisticsテーブルのcomment_countフィールドを見ている
  2. comment_countフィールドにはcommentsテーブルを数えた値が入っている
  3. Spamフィルターはcomment_countが更新された後に呼び出される(っぽい)

ということのようでした。つまりSpamフィルターが横槍を入れるタイミングがよろしくなかったと。

改修の方向性はいくつか考えられますが、単純に上記2.のときにspam_commentsテーブルも見るようにしました。

node_comments_statisticsをupdateしているのは、comment.moduleの_comment_update_node_statistics()という関数です。
この中にSQL文が書いてあるので、それを直しました。

旧:
$count = db_result(db_query('SELECT COUNT(cid) FROM {comments} WHERE nid = %d AND status = 0', $nid));

新:
$count = db_result(db_query('SELECT COUNT(comments.cid) FROM comments LEFT JOIN spam_comments USING(cid) WHERE nid = %d AND status = 0 AND spam = 0', $nid));

おしまい。
このままではDBは更新されないので、各ノードごとにコメントを更新したり削除してDBを正しい状態(Spamを除いた状態)にしなきゃいけません。
まぁ5分に1回スパムがやってくるので、ほっとけばそのうち正しくなるに違いない!
スパマーガンガレ。超ガンガレ。