WordPressでfile_existsがうまく判定出来なかった件 (追記あり)

WordPressのテーマを自分でカスタマイズしているのですが、テーマフォルダの中のimagesフォルダに指定したファイル名のファイルがあった時には、その画像を表示し、無かった時は別の画像を表示したいと思いました。

最初に書いたソースは下記のとおり

$stylesheet_directory_url = get_stylesheet_directory_uri();
$check_model_thumbnail_url = $stylesheet_directory_url.'/images/model/'.$brand.'_'.$model.'.jpg';

if ( file_exists ($check_model_thumbnail_url)) :

	$model_thumbnail_url = $check_model_thumbnail_url;
	echo 'YES';
else :
	echo 'NO';
endif;

でも、なぜかうまくいきません。

指定したファイルはあるはずなのに、file_existsではfalseを返すようです。

で、ぐぐったところ見つけたのが下記のページ。

WordPress › Support » PHP file_exists function won’t work

まさに自分と同じケースです。

結論としては、stylesheet_directory_url()で取得したurlを利用するのではなく、dirname(__FILE__)を使うと良いようです。

2015/11/14追記

と、ここまでの状態で記事を公開したところまがぞん(@jim0912)さんからコメントをいただきました。(むかしはまがりんと呼ばれていたけど、いつの間にかかわったようです)

dirname(__FILE__) だと、テンプレートファイルが、ディレクトリ内にある場合に失敗します。
get_stylesheet_directory を使う方が適当だと思いますし、子テーマのことを考えるのであれば、get_template_directory の方が、より適切です。

さらに、この手の問題は、やらかす人が多いので、なぜ URLを指定するとダメなのかなども記述いただけると見る人のためになりますね。

ということで、URLではなくテンプレートファイルのディレクトリを取得する get_template_directory()を使用することにしました。

ちなみに、まがぞんさんの指摘されている、「なぜ URLを指定するとダメなのか?」についての私なりの見解は、

URL → 外部サイトのファイルも取得できる
ディレクトリ → 自分のサーバーのファイルしか取得できない

という違いで、外部サイトのファイルを取得できるということは、危険なファイルでも取得できるので、自分の意図しないファイルを読み込んでしまう可能性があるから、利用するときのセキュリティのレベルが変わってくる。という理由かな?

ということで、コードはこんな風に変更し、無事に機能するようになりました。

$stylesheet_directory_path = get_stylesheet_directory();
$check_model_thumbnail_file = $stylesheet_directory_path.'/images/model/'.$brand.'_'.$model.'.jpg';

if ( file_exists ($check_model_thumbnail_file)) :

	$model_thumbnail_file = $check_model_thumbnail_file;
	echo 'YES';
else :
	echo 'NO';
endif;