リンクのURL、そのまま出してない?WordPressの esc_url()

WordPressのesc_url()をイメージしたURL欄とリンク、チェック付きの盾のイラスト

WordPressのテーマでリンクを作るとき、取得したURLをそのまま echo していませんか? ひと手間ですが、HTMLに出力する直前に esc_url() を通す習慣をつけておくと、コードの確認もしやすくなります。

URLをHTMLに出すときのひと手間

esc_url() は、URLをHTMLに表示するために整えるWordPressの関数です。不適切な文字を取り除き、表示用の & などをエスケープします。許可されていないプロトコルのURLは、空文字になります。

よく使うのは、リンクの href や画像の src に、PHPで取得したURLを入れる場面です。「URLを出力する場所には esc_url()」と覚えておくと迷いにくいですね。

たとえば、トップページへのリンク

テーマのPHPテンプレートなら、こんな書き方ができます。

<?php $top_url = home_url( '/' ); ?>
<a href="<?php echo esc_url( $top_url ); ?>">トップページへ</a>

home_url( '/' ) でトップページのURLを取得し、href に出す直前に esc_url() を通しています。これはWordPressが動いているPHPテンプレート用のコードです。記事のカスタムHTMLブロックに貼っても、PHPは実行されません。

出力直前に使うのがポイント

テーマ内でURLを組み立てたり、カスタムフィールドからリンク先を取得したりするときにも役立ちます。取得した段階で処理を済ませるより、最終的にHTMLへ出力する場所でエスケープすると、「ここは処理済み」とひと目で分かります。

URLがHTMLの属性に入る場合でも、使うのはURL向けの esc_url() です。さらに esc_attr() で囲む必要はありません。リンクの表示文言まで動的にする場合は、その文字列には別途 esc_html() など、出力先に合った処理を使います。

リンク先の確認までしてくれるわけではない

esc_url() は、リンク先が実在するか、信頼できるサイトかを確認する関数ではありません。入力されたURLが空になった場合は、リンクを表示しないなどの扱いも考えておきましょう。

また、データベースへ保存するためのURL処理とは用途が違います。保存時は sanitize_url() などを検討し、HTMLに出すときは esc_url() を使います。まずはテンプレートの href を見直すところから、取り入れてみてください。

参考:WordPress公式:esc_url() / WordPress公式:Escaping Data