Wie kann ich ein Skript in die Warteschlange stellen, wenn das Widget auf der Seite angezeigt wird?

8

Ich habe ein Widget erstellt, das ein JQuery-Plugin verwendet, und ich habe is_active_widget verwendet, um das Skript in die Warteschlange zu stellen. Es funktioniert einwandfrei, aber es enthält das Skript auch auf Seiten, auf denen dieses Widget nicht angezeigt wird. Gibt es eine Möglichkeit, das Skript nur dann in die Warteschlange zu stellen, wenn dieses Widget angezeigt wird?

Danke im Voraus.

Pierre
quelle

Antworten:

11

Sie sollten in der Lage sein, wp_enqueue_script()als Teil Ihrer Widget-Ausgabe aufzurufen .

Bearbeiten

Schnell und schmutzig am Beispiel der Widgets-API- Klasse:

<?php
class wpse48337_Widget extends WP_Widget {

    public function __construct() {
        // widget actual processes
    }

    public function form( $instance ) {
        // outputs the options form on admin
    }

    public function update( $new_instance, $old_instance ) {
        // processes widget options to be saved
    }

    public function widget( $args, $instance ) {
        // outputs the content of the widget
    }

}
register_widget( 'wpse48337_Widget' );
?>

Fügen Sie Ihren wp_enqueue_script()Anruf inline innerhalb der Ausgabe Ihres Widgets hinzu - dh innerhalb der public function widget():

<?php    
    public function widget( $args, $instance ) {
        // outputs the content of the widget

    // Enqueue a script needed for
    // the Widget's output
    wp_enqueue_script( 'jquery-pluginname', $path, $deps );

    // Rest of widget output goes here...
    }
?>
Chip Bennett
quelle
Eigentlich mache ich das und benutze is_active_widget (), aber es wird das Skript auf allen Seiten in die Warteschlange stellen, wenn das Widget auch auf einer aktiv ist.
Pierre
Die Verwendung is_active_widget()ist nicht dasselbe wie das Aufrufen wp_enqueue_script()aus Ihrer Widget- Ausgabe . Siehe aktualisierte Antwort.
Chip Bennett
Vielen Dank für das Update, aber was meinst du mit schnell und schmutzig das Beispiel oder auf diese Weise für die Verwendung von wp_enqueue_script ()? und noch eine Off-Topic-Frage, ich sehe viele dieser privaten und öffentlichen Vorfunktionen in Widgets. Was machen sie also? und sollten wir sie themenspezifische Widgets verwenden? und vielen Dank :)
Pierre
Mit " schnelles und schmutziges Beispiel " meine ich, dass ich auf das Standard-Widget-Klassenkonstrukt verweise, wie im verknüpften Codex-Artikel beschrieben. Ich gehe davon aus, dass Sie Ihr benutzerdefiniertes Widget mithilfe der Widgets-API geschrieben haben. Wenn nicht, sollten Sie sein; Wenn Sie jedoch eine genauere Anleitung benötigen, müssen wir Ihren Widget-Code anzeigen.
Chip Bennett
Das funktioniert nicht. Ich bin mir nicht sicher, ob es früher funktioniert hat, da es als Antwort markiert wurde. Aber im Moment wird das Widget-Formular nach der Aktion wp_enqueue_scripts ausgelöst
Omar Abid
6

Wenn das Skript in den <head>Abschnitt gehen muss:

class Your_Widget extends WP_Widget{

  protected static $did_script = false;

  function __construct(){

    // parent::__construct() ...

    add_action('wp_enqueue_scripts', array($this, 'scripts'));

  }

  function scripts(){

    if(!self::$did_script && is_active_widget(false, false, $this->id_base, true)){
      wp_enqueue_script('your-script');
      self::$did_script = true;
    }           

  }


}

Andernfalls funktioniert die Lösung von Chip Bennett, um sie in der Fußzeile in die Warteschlange zu stellen.

Die $did_scriptstatische Variable ist nicht erforderlich. Ich habe sie nur verwendet, um weitere unnötige Aufrufe zu vermeiden, wp_enqueue_scriptwenn mehrere Widget-Instanzen auf der Seite vorhanden sind.

Onetrickpony
quelle
1
Coole Idee, aber damit wird die Frage des OP nicht beantwortet, da is-active_widget()Sie nur wissen, ob ein Widget aktiviert wurde (dh in einen der Seitenleistenbereiche unter Darstellung> Widgets gezogen wurde), anstatt tatsächlich auf einer bestimmten Seite angezeigt zu werden .
Tom Auger
Bedingung ist falsch: (1) is_active_widget gibt eine sidebar_id zurück, auch wenn diese Seitenleiste auf der aktuellen Seite nicht angezeigt wird. Dadurch wird das Skript auf jeder Seite hinzugefügt. (2) wp_enqueue_script fügt ein Skript nur einmal hinzu, auch wenn Sie es mehrmals aufrufen. Keine Notwendigkeit für self::$did_script (3), da __constructbei jeder Seitenanforderung aufgerufen wird, auch wenn das Widget nicht einmal angezeigt wird
Philipp
2

Pierre,

Ich gehe damit mit wp_enqueue_scriptund um wp_dequeue_scriptund verwende eine Instanzvariable $is_activein der Your_Widget-Klasse

Tun Sie dies auch, wp_enqueue_scriptbasierend darauf, is_active_widgetwelches Skript das Skript auf allen Seiten in die Warteschlange stellt, wobei der Fußzeilenparameter auf true gesetzt ist. Beachten Sie, dass die Warteschlange mit einer Priorität ausgeführt wird, um sicherzustellen, dass sie ausgeführt wird, bevor die Skripts ausgegeben werden.

function enqueue_scripts() {
  if ( is_active_widget( false, $this->id, $this->id_base, true ) ) {
    wp_enqueue_script( 'your-script-handle', 'your-script-url', array(), '1.0', true );
    add_action( 'wp_footer', array($this,'dequeue_redundant_scripts'), 1 );
  }

}}

Geben Sie dann in der Widget-Funktion an, ob das Widget auf dieser Seite aktiv ist

function widget( $args, $instance ) {
    // outputs the content of the widget
    $this->is_active = true;  
}

Deaktivieren Sie dann in der Fußzeile das Skript, wenn das Widget auf dieser Seite nicht aktiv ist

function dequeue_redundant_scripts() {
    if (! $this->is_active) {
        wp_dequeue_script('your-script-handle');
    }
}

Dieser Ansatz, bei Nichtverwendung in die Warteschlange zu stellen und dann in die Warteschlange zu stellen, funktioniert auch gut für Plugins, die Shortcodes definieren, für die Skripte erforderlich sind

Russell Jamieson
quelle
0

Ich habe den Hook 'wp_footer' in Betracht gezogen, da dieser Hook in der Fußzeile ausgeführt wird und wahrscheinlich der beste Weg ist, Skripte nur dort hinzuzufügen, wo das Widget verwendet wird.

class Your_Widget extends WP_Widget{

    function widget( $args, $instance ) {

         add_action('wp_footer',array($this,'front_end_scripts'));

    }

    function front_end_scripts(){
       ?><script type="text/javascript">
          console.log('this works!');
        /*
          Or if you need external scripts then you may use 
          $.getScript([your-script-url] );
        */
        </script> <?php
    }



}
Dipesh KC
quelle
1
Pfui. wp_enqueue_script()Bitte. Kein direkter Druck von JS.
Tom Auger
Ich fürchte, wp_enqueue_script () funktioniert hier nicht, da der Hook neben wp_enqueue_script viel vor dem eigentlichen Aufruf des Widgets ausgelöst wird.
Dipesh KC
Sie können wp_enqueue_script () jederzeit vor der Aktion wp_footer aufrufen. Das Widget wird beim Erstellen der Vorlagenseite aufgerufen. Sie können entweder eine dynamic_sidebarAktion ausführen , um zu erkennen, wann Ihr Widget tatsächlich angezeigt wird, oder einfach Ihr enqueue_script()Recht in die widget()Methode einfügen, wie von @ChipBennet empfohlen.
Tom Auger