web-dev-qa-db-ja.com

スクリプトがプラグインからエンキュー/登録されているかどうか、プラグインでwp_script_isを使用して確認できますか?

pluginAwp_script_isを使用して、スクリプトがpluginBからエンキュー/登録されているかどうかをチェックできますか?

私はどちらもAngularを使用する2つのプラグインを持っています。 1つのプラグイン(pluginA)がすべてのページにわたってロードされているangular.min.jsを持っています。もう一方(pluginB)は片方だけにロードされているangular.min.jsを持っています。 pluginAが既にAngularをエンキューしているかどうかをチェックしたいのですが、pluginBからそれをやりたいのです。

例えば、私は試した

$handle = 'myAppScript.min.js' // this is a concatenated/minified version of the entire pluginA angular app.
$list = 'enqueued' // I also tried all the other $list options.
// if 'myAppScript.min.js' is present, don't register Angular again, otherwise register it.
if (wp_script_is($handle, $list)) {
  return; 
} else {
  wp_register_script( $this->plugin_name . '-ajs', plugin_dir_url(__FILE__) . 'js/angular/angular.min.js', array(), $this->version, false );
}

しかし、wp_script_isは何をしようとしてもfalseを返します(私はvar_dumpで二重チェックしました)ので、再びAngularを加えます。

あなたが与えることができるあらゆる助けをありがとう!

更新 - 私はis_plugin_activeを使用している私の特定の問題に対する実用的な解決策を持っています、しかし質問に対する答えがあるなら私はまだ興味があります。ありがとうございます。

    $plugin = 'pluginA/pluginA.php';
    include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
    if (!is_plugin_active($plugin)) {
      wp_register_script( $this->plugin_name . '-ajs', plugin_dir_url(__FILE__) . 'js/angular/angular.min.js', array(), $this->version, false );
    }
2
aberkow

あなたがplugins_loadedに夢中になっているのを見た今、これはwp_enqueue_scriptsよりずっと早く起動されるので意味があります。この時点で、関数は0を返すと予想されます。

アクションが一般的に起動される順序については、 here および here を参照してください。

他のキューに登録されたスクリプトの後に実行されるように、遅い優先順位で/ = - wp_enqueue_scriptsにアクション を追加してください。それから 登録解除 スクリプトを実行して、新しいパラメータで再度登録することができます。

別のパラメータですでに登録されているハンドルを登録またはエンキューしようとした場合、新しいパラメータは無視されます。代わりに、wp_deregister_script()を使用して、新しいパラメータでスクリプトを再度登録してください。

編集:申し訳ありませんが、私はそれを誤解しています。 is_plugin_activeはアクションフックではなく、スクリプトがエンキューされているかどうかを知らさずにすぐにtrueを返します。それでもやはり、関数wp_script_iswp_enqueue_scripts以降にフックしなければならないことを意味します。

1
iyrin

たぶん私は間違っているがWP codexによると:

wp_script_is( string $handle, string $list = 'enqueued' )

$handle - スクリプトの一意の名前

私が見ることができる限り、あなたは代わりにファイル名を使用していますが、これは間違っています。私は、アクション/フックが起動されたときには何の関係もありません。両方のプラグインがplugins_loaded上で起動されます。

だから、あなたはこの方法でそれをチェックアウトするなら

$handle = 'MY_SCRIPT_NAME'; /* can't really be $this->plugin_name . '-ajs' because it gives 2 different strings */

どちらのプラグインにも、必要なJSファイルのインスタンスが1つだけロードされます。

0
dameer dj

あなたは正しい道を進んでいます。スクリプトがエンキューされているかどうかを判断するためのより良い方法はありません。これは効率的な方法です wp_script_is($ handle、$ list)

あなたの$ハンドル名が正しいかどうか疑問に思うだけです。 wp_script_isをチェックしているときに$ handleがpluginBでスクリプトをエンキューするときと同じであることを確認してください。最初のパラメータは$ handleです。 WP Codex を参照してください。

それは言います:

パラメーター

$ handle

(文字列)(必須)スクリプトの名前。一意である必要があります。

私はあなたが他の部分でハンドルとしてプラグイン名を使っていると思います。

同じ名前の "AngularJS"などを使用してみてください。ただし、$ handleと同じである必要があります。

0
Jigar Patel