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()
の挙動も同様です。