カテゴリー
WordPressカスタマイズ

WordPress でファイルの有無を判定する!

WordPress でファイルの存在によって条件分岐はできるでしょうか?
イエス!ファイルの有無は WordPress ではなく、PHP のfile_exists()関数で判定できます。
例えばこんな具合です。

<?php
if (file_exists('sample.php'){
  echo 'ファイルはあります';
} else {
  echo 'ファイルはありません';
}
?>

WordPress ルートにsample.phpが存在する場合、テーマのheader.phpなどで実行すると、条件分岐できます。
もちろん、file_exists()はフォルダでも存在チェックは可能です。
そして、以下のようにファイル名を変数とすることもできます。

<?php
$filename = get_template_directory().'/sample.php';
if (file_exists($filename)) {
  echo 'ファイルはあります';
} else {
  echo 'ファイルはありません';
}
?>

ここでは WordPress に特化した形として、テーマ内のファイルを指定しています。
このfile_exists()はファイルシステム上のパスでファイルの存在を調べます。
テーマ内のファイルを調べるために WordPress 側の関数を使っていますが、URL を返すget_template_directory_uri()でなく、ファイルシステム上でのパスを取得するget_template_directory()を使うことに留意ください。

ケーススタディ

例として、子テーマを使用している場合に親子どちらのフォルダからファイルを読み込むかをファイルの存在によって条件分岐してみます。

<?php
$filename = get_stylesheet_directory().'/sample.php';
if (file_exists($filename)) {
  include get_stylesheet_directory().'/sample.php';
} else {
  include get_template_directory().'/sample.php';
}
?>

通常、WordPress で PHP ファイルをテンプレートとして読み込む場合はget_template_part()を使います。
このとき、子テーマで実行しても親テーマのファイルを読み込みます。
これはinclude get_template_directory()としても、同じ挙動となります。

対して、include get_stylesheet_directory()では、アクティブなテーマ、子テーマを使用していれば、そちらのテーマフォルダを参照します。
ただし、子テーマ側にファイルが存在しない場合は Warning が生じます。
そこで、子テーマ側ファイルの存在をfile_exists()で確認して、処理を分けています。

補足

get_template_directory_uri()get_template_directory()の違いについて少し補足しておきます。
前者は URL、後者はシステムのファイルパスを返すと解説しましたが、それぞれが実際に取得するパスは下記のようになります。

get_template_directory_uri()
https://example.com/wp-content/themes/enoughone-mu/
get_template_directory()
/home/example.com/public_html/wp-content/themes/enoughone-mu/

get_stylesheet_directory_uri()get_stylesheet_directory()の挙動も同様です。

profile image

執筆:R3098

WEB サービス構築・監修が生業です。WordPress 関連では Aurora Heatmap などのプラグイン開発も行っています。悩めるサイト運営者の力になります!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトは reCAPTCHA によって保護されており、Google のプライバシーポリシー および 利用規約 に適用されます。

reCaptcha の認証期間が終了しました。ページを再読み込みしてください。