¿Cómo poner en cola el script si el widget se muestra en la página?

8

Creé un widget que usa un complemento jquery, y usé is_active_widget para poner en cola el script, funciona bien pero también incluye el script incluso en las páginas que no muestran este widget. Entonces, ¿hay una manera de poner en cola solo el script si este widget se muestra?

gracias de antemano.

    
pregunta Pierre 08.04.2012 - 20:08

4 respuestas

10

Debería poder llamar a wp_enqueue_script() como parte de la salida de su Widget.

Editar

Rápido y sucio, utilizando el ejemplo de la clase Widgets API :

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

Agregue su llamada wp_enqueue_script() en línea , dentro de la salida de su Widget , es decir, dentro del 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...
    }
?>
    
respondido por el Chip Bennett 08.04.2012 - 22:12
6

Si el script debe ir en la sección <head> :

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

  }


}

De lo contrario, la solución de Chip Bennett funcionará para ponerlo en cola en el pie de página.

La variable estática $did_script no es necesaria, la usé solo para evitar llamadas innecesarias a wp_enqueue_script si hay varias instancias de widgets en la página ...

    
respondido por el onetrickpony 09.04.2012 - 14:02
2

Pierre,

La forma en que manejo esto es con wp_enqueue_script y wp_dequeue_script , y uso una variable de instancia $is_active en la clase Your_Widget

Al igual que wp_enqueue_script basado en is_active_widget que pone en cola el script en todas las páginas pero con el parámetro de pie de página establecido en verdadero. Tenga en cuenta que la salida de la cola se ejecuta con una prioridad para asegurarse de que se ejecute antes de que se generen los scripts.

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

}

Luego, en la función de widget indique si el widget está activo en esa página

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

Luego, en el pie de página, elimine la cola de la secuencia de comandos si el widget no está activo en esa página

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

Este enfoque de encolar y luego de encolar si no se usa también funciona bien para los complementos que definen códigos cortos que requieren scripts

    
respondido por el Russell Jamieson 20.10.2015 - 14:18
0

Consideré el gancho 'wp_footer' porque este gancho se ejecuta al pie de página, y es probablemente la mejor manera de agregar scripts solo cuando se usa el 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
    }



}
    
respondido por el Dipesh Kc 11.04.2013 - 13:57

Lea otras preguntas en las etiquetas