【ワードプレス】リンク等コメント欄で使えるhtmlタグを全て無効化

製作 プログラム

2016/09/15(木)

ワードプレスのコメント欄では一部のHTMLタグが使える

ワードプレスのコメント欄ではaタグやciteタグなど一部のhtmlタグが使用できます。例えばaタグが有効だと、悪い人によって有害なサイトへのリンクを勝手に張られてしまったりと、サイトの管理が難しくなってしまいますよね。

なら最初からコメント欄ではHTMLタグを使えないようにすればいいじゃない!ということでそのやり方を紹介します。特にお店などのきちんとしないといけないサイトでは必要なコトなので参考にしてみてください。

今回紹介するコメント欄のHTMLタグを無効化する方法を使うと、もしコメント欄にタグを記述した方がいた場合、コメントからタグをだけ(<a>とか</a>とか)を全て削除します。またプラグイン不要です。

コメント欄のタグを無効化:もくじ

  1. プラグイン不要!フックを使ってコメント欄タグを無効化
  2. リンク等のHTMLタグを無効化するソースコードの説明
  3. preprocess_commentフック
  4. make_clickableでオートリンク機能も無効に
  5. 応用:HTMLタグを部分的に無効化する方法
  6. 応用:コメントで使用できるHTMLタグを追加する

プラグイン不要!フックを使ってコメント欄タグを無効化

下記のソースコードをfunctions.phpの中にコピペして追加してください。たったコレだけでコメント欄で入力できるHTMLタグ全てが無効化されます。たとえHTMLタグをコメント入力フォームに入力した人がいても、コメントからタグだけを全て削除します。

functions.php


function my_comment_tag_disable($data) {
	global $allowedtags;
	$allowedtags = array();
	return $data;
}
add_filter('preprocess_comment', 'my_comment_tag_disable');
remove_filter('comment_text', 'make_clickable', 9);

リンク等のHTMLタグを無効化するソースコードの説明

ココから下はソースコードの意味が知りたい人だけお読みくださいね。

$allowedtagsというグローバル変数にはaやciteなどのHTMLタグが配列で格納されています。ここに格納されているHTMLタグがコメント欄で使用できるタグとなります。配列$allowedtagsからタグを消すと使えなくなって、$allowedtagsにタグを追加するとそのタグがコメント欄で使えるようになる、カンタンですね!

そんな配列$allowedtagsの中身を3行目で空配列に置き換えています。これで全てのHTMLタグが無効になりますね。

preprocess_commentフック

ココで少し使用しているフックの話をしておきますね。知らなくてもコードは動くので読み飛ばしてもらって構いません。気になる方だけ読んでみてくださいね。

preprocess_commentフックはコメントを新規保存しようとした場合に呼ばれるフックです。よく紹介されているcomments_openフックを使う方法でもHTMLタグの無効化は出来ていたのですが、呼び出されるタイミングが多く、一度のコメント保存処理の中で何度も呼ばれていました。

何度も何度も同じ関数を呼んでもただサイトが重くなるだけなので、今回は新規保存の際一回だけ呼ばれるpreprocess_commentフックを使用しました。

$allowedtagsがタグを無効化するタイミング

ワードプレスの内部では、かなりおおざっぱですがこんな風にコメントのデータが処理されていきます。例えばpre_comment_approvedフックで$allowedtagsをいじっても、すでに$allowedtagsを用いたコメントのタグチェックは終わっているので意味がなくなっちゃいますね。

書き込みボタンをクリック
wp-comments-post.php
wp_new_comment()
preprocess_comment
wp_filter_comment()
pre_comment_content
このpre_comment_contentに内部でフックされた関数が$allowedtagsと入力されたコメントとを比較。$allowedtagsに含まれていないタグを削除する。
pre_comment_approved
コメントをデータベースに保存

make_clickableでオートリンク機能も無効に

先ほどのコードの一番最後の行で出てくるmake_clickable。これは何をしているのでしょうか。

ワードプレスにはコメント欄に入力された文字列がURL(http://google.comみたいな)だった場合、それに自動でaタグを付加するオートリンク機能というものがあります。このオートリンク機能はプログラム上だとmake_clickableという名前。

いくらHTMLタグの入力を無効にしていてもただURLを記述するだけでリンクになってしまうなら、結局悪い人に変なサイトへのリンクを張られてしまいます。なのでこのmake_clickableも働かないようにしておくのがオススメです。

応用:HTMLタグを部分的に無効化する方法

例えばコメントにリンク張られるのだけはイヤだからaタグを無効化したい、さらに引用タグも無効化したい、そんな風に一部のタグだけ無効化する応用テクニックを紹介します。先ほどのソースコードを以下のようにします。

空配列を代入するのではなく、phpのunset関数を使って$allowedtagsからaタグとblockquoteタグだけ削除しています。$allowedtagsに格納されてるHTMLタグだけがコメント欄で使用できるということでしたので、$allowedtagsからタグを消してあげることでそのタグだけを無効化することができます。

functions.php


function my_comment_tag_disable($data) {
	global $allowedtags;
	unset($allowedtags['a']);
	unset($allowedtags['blockquote']);
	return $data;
}
add_filter('preprocess_comment', 'my_comment_tag_disable');
remove_filter('comment_text', 'make_clickable', 9);
allowedtagsで無効化できるタグ一覧

コメント欄で有効なHTMLタグ一覧です。例えばstrongを無効化したい場合は、unset($allowedtags[‘strong’]);としてください。

  • a
  • abbr
  • acronym
  • b
  • blockquote
  • cite
  • code
  • del
  • em
  • i
  • q
  • s
  • strike
  • strong
unset関数

unset()はphpの関数で、配列から特定の要素だけ削除することができます。

応用:コメントで使用できるHTMLタグを追加する

応用ワザの二つ目として逆にコメントで使用できるHTMLタグを増やす方法も紹介しておきますね。以下のように書きます。

実際に使うかは置いておいてこのコードでh1タグが使用可能になります。結局、グローバル変数$allowedtagsに含まれているタグならコメント欄で使用できるというシンプルな仕組みになっています。

functions.php


function my_comment_tag_disable($data) {
	global $allowedtags;
	$allowedtags['h1'] = array();
	return $data;
}
add_filter('preprocess_comment', 'my_comment_tag_disable');

コメント欄で使用できるHTMLタグの無効化

今回はaタグなどワードプレスのコメント欄で使うことのできるHTMLタグを無効化する方法について紹介しました。

特にリンク(aタグ)を有効にしていると、危ないサイトへのリンクを張られてしまうことにもなりますので注意が必要です。参考にしてみてくださいね。