WordPressの特定の入力欄で使える「HTML要素や属性」を制限する方法

WordPressの管理画面から「Web制作」というカテゴリーを作ったとします。

その「Web制作」のカテゴリーページには「看板となる画像」を表示する目的で、下の画像のような独自の入力欄を作ったとします。

wordpress_allow_html_input_area01

この入力欄は画像のURLを入力するために、HTMLのimg要素やsrc,alt属性などを使って「ある程度柔軟に入力できるように」しています。

必要なHTML要素や属性だけ使えるようにしよう

ところで、画像を表示するために必要なHTML要素や属性以外は、何でもかんでも入力できる状態にしておかなくてもいいので「特定のHTML要素や属性以外は使えないように制限」しました。

ちなみにですが「使えるHTML要素や属性を制限」することによって、タグの閉じ忘れによる「Webサイトの表示崩れ」や「非推奨となってしまったHTML要素や属性の利用」をある程度防ぐこともできると思います。

というわけで、以上が前提です。

以下に「使えるHTML要素や属性を制限」方法を書きましたので、機会がありましたらご参考ください。

WordPressの特定の入力欄で使える「HTML要素や属性」を制限する方法

WordPressで用意されている「wp_kses」を使うとできますので、利用します。

コードの基本形

wp_kses( $string, $allowed_html, $allowed_protocols );

使えるパラメーター

$string文字列
$allowed_html使用を許可するHTML要素や属性
$allowed_protocols(オプション)使用を許可するプロトコル

「特定の文字列に対して許可するHTML要素や属性、プロトコルを指定する」というシンプルな仕組みですね。

コードの書き方と使えるパラメーターを確認したところで、さっそく準備をしましょう。まずは「使用を許可するHTML要素や属性を指定」します。

使用を許可するHTML要素や属性を指定しよう

今回は例として、画像の表示に関係のある要素や属性をピックアップしました。

変数「$allowed_html」を用意して、img要素を使えるようにします。

img要素を使えるようにする

$allowed_html = array(
 'img' => array()
);

次は、img要素に関連するsrc,srcset,alt,titleなどの属性を使えるようにします。

img要素に関連する属性を使えるようにする

$allowed_html = array(
 'img' => array(
  'src' => array(),
  'srcset' => array(),
  'alt' => array(),
  'title' => array()
 )
);

という感じで、上記のコードのように使いたいHTML要素や属性を指定すればOKです。

他の要素も使えるようにしたい場合はこうする

今回は画像に関連するHTML要素や属性を例にしましたが、他にも使いたい要素があれば、同じように追加します。下の例ではp要素を追加しました。

$allowed_html = array(
 'img' => array(
  'src' => array(),
  'srcset' => array(),
  'alt' => array(),
  'title' => array()
 ),
 'p' => array()
);

という感じで「使用を許可するHTML要素や属性を指定」できたら「wp_kses」を使ってみましょう。

「wp_kses」を使って使えるHTML要素や属性を制限しよう

以下のコードでは「allowed_html_term_meta」という関数を作って、文字列「$string」に対して使用を許可するHTML要素や属性を指定して、結果を返しています。

//term_metaで使えるHTML要素や属性を指定
function allowed_html_term_meta( $string ) {
 $allowed_html = array(
  'img' => array(
   'src' => array(),
   'srcset' => array(),
   'alt' => array(),
   'title' => array()
  )
 );
 return wp_kses( $string, $allowed_html );
}

上記のような感じで使えばいいですね。なんとなくわかりにくいな・・・と思うかもしれません(私がそうでした)が、何度かやってみると感覚がつかめると思います。

おまけ:投稿で使えるHTML要素や属性を利用して指定もできるよ

「いちいち指定するHTML要素や属性を考えるのは手間だ・・・」という場合は「wp_kses_allowed_html」を使ってパラメーターに「post」を指定すると、投稿で使えるHTMLの要素や属性を取得できます。

$allowed_html = wp_kses_allowed_html( 'post' );

この値をそのまま利用して設定してもいいですね。「この入力欄は投稿と同じようにHTML使えるよ」という感じで説明もできます。

まとめ

今回あげた例のように、特定の入力欄を「どんな方が」「どう入力するのか」わからない場合や「不必要にHTMLを使えるようにしなくてもいい」という場合には使える方法だと思います。

著者:bouya Imamura