プラグインに正しい方法でPHPファイルを含める方法


59

私の問題は、メインプラグインファイルに次のようなPHPファイルを含めるときです:

include(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// or
include_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// or
require(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// or
require_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');

そのファイルで、次のようなWordPress関数の呼び出しがあります。

add_action('hook', 'callback');

そして私は得る:

致命的エラー:未定義関数add_action()の呼び出し

さて、あなたが「使用するif(**function_exists**('add_action')){」と言う前に、私がそれを使用する場合、それはうまくいきません。

質問:

  • それを行う正しい方法は何でしょうか?
  • どのような違いがありincludeinclude_oncerequireと私は魔女をするときに使うのですか?

そのメッセージを受け取ったら、何か間違ったことをしています。これらのファイルから関数の実行を開始する前に、必ずファイルを含めるようにしてください
-onetrickpony

それはありません、呼び出しは私が含めているファイル内にあります!
-Bainternet

笑、今、WP_PLUGIN_URL上記のコードに表示されています:)
onetrickpony

3
非常に簡単に言えば、URIではなくファイルパスを介してのみinclude()ファイルを使用できます。
編集者

1
このCodexの記事(おそらく質問した後に書かれたもの)は非常に役に立ちます:codex.wordpress.org/Determining_Plugin_and_Content_Directories
henrywright

回答:


88

このパーティーに遅れて来ますが、ここに「WordPress」の方法があります:use plugin_dir_path( __FILE__ )、eg:

<?php
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');
?>

関数ファイルパスの末尾のスラッシュを返すことに注意してください。


3
__FILE__これを使用すると、呼び出し元の現在のファイルに関連して出力されるためinclude、プラグインファイル構造内のサブディレクトリからステートメントを実行すると、サブディレクトリも取得されます。
squarecandy

代替-あなたがいる場合NEED相対パスを、であるrequire_once(plugin_dir_path(__DIR__).'/myfile.inc');
FoggyDay

10

以前に作成したいくつかのプラグインを調べて、プラグイン内に追加のファイルを含めるさまざまな方法を確認しましたが、使用できる方法は2つあることに気づきました。おそらく他にもあります。

プラグインディレクトリを定義する

プラグインの内部には、現在のプラグインの場所を定義する次の定義があります。

サンプルコード:

define( 'PLUGIN_DIR', dirname(__FILE__).'/' );  

ただまっすぐに含めるか、必要とします

単純に使用できます。プラグインフォルダー内のinclude、include_once、require、またはrequire_onceは、以下のサンプルコードのように場所を参照することによって行います。以下の例は、プラグインフォルダー内のフォルダー内の別のファイルを含む、ルートプラグインディレクトリ内のファイルに基づいています。

サンプルコード:

include "classes/plugin-core.php";

相対インクルードは、あらゆる種類の厄介な予期しない問題を引き起こす可能性があります。
マークカプルン

5

最終的にインクルード用のWordPressコンストラクトを放棄し、以下を使用します。

require_once(dirname(__FILE__) . '/filename.php);

私はそれが実際にあなたの問題を解決するとは思いません。これはスコープの問題のようですが、私が使用するコードです。

includeとrequireの違いに関しては、ファイルが見つからない場合
はincludeは警告をスローし、ファイルが見つからない場合は
requireは致命的なエラーをスローします

include_onceとrequire_onceは、既に含まれている/必要なファイル/コードを再び含めたり、必要としたりしません(私が知る限り、これは特定のディレクトリ内の特定のファイルに対してのみです)。


5

まず、答えてくれたすべての人に感謝します。

私の問題は、WordPressを経由しないように、含まれているファイルを完全なURLで呼び出すことでした。それは、質問で述べたように、メインのプラグインファイルから呼び出していたために発生しました。そのため、修正は次のようになりました:

include_once('/ipn/paypal-ipn.php');

WordPressサポートで読みました。そしてまた答えてくれてありがとう!


この回答(wordpress.stackexchange.com/a/32002/123092)を承認済みとしてマークすることを再検討してください。
私は最も愚かな人です

4

含める

include()ステートメントは、指定されたファイルをインクルードして評価します。

1回含める

include_once()ステートメントは、スクリプトの実行中に指定されたファイルを含めて評価します。これは、include()ステートメントに似た動作ですが、唯一の違いは、ファイルのコードが既に含まれている場合、再び含まれないことです。名前が示すように、一度だけ含まれます。

が必要

require()とinclude()は、失敗を処理する方法を除いて、あらゆる点で同一です。どちらも警告を生成しますが、require()の結果は致命的エラーになります。つまり、行方不明のファイルでページの処理を停止する場合は、require()を使用することをためらわないでください。

一度必要

require_once()ステートメントは、スクリプトの実行中に指定されたファイルを含めて評価します。これはrequire()ステートメントに似た動作ですが、唯一の違いは、ファイルのコードが既に含まれている場合、再び含まれないことです。

上記の情報はPHPのドキュメントからのもので、正しいものはありません、コードの必要性に依存します、関数のような重要なものに必要ですが、フッターや私が使用するループのようなテーマファイルに必要ですinclude_onceまたはinclude。警告を処理し、fatal_errorの代わりにエラーが発生したユーザー/訪問者に発言できるためです。


@mtekkが言っているように、tis構造を使用することをお勧めします:require_once(dirname(FILE)。 '/filename.php);
Webord

1

こんにちは@בנייתאתרים:

WordPressがロードされると、プラグインをロードしようとするadd_action()関数が定義されます。

あなたは誰を得ている「プラグイン」ロードするの?include*()またはrequire*()を使用してwp-config.phpファイルをロードしていますか?


1
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');

または

define( 'PLUGIN_ROOT_DIR', plugin_dir_path( __FILE__ ) );
include( PLUGIN_ROOT_DIR . 'ipn/paypal-ipn.php');

または

$plugin_dir_path = plugin_dir_path( __FILE__ );
include( $plugin_dir_path . 'ipn/paypal-ipn.php');

注:admin_enqueue_scriptsプラグイン内で.cssおよび.jsファイルをエンキューするにはplugin_dir_url( __FILE__ )

$plugin_dir_uri = plugin_dir_url( __FILE__ );
wp_enqueue_style( 'plugin-style', $plugin_dir_uri . 'css/plugin-style.css');

0

作業ディレクトリ内に新しいファイルを作成するたびに、毎回それを含める必要があります。しかし、phpファイルだけでなく、directroyをスキャンして自動的に添付する方法を試してください。これにより、両側(バックエンド、フロントエンド)に適切にphp、js、cssファイルを含めることができます。

http://kvcodes.com/2014/05/wordpress-theme-development-include-files-automatically/


1
回答に提供されたリンクから関連情報を追加してください。クレジット目的でリンクを使用します。してください編集あなたの質問
ピーター・グーセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.