コメントフォームのところ、こんなの表示されてますよね。
次の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", '‌<br />', htmlspecialchars($s, ENT_QUOTES));
}
return $s;
}
add_filter('comment_text', 'html_to_text', 9);
ENT_QUOTESはなくてもいいかもだけど、まあここは定型文という事でひとつ。
改行は、br要素の連続もpの区切りとして認識されてしまったので、nl2br()が使えない。そこでstr_replace()で「幅のない空白」‌を一緒に設置しながらbrを追加する事で、それを回避するようにしました。
あとはデフォルトのエスケープ系処理より先に置換させるため、優先度9を指定してadd_filter()してやります。
デフォルトのエスケープ処理みたいなのはどうやってremove_filter()するのかがよくわからなかった。まあ他にもnull削除とかやってるみたいだし、残しておいてもいいんじゃないかな。
注釈変更
最後にcomments.phpで、フォーム出力のところの注釈を変更。
<?php comment_form('comment_notes_after=タグは使えません。改行はそのまま表示されます。'); ?>
これでOK。
