wake-up-neo.net

Kann wp_script_in der Plugin-Prüfung verwendet werden, wenn ein Skript aus dem Plugin in die Warteschlange gestellt/registriert wird?

Kann wp_script_is, der in pluginA verwendet wird, prüfen, ob ein Skript von pluginB in die Warteschlange gestellt/registriert wird?

Ich habe zwei Plugins, die beide Angular verwenden. Ein Plugin (pluginA) hat angular.min.js, der über alle Seiten geladen wird. Der andere (pluginB) hat angular.min.js, der nur auf einen geladen wird. Ich möchte überprüfen, ob pluginA bereits Angular in die Warteschlange gestellt hat, aber ich möchte dies von pluginB aus tun.

Ich habe es zum Beispiel versucht

$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 gibt jedoch unabhängig von meinem Versuch den Wert false zurück (ich habe dies mit einem var_dump doppelt überprüft) und fügt daher Angular erneut hinzu.

Vielen Dank für jede Hilfe, die Sie geben können!

Update - Ich habe eine funktionierende Lösung für mein spezielles Problem mit is_plugin_active, bin aber immer noch neugierig, ob es eine Antwort auf die Frage gibt. Vielen Dank!

    $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 );
    }
3
aberkow

Jetzt, wo ich sehe, dass Sie sich in plugins_loaded eingeklinkt haben, ist dies sinnvoll, da es viel früher als wp_enqueue_scripts abgefeuert wird. Es wird erwartet, dass Ihre Funktion an dieser Stelle 0 zurückgibt.

Siehe hier und hier für die Reihenfolge, in der Aktionen im Allgemeinen ausgelöst werden.

Versuchen Sie, eine Aktion hinzuzufügen at wp_enqueue_scripts mit einer späten Priorität, um sicherzustellen, dass sie nach anderen Skripten in der Warteschlange ausgeführt wird. Dann können Sie das Skript abmelden und erneut mit neuen Parametern registrieren.

Wenn Sie versuchen, ein bereits registriertes Handle mit anderen Parametern zu registrieren oder in die Warteschlange zu stellen, werden die neuen Parameter ignoriert. Verwenden Sie stattdessen wp_deregister_script () und registrieren Sie das Skript erneut mit den neuen Parametern.

Edit: Sorry, das habe ich falsch verstanden. is_plugin_active ist kein Aktions-Hook und gibt sofort true zurück, ohne Sie darüber zu informieren, ob sich das Skript in der Warteschlange befindet. Es steht weiterhin fest, dass Sie die Funktion wp_script_is bei wp_enqueue_scripts oder später einbinden müssen.

2
iyrin

Vielleicht irre ich mich aber laut WP Kodex:

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

$handle - eindeutiger Name des Skripts

Soweit ich sehe, verwenden Sie stattdessen FILE NAME, was falsch ist. Für mich hat es nichts damit zu tun, wann Aktionen/Hooks ausgelöst werden, da beide Plugins auf plugins_loaded ausgelöst werden.

Also, wenn Sie es auf diese Weise überprüfen

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

in beiden Plugins wird nur eine Instanz der erforderlichen JS-Datei geladen.

0
dameer dj

Sie sind auf dem richtigen Weg. Es gibt keine bessere Möglichkeit, festzustellen, ob ein Skript in die Warteschlange gestellt wurde oder nicht. Dies ist ein effizienter Weg wp_script_is ($ handle, $ list)

Ich frage mich nur, ob Ihr $ Handle-Name korrekt ist. Stellen Sie sicher, dass $ handle beim Überprüfen von wp_script_s dasselbe ist wie beim Einreihen von Skripten in pluginB. Der erste Parameter ist $ handle. Siehe hierzu WP Codex .

Es sagt:

Parameter

$ handle

(string) (Erforderlich) Name des Skripts. Sollte eindeutig sein.

Ich glaube, Sie verwenden den Namen des Plugins als Handle in einem anderen Teil.

Versuchen Sie, den gleichen Namen wie "AngularJS" oder etwas anderes zu verwenden, müssen Sie jedoch mit $ handle identisch sein

0
Jigar Patel