WordPressのテーマ制作で画像が表示されないときは、コードの間違いではなく「どの場所を基準にURLが決まるのか」を取り違えていることがあります。この記事では、絶対パス・ルート相対パス・相対パスの違いを整理し、静的サイトのHTML、外部CSSのurl()、WordPressのPHPテンプレートを同じフォルダ構成で比較します。
読み終えると、HTMLのsrcとCSSのurl()で基準が異なる理由、テーマ画像にget_theme_file_uri()を使う理由、子テーマで関数を使い分ける考え方が分かります。
読者静的サイトでは表示できた画像が、WordPressのPHPテンプレートでは表示されません。PHPファイルから見た相対パスではだめなのでしょうか?
木村ブラウザは、サーバー内にあるPHPファイルの場所を見ていません。PHPが出力したHTMLと、今開いているページのURLを見て画像の場所を判断します。
読者では、CSSのbackground-image: url(...)で相対パスが使えるのはなぜですか?
木村外部CSSでは、そのCSSファイルの場所を基準に相対URLが決まるからです。url()へ画像までの相対パスを書けば、ブラウザが必要なURLを判断して画像を読み込みます。
読者同じ相対パスでも、HTMLと外部CSSでは出発地点が違うということですね。
木村そのとおりです。この記事では出発地点を一つずつ図のように追い、WordPressで迷わない書き方まで確認します。
最初に知りたい3種類のパス
Web制作で「パス」と呼んでいるものは、ブラウザが画像やCSSなどへアクセスするためのURLまたはURLの一部です。まず、絶対URL、ルート相対URL、相対URLの違いを整理します。
絶対URLはhttpsからすべて書く
絶対URLは、通信方法、ドメイン、ファイルまでを省略せずに書く方法です。別のページや別サイトから見ても、参照先は変わりません。
<img src="https://example.com/wp-content/themes/my-theme/assets/images/photo.jpg" alt="サンプル画像">ルート相対URLは先頭をスラッシュにする
先頭が/のURLは、ドメイン直下を基準にします。短く書けますが、WordPressをサブディレクトリへ設置している場合や、テーマ名を変更した場合に合わなくなることがあります。
<img src="/wp-content/themes/my-theme/assets/images/photo.jpg" alt="サンプル画像">相対URLは現在地から移動する
./は同じ階層、../は一つ上の階層を表します。大切なのは、相対URLは必ず「どこを基準にするか」で結果が変わることです。
./images/photo.jpg 同じ階層にあるimagesへ進む
../images/photo.jpg 一つ上の階層へ戻ってimagesへ進む静的サイトで相対パスの基準を確認する
同じフォルダ構成を使い、HTMLと外部CSSで基準がどのように変わるかを確認します。ここを理解すると、WordPressで画像が見つからない理由も分かりやすくなります。
static-site/
├── index.html
├── css/
│ └── style.css
└── images/
└── photo.jpgHTMLのsrcは表示中のページURLが基準になる
index.htmlとimagesが同じ階層にあるため、HTMLでは次のように指定できます。ブラウザは、表示しているindex.htmlのURLを基準に画像を探します。
<img src="images/photo.jpg" alt="サンプル画像">外部CSSのurl()はCSSファイルが基準になる
style.cssはcssフォルダ内にあります。そのため、一つ上へ戻ってからimagesへ進みます。外部CSSの相対URLはCSSファイルの場所が基準です。
.hero {
background-image: url("../images/photo.jpg");
}インラインCSSはページURLを基準にする
HTML内の<style>やstyle属性へ書いた相対URLは、外部CSSファイルではなく、そのHTMLページのURLが基準です。同じCSSでも書く場所によって基準が変わる点に注意してください。
WordPressのPHPテンプレートで相対パスがずれる理由
WordPressでは、テーマ内のPHPファイルがHTMLを作り、ブラウザへ送ります。ブラウザからPHPファイルの保存場所は見えないため、テーマフォルダ内の位置を基準にsrcを解決することはできません。
wp-content/themes/my-theme/
├── front-page.php
└── assets/
├── css/
│ └── style.css
└── images/
└── photo.jpgブラウザはPHPファイルの位置を見ていない
たとえば表示中のページがhttps://example.com/about/のとき、次のHTMLを出力すると、ブラウザはhttps://example.com/about/assets/images/photo.jpgを探します。PHPテンプレートの場所ではなく、表示中のページURLが出発地点になるためです。
<img src="assets/images/photo.jpg" alt="サンプル画像">get_theme_file_uri()でテーマ画像のURLを取得する
テーマ内の画像をHTMLへ出力するときは、WordPressが用意しているURL取得関数を使います。通常は、子テーマの上書きにも対応できるget_theme_file_uri()を基本にすると分かりやすいです。
<img
src="<?php echo esc_url( get_theme_file_uri( 'assets/images/photo.jpg' ) ); ?>"
alt="サンプル画像"
>このコードは、テーマ内の対象ファイルを探し、ブラウザで使えるURLを返します。URLをHTML属性へ出力するときはesc_url()でエスケープします。
URLとサーバー内のファイルパスを分ける
<img src>やリンクにはURLが必要です。一方、PHPのrequireやfile_get_contents()でファイルを読む場合は、サーバー内のファイルパスが必要です。URIを返す関数とファイルパスを返す関数は用途が異なります。
// ブラウザへ出力するURL
$image_url = get_theme_file_uri( 'assets/images/photo.jpg' );
// PHPがサーバー内で読むファイルパス
$data_file = get_theme_file_path( 'assets/data/sample.json' );WordPressでもCSSのurl()は同じ考え方
WordPressだからCSSの相対URLが特別になるわけではありません。外部CSSがテーマ内のassets/css/style.cssとして読み込まれているなら、そのCSSファイルから画像までの位置を書きます。
CSSファイルから画像までの相対URLを書く
style.cssから一つ上のassetsへ戻り、imagesへ進むため、指定は../images/photo.jpgになります。
.hero {
background-image: url("../images/photo.jpg");
}学習するときは「url()に画像までの相対パスを書けば、外部CSSファイルの場所を基準に必要なURLが決まり、画像が表示される」と覚えておけば大丈夫です。
url()がテーマのルートを作るわけではない
url()は画像やフォントなどの参照先を書くCSS関数です。テーマ名やwp-contentを自動で調べるWordPress関数ではありません。ブラウザが、読み込んだCSSファイルのURLと../images/photo.jpgを組み合わせて参照先を判断します。
CSSファイルを移動したら相対URLも見直す
基準になるCSSファイルを別フォルダへ移動すると、画像との位置関係も変わります。CSSを整理・ビルドした後に背景画像だけ表示されない場合は、完成したCSSファイルのURLを確認してください。
テーマURL関数の使い分け
WordPressには似た名前の関数が複数あります。親テーマだけか、子テーマも含むのか、特定ファイルを探したいのかで使い分けます。
通常はget_theme_file_uri()を使う
get_theme_file_uri( 'assets/images/photo.jpg' )は、子テーマがある場合は子テーマ内のファイルを先に確認し、見つからなければ親テーマを使います。テーマファイルを子テーマで差し替えられる構成に向いています。
親テーマと子テーマを明確に指定する
| 関数 | 取得するURL | 主な用途 |
|---|---|---|
get_theme_file_uri() | 子テーマを確認後、必要に応じて親テーマ | テーマ内の特定ファイル |
get_stylesheet_directory_uri() | 現在有効なスタイルシート側。子テーマ使用時は子テーマ | 子テーマのディレクトリ |
get_template_directory_uri() | 親テーマ | 必ず親テーマにあるファイル |
テーマフォルダを直接書かない
/wp-content/themes/my-theme/を直接書くと、WordPressの設置場所、テーマ名、子テーマ構成が変わったときに修正が必要です。テーマ内の画像やスクリプトは、用途に合うWordPress関数からURLを取得してください。
公式仕様は、get_theme_file_uri()、get_stylesheet_directory_uri()、get_template_directory_uri()のコードリファレンスでも確認できます。
まとめ
- 絶対URLは参照先をすべて書き、相対URLは基準になる場所から参照先までを書く
- HTMLの相対URLは表示中のページURL、外部CSSの相対URLはCSSファイルのURLが基準になる
- WordPressのPHPテンプレート内に書くHTMLは、PHPファイルの保存場所を基準にしない
- テーマ内の画像URLは、基本として
get_theme_file_uri()で取得する url()はテーマのルートを生成するWordPress関数ではなく、CSSで参照先を示す関数である- ブラウザへ渡すURLと、PHPがサーバー内で使うファイルパスを分けて考える

MEMBER COMMENTS
コメント(0件)