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