コメントのHTMLを無効にする

デフォルトのWordPressはコメントに一部のhtmlタグの利用が許可されています。
許可されていないタグについては無効化されるようになっていますが、許可されたタグの閉じ忘れの補完まではしてくれません。
なので、</div>とか書かれてしまうと困ったことになってしまいます。

なので、いっそのことhtmlは許可しなければいいじゃん!ということで、カスタマイズを行いました。
今回もfunction.phpに以下のコードをコピペしてもらえばOKです。
htmlを取り除くのではなく、コメントの表示時にhtmlspecialchars()を利用して無効化しています。

function escape_tags( $comment_content ) {
    if ( get_comment_type() == 'comment' ) {
        $comment_content = htmlspecialchars($comment_content, ENT_QUOTES);
    }
    return $comment_content;
}
add_filter( 'comment_text',     'escape_tags', 9);
add_filter( 'comment_text_rss', 'escape_tags', 9);
add_filter( 'comment_excerpt',  'escape_tags', 9);

ちなみにトラックバック / ピンバックの場合は無効化をしないよう(2行目の条件式で)制御しています。
もともとトラックバックの本文は、<strong>タグ内にトラックバック元のページのタイトルが入り、そのあとに続いて該当エントリの要約がタグを取り除かれた状態で入っているためです。

コメントのhtmlの無効化を行うタイミングとしては2パターン考えられました。

  1. コメント投稿時に無効化を行う
  2. コメント表示時に無効化を行う

今回は2番目のコメントの表示時に無効化をする方法を選択しました。
これは、無効化した後に再度有効化をする可能性がゼロではないため、投稿時はデフォルトの処理のみを行うようにしています。
(負荷的には投稿時のほうがいいのかもしれませんが。。)

コメント中のURL, e-mailへの自動リンクは有効のままになっています。
この自動リンクも無効にしたい場合はさらに以下の1行を追加してください。

remove_filter( 'comment_text', 'make_clickable');

2017/01/13 追記

許可されないタグを取り除くライブラリ(ksesライブラリ)を無効にする記事を書きました。