is_plugin_active関数は存在しません


15

WordPress 3.0.5を使用していますが、3.1rc4でテストしました。私はis_plugin_active呼び出すしようとすると、私のプラグインの主なPHPファイルでは、私が取得しますCall to undefined function is_plugin_active()。add_actionとadd_filterを呼び出すことができます。これを修正するには、何をチェック/変更する必要がありますか?

これは、プラグインページの管理者内部で行われています。私が持っているメインのプラグインファイルの一番上で、if (function_exists('is_plugin_active')) {常にfalseを返します。

また、他のプラグインでメインのプラグインファイルの関数を見ることができません(もしあれば)。


私はあなたの説明からわかりません-これがアクティブ化されたプラグインに問題がある場合、またはアクティブ化または他の特定の条件下で何かをしようとしているのですか?
11

function_exists('is_plugin_active')メソッドの外部でメインプラグインファイルから呼び出された場合はfalseですが、activated_pluginアクションのために呼び出されたメソッドの内部で呼び出された場合はtrueであることがわかりました。
カール

どのページでエラーが表示されますか?プラグインのページ(wp-admin / plugins.php)?これは、問題のプラグインをアクティブ化する前または後ですか?Rarstには良い点があります。ワードプレスで関数を呼び出すポイントを知っていますか?
ジョニーボジャングルズ

プラグインをアクティブにした後、wp-admin / plugins.phpにエラーが表示されます。私はアクションとしてフックされているいくつかのメソッドをチェックしており、そこで動作します。包含順序と関係があるようです。
カール

プラグインはアルファベット順にロードされるため、単にプラグインが十分早く処理されていない可能性があります。プラグインの名前を変更して、文字a(a_myplugin-nameなど)で始まるようにしてください。ただし、最良のオプションは、プラグインがロードされた後に実行される関数内からfunction_existsブロックを呼び出すことです。大まかな実行順序はWP codexで確認できます:codex.wordpress.org/Plugin_API/Action_Reference
Phill Healey

回答:


27

is_plugin_active()が定義されているファイルはwp-admin/includes/plugin.php、プラグインがロードされた後にのみ管理者にロードされるためです。

したがって、「admin_init」が起動された後にのみ呼び出すことができます。

function check_some_other_plugin() {
  if ( is_plugin_active('some-plugin.php') ) {
    ...
  }
}
add_action( 'admin_init', 'check_some_other_plugin' );

私が既に管理者である場合、これへのアクセスを許可しないような間違った設定がされている可能性がありますか?
カール

1
更新された回答を参照してください。
スクリブ

10

テンプレートおよびユーザーページからis_plugin_active()を呼び出すこともできます。これは、関連するプラグインに役立ちます(つまり、新しいプラグインを操作するにはプラグイン 'xyz'が必要です)。Codexのis_plugin_active()ドキュメントに記載されているように、plugin.phpファイルを手動で含める必要があります。

これは、アドオンオブジェクトを呼び出す前に無料のベースプラグインがアクティブであることを確認するために、プレミアムアドオンパックで使用する機能的な例です。基本プラグインで特定のフックとフィルターを使用できるようにする必要があります。そうしないとクラッシュします。

include_once(ABSPATH.'wp-admin/includes/plugin.php');
if (!function_exists('is_plugin_active') || !is_plugin_active('store-locator-le/store-locator-le.php')) { 
   return;
}

余談ですが、アクティブな管理者ログイン内からis_plugin_active()で問題が発生している場合は、admin_initが起動する前にテストしている可能性があります。admin_menuはadmin_initの前に起動し、admin_menuでテストを行うと以前に「噛まれた」ことがあります。「admin_init」という名前は、admin_menuがすでに実行されているため、私には直観に反しているようです。initを「最初に実行するもの」と考えています...おそらくadmin_kinda_init()の方が良いでしょう。:)


追加するのinclude_once(ABSPATH.'wp-admin/includes/plugin.php');が私にとってのトリックでした。ありがとう!
デイブ

8

迅速で汚い回避策は、関数を手動で複製することです。

if ( ! function_exists( 'is_plugin_active' ) ) {
    function is_plugin_active( $plugin ) {
        return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
    }
}

かなり短いので、回避策として独自のコードに実装するのはそれほど難しくないはずです。


4

シンプルで簡単。WPから取得

if ( ! function_exists( 'is_plugin_active' ) )
     require_once( ABSPATH . '/wp-admin/includes/plugin.php' );

その後の任意のインスタンス

 if ( is_plugin_active( 'feed-them-social/feed-them.php' ) ) {

   }

機能チェックを取得します。エラーはもうありません。


1
使用しているrequireonce場合、おそらく機能を確認する必要はありません...?
フィルヒーリー

そうすることで、プラグインが使用される前にプラグインが定義されていることを確認できるようになります。そうしないと、問題が発生する可能性があります。
スペンサーラバディ

3

plugin.phpを含める代わりに、独自のis_plugin_active関数を定義する方法について、Tom Augerの回答を好みました。ただし、同じ関数名を使用すると、管理領域がクラッシュしました。別の関数名を使用して解決しました:

function is_plugin_active_byme( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}

同意する。関数の宣言で競合をチェックできますが、WPはそうではないため、WPはエラーをトリガーします。
クリススプレーグ

1

is_plugin_active管理者またはフロントエンド内で使用していますか?これはis_plugin_activewp-admin / includes / plugin.php内にある管理機能にすぎないことは確かです。

さらに、メインプラグインファイルはWordpressファイルヘッダーを使用しますか?上記のplugin.phpファイルがロードされた後にプラグインが含まれていますか?


これは、プラグインページの管理者内部で行われています。プラグインには、推奨されるWPファイルヘッダーがあります。plugin.phpの後にプラグインが含まれているかどうかを確認するにはどうすればよいですか?
カール

1

アクティブなプラグインをデバッグするには:

var_dump(get_option(...));

特定のプラグインを確認するには:

in_array(get_option(...));

アクションは " active_plugins" IIRC と呼ばれます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.