Come accodare lo script se il widget è visualizzato sulla pagina?


8

Ho creato un widget che utilizza un plugin jquery e ho usato is_active_widget per accodare lo script, funziona bene ma include anche lo script anche nelle pagine che non mostrano questo widget. quindi c'è un modo per accodare lo script solo se viene mostrato questo widget?

Grazie in anticipo.

Risposte:


11

Dovresti essere in grado di chiamare wp_enqueue_script()come parte dell'output del widget.

modificare

Veloce e sporco, usando l' esempio della classe API Widget bare-bones :

<?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' );
?>

Aggiungi la tua wp_enqueue_script()chiamata in linea , all'interno dell'output del tuo Widget, ovvero all'interno di 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...
    }
?>

In realtà lo sto facendo, e usando is_active_widget () ma accoderà lo script su tutte le pagine se il widget è attivo anche su uno.
Pierre,

Utilizzando is_active_widget()non è lo stesso di chiamare wp_enqueue_script()dal all'interno del tuo Widget uscita . Vedi la risposta aggiornata.
Chip Bennett,

grazie per l'aggiornamento, ma cosa intendi con l'esempio veloce e sporco o in questo modo per l'utilizzo di wp_enqueue_script ()? e un'altra domanda fuori tema per favore, vedo molte di queste funzioni private e pubbliche prima dei widget, quindi cosa fanno? e dovremmo usarli widget specifici per i temi? e grazie mille :)
Pierre

Con " esempio rapido e sporco ", intendo che sto facendo riferimento al costrutto standard della classe Widget, come descritto nell'articolo Codex collegato. Sto assumendo che hai scritto la vostra abitudine Widget utilizzando l'API Widget. In caso contrario, dovresti essere; tuttavia, se hai bisogno di indicazioni più specifiche, dovremo vedere il tuo codice Widget.
Chip Bennett l'

Questo non funziona Non sono sicuro che funzionasse da quando è stato contrassegnato come una risposta. Ma in questo momento, il modulo widget viene attivato dopo l'azione wp_enqueue_scripts
Omar Abid

6

Se lo script deve andare nella <head>sezione:

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;
    }           

  }


}

Altrimenti, la soluzione di Chip Bennett funzionerà per accodarla nel piè di pagina.

La $did_scriptvariabile statica non è richiesta, l'ho usata solo per evitare ulteriori chiamate non necessarie a wp_enqueue_scriptse ci sono più istanze di widget sulla pagina ...


1
Bella idea, ma questo in realtà non affronta la domanda del PO, dal momento is-active_widget()che ti fa solo sapere se un widget è stato attivato (cioè: trascinato in una delle aree della barra laterale in Aspetto> Widget), invece di apparire effettivamente in una determinata pagina .
Tom Auger,

Condizione errata: (1) is_active_widget restituirà un sidebar_id, anche se quella sidebar non è visualizzata nella pagina corrente. Questo aggiungerà lo script in ogni pagina. (2) wp_enqueue_script aggiungerà uno script una sola volta, anche se lo chiami più volte. non è necessario per self::$did_script (3) perché __constructviene chiamato su ogni richiesta di pagina, anche se il widget non viene nemmeno visualizzato
Philipp

2

Pierre,

Il modo di gestire questo è con wp_enqueue_scripte wp_dequeue_script, e utilizzare una variabile un'istanza $is_activedella classe Your_Widget

Lo stesso vale per la wp_enqueue_scriptbase is_active_widgetche accoda lo script su tutte le pagine ma con il parametro footer impostato su true. Si noti che il dequeue viene eseguito con priorità per assicurarsi che venga eseguito prima che vengano emessi gli script.

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 );
  }

}

Quindi nella funzione widget indicare se il widget è attivo su quella pagina

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

Quindi nel piè di pagina dequeue lo script se il widget non è attivo su quella pagina

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

Questo approccio di accodamento quindi di dequeue se non utilizzato funziona bene anche per i plugin che definiscono codici brevi che richiedono script


0

Ho considerato l'hook 'wp_footer' perché questo hook viene eseguito a piè di pagina ed è probabilmente il modo migliore per aggiungere script solo dove viene utilizzato il widget.

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
    }



}

1
Ugh. wp_enqueue_script()per favore. Nessuna stampa diretta di JS.
Tom Auger,

Temo che wp_enqueue_script () non funzionerà qui poiché l'hook oltre a wp_enqueue_script viene attivato molto prima che il widget venga effettivamente chiamato.
Dipesh KC

Puoi chiamare wp_enqueue_script () in qualsiasi momento prima dell'azione wp_footer. Il widget viene chiamato durante la creazione della pagina del modello. Puoi agganciarti dynamic_sidebarall'azione, rilevare quando il tuo widget è effettivamente visualizzato, o, più semplicemente, mettere il tuo enqueue_script()diritto nel widget()metodo, come consiglia @ChipBennet.
Tom Auger,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.