web-dev-qa-db-ja.com

テンプレートファイルでrequire()関数を使用できますか?

私のテンプレートファイルにはライブラリを含めたいのです。ライブラリを自分のテーマフォルダにアップロードしました。テーマフォルダの中にカスタムテンプレートファイルがあります。私のカスタムテンプレートファイルにはrequire 'OAuth2/Client.php';がありますが、そのテンプレートを使用するページを読み込むと、次のようになります。

Warning:require(OAuth2/Client.php):ストリームを開けませんでした:4行目の/home/healthf0/public_html/wp-content/themes/healthfitcorpwell/single-iframe.phpにそのようなファイルまたはディレクトリはありません

明らかにファイルは存在します、私はそれがFTPを通してそこに座っているのを見ることができます。それはなぜ私にこれを言っているのですか?

1
Alex

相対パスでファイルをrequireしているので、このエラーが発生しています。 @ Mark Kapulunがコメントで指摘しているように、ファイルをrequireingするときは相対パスを使用しないでください。代わりに、明示的になり、絶対パスを使用したいです。

get_template_directory() を使用して、

現在のテーマのディレクトリへの絶対パス(末尾のスラッシュなし)

テンプレートファイルでは、requireステートメントは次のようになります。

require( get_template_directory() . '/path/from/theme/root/to/file.php');

あなたが子供のテーマを作っているのであればget_stylesheet_directory()doc

更新:

@Jack Johanssonが彼の答えで述べたように、代わりにrequire_onceを使うことを検討するかもしれません。これにより、ファイルを複数含めることによって発生するエラーからあなたを保護できます。詳しくは この答え をご覧ください。

4
DaveLak

はい、ただし相対パスの使用は許可されていません。あなたは常に絶対パスが欲しいのです。これは次のようにして行うことができます。

<?php require( get_stylesheet_directory() . '/OAuth2/Client.php'); ?>

get_stylesheet_directory()は、テーマのstyle.cssがある場所の絶対パスを返します。ただし末尾の/は付けません。

1
Cedon

テンプレートのディレクトリへの絶対パスを取得するためにget_template_directory()を使うことができます。たとえば、phpファイルが/my-theme/OAuth2/Client.phpにある場合は、次のようにします。

require_once(get_template_directory().'/OAuth2/Client.php');

セキュリティ上の理由から、相対パスを使用したり、PHPファイルに直接アクセスしないでください。また、より安全にするために、client.phpファイルでこの条件を使用する必要があります。

if ( ! defined( 'ABSPATH' ) ) {
    exit('No script rookies, please.');
}

これはPHPファイルへの直接アクセスを許可しません。

また、requireの代わりにrequire_onceを使用して、誤って別の場所に含めてもエラーが発生しないようにします。

1
Jack Johansson