by WebSurfer
17. June 2011 22:48
スパムコメントはいかなる場合も一般閲覧者の目に触れないようにしたいというのが普通だと思います。
しかしながら、バージョン 2.0 ではコントロールパネルで「コメント確認後に公開」にチェックを入れておかないと、自動モデレーションでスパムに分類されたコメントを含め、すべてのコメントが公開されてしまいます。
また、管理者が閲覧した場合は、スパムを含めてすべてのコメントが表示されますが、同じスパムコメントが 2 回づつ表示されてしまうという不具合があります。
上記の不具合を解消して、コメントの表示が期待通りになるよう、User controls/CommentView.ascx.cs の OnLoad メソッドの一部を以下のように変更しました。
if (this.NestingSupported)
{
// コメントをネストして表示するオプションを選ぶと以下が
// 実行される。その場合は、期待通り、スパムに分類された
// コメントは一般閲覧者には表示されないし、管理者に対し
// て同じスパムが 2 回表示されるということもない。
if (this.Post != null)
{
this.AddNestedComments(
path,
this.Post.NestedComments,
this.phComments,
canViewUnpublishedPosts);
}
}
else
{
// コメントをネストして表示しない場合は以下が実行される。
// その場合「コメント確認後に公開」にチェックしないと:
// 1) 一般閲覧者にスパムコメントが表示されてしまう。
// 2) 管理者にはスパムコメントが 2 回表示されてしまう。
//foreach (var comment in
// this.Post.Comments.Where(
// comment => comment.Email != "pingback" &&
// comment.Email != "trackback"))
//{
// if (comment.IsApproved)
// {
// this.CommentCounter++;
// }
// if (!comment.IsApproved &&
// BlogSettings.Instance.EnableCommentsModeration)
// {
// continue;
// }
// var control = (CommentViewBase)this.LoadControl(path);
// control.Comment = comment;
// control.Post = this.Post;
// this.phComments.Controls.Add(control);
//}
// Add unapproved comments
//if (canViewUnpublishedPosts)
//{
// foreach (var comment in this.Post.Comments)
// {
// if (comment.Email == "pingback" ||
// comment.Email == "trackback")
// {
// continue;
// }
// if (comment.IsApproved)
// {
// continue;
// }
// var control = (CommentViewBase)this.LoadControl(path);
// control.Comment = comment;
// control.Post = this.Post;
// this.phComments.Controls.Add(control);
// }
//}
// AddNestedComments と同じ内容(再帰呼び出しを除く)とすれ
// ば期待した結果となる。
foreach (Comment comment in this.Post.Comments)
{
if ((!comment.IsApproved &&
BlogSettings.Instance.EnableCommentsModeration) &&
(comment.IsApproved || !canViewUnpublishedPosts))
{
continue;
}
if (comment.IsSpam && !canViewUnpublishedPosts)
{
continue;
}
if (comment.Email == "pingback" ||
comment.Email == "trackback")
{
continue;
}
var control = (CommentViewBase)this.LoadControl(path);
control.Comment = comment;
control.Post = this.Post;
this.phComments.Controls.Add(control);
if (comment.IsApproved)
{
this.CommentCounter++;
}
}
}