コメントフォームのところ、こんなの表示されてますよね。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

これ以外のタグはすっぱり削除されてしまうんですが、例えばコメント欄でHTMLのコードについて議論した事もあるだろうし、削除じゃなくてエスケープして出力するようにしたいですね。(というか勝手に削るなよ、と言いたい。)

あと空行を見つけるとそこで区切って<p></p>にされるけど、これも改行は全部改行のまま出力したい。

要は概ね書いたまま表示するようにしたい、と。まあ空白くらいは詰めてもいいけど、普通の掲示板風の動きにしたいわけです。

フィルターで独自に置換

どうもフィルターを使う事でうまくやれるみたい。

というわけでfunctions.phpに追加。

function html_to_text($s) {
  if ( get_comment_type() == 'comment' ) {
    $s = str_replace("\r\n", '&zwnj;<br />', htmlspecialchars($s, ENT_QUOTES));
  }
  return $s;
}
add_filter('comment_text', 'html_to_text', 9);

ENT_QUOTESはなくてもいいかもだけど、まあここは定型文という事でひとつ。

改行は、br要素の連続もpの区切りとして認識されてしまったので、nl2br()が使えない。そこでstr_replace()で「幅のない空白」&zwnj;を一緒に設置しながらbrを追加する事で、それを回避するようにしました。

あとはデフォルトのエスケープ系処理より先に置換させるため、優先度9を指定してadd_filter()してやります。

デフォルトのエスケープ処理みたいなのはどうやってremove_filter()するのかがよくわからなかった。まあ他にもnull削除とかやってるみたいだし、残しておいてもいいんじゃないかな。

注釈変更

最後にcomments.phpで、フォーム出力のところの注釈を変更。

<?php comment_form('comment_notes_after=タグは使えません。改行はそのまま表示されます。'); ?>

これでOK。