WordPressでエスケープ処理をするときの書き方についてまとめていきます。
WordPressのテーマでechoを使って文字列を出力する場合、セキュリティの関係上サニタイズ(無害化)してから出力する必要があります。さらに、ブラウザが予期しない動作(不正なHTMLやスクリプトを実行)をしないように適切な文字列に変換する必要があり、この処理のことをエスケープ処理と言います。
エスケープ処理
WordPressでエスケープ処理をする関数は複数ありますが、テーマを自作する際に必要になってくるのは主に以下の3つです。
- esc_url(URLのエスケープ)
- esc_attr(HTML属性のエスケープ)
- esc_html (文字のエスケープ)
esc_url(URLのエスケープ)
出力するコードがURLの場合は、esc_url
を使用してエスケープ処理をします。
esc_url( $url )
- パラメータ
-
- $url(文字列):(必須)エスケープするURL
- $protocols(文字列 配列):(オプション)使用可能なプロトコルの配列。(初期値:null)
- $_context(文字列 ):(オプション)URLをどのように使用するか。(初期値:'display')
- 戻り値
-
- 'clean_url'フィルタが適用された後の無害化されたURL。もし$urlが$protocols以外のプロトコルを指定した場合、あるいは$urlが空文字列を含んでいる場合は、空文字列が返されます。
<!-- トップページへのリンク -->
<a href="<?php echo esc_url( home_url( '/' ) ); ?>">ホーム</a>
<!-- Aboutページへのリンク -->
<a href="<?php echo esc_url( home_url( '/about/' ) ); ?>">About</a>
因みに、home_url
はWordPressの管理画面「設定」→「一般」内にある「サイトアドレス (URL)」の値を返す関数です。なので、サイトアドレス(URL)が「http://example.com」と設定されている場合は下記のように出力されます。
<a href="http://example.com">ホーム</a>
<a href="http://example.com/about/">About</a>
画像のパスを指定する場合は下記のようにします。
<!-- テーマディレクトリ内の画像 -->
<img src="<?php echo esc_url( get_template_directory_uri() . '/assets/images/sample.jpg' ); ?>" alt="">
get_template_directory_uri()
はテーマのディレクトリURIを取得します。末尾にスラッシュ( / )は含まれません。
esc_attr(HTML属性のエスケープ)
出力するコードがHTML要素の属性(class、alt、value、 title、etc.)の場合は、esc_attr
を使用してエスケープ処理をします。
ただし、出力したいコードがURLの場合は、esc_url()を使用してエスケープ処理をしましょう。
esc_attr( $text )
- パラメータ
-
- $text(文字列):(必須)エスケープする文字列
- 戻り値
-
- エスケープされた文字列
以下は出力時に $_POST データをエスケープする例です。
esc_attr()
で属性値を出力する場合は、必ず引用符(")で囲む必要があります。
<?php $name = ( isset( $_POST['name'] ) ) ? $_POST['name'] : ''; ?>
<input type="text" name="name" value="<?php echo esc_attr( $name ); ?>">
esc_html (文字列のエスケープ)
HTMLで使用される特殊文字(&、<、 >、 "、')を適切な文字列に変換させるにはesc_html
を使用してエスケープ処理をします。
esc_html( $text )
- パラメータ
-
- $text(文字列):(必須)エスケープする文字列
- 戻り値
-
- エスケープされた文字列
esc_htmlを使用して「A link」というリンクタグではなく、<a href="http://www.example.com/">A link</a>
という文字列として出力してみます。
<?php
$html = esc_html( '<a href="http://www.example.com/">A link</a>' );
echo $html;
?>
出力結果
<a href="http://www.example.com/">A link</a>
「<、"」などが全て「文字参照」に置換されて出力されます。