¿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 páginas que no muestran este widget. Entonces, ¿hay alguna manera de poner en cola el script solo si se muestra este widget?

gracias por adelantado.

Pierre
fuente

Respuestas:

11

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

Editar

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

<?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 wp_enqueue_script()llamada en línea , dentro de la salida de su widget, es decir, dentro de 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
fuente
De hecho, estoy haciendo eso y usando is_active_widget () pero pondrá en cola el script en todas las páginas si el widget está activo incluso en una.
Pierre
Usar is_active_widget()no es lo mismo que llamar wp_enqueue_script()desde la salida de su widget . Ver respuesta actualizada.
Chip Bennett el
gracias por la actualización, pero ¿qué quiere decir con rápido y sucio el ejemplo o de esta manera para usar wp_enqueue_script ()? y una pregunta más fuera de tema, por favor, estoy viendo muchas de estas funciones privadas y públicas anteriores en widgets, ¿qué hacen? ¿y deberíamos usar widgets específicos para los temas? y muchas gracias :)
Pierre
Por " ejemplo rápido y sucio ", quiero decir que estoy haciendo referencia a la construcción estándar de la clase Widget, como se describe en el artículo vinculado del Codex. Estoy asumiendo que usted ha escrito su costumbre Widget mediante la API de widgets. Si no, deberías estarlo; pero, sin embargo, si necesita orientación más específica, necesitaremos ver su código de Widget.
Chip Bennett
Esto no funciona No estoy seguro de si solía funcionar ya que se marcó como respuesta. Pero en este momento, el formulario del widget se activa después de la acción wp_enqueue_scripts
Omar Abid
6

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

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 ponerla en cola en el pie de página.

La $did_scriptvariable estática no es necesaria, la usé solo para evitar más llamadas innecesarias wp_enqueue_scriptsi hay varias instancias de widgets en la página ...

Pony de un solo truco
fuente
1
Buena idea, pero esto en realidad no responde a la pregunta del OP, ya que is-active_widget()solo le permite saber si se ha activado un widget (es decir, arrastrado a una de las áreas de la barra lateral en Apariencia> Widgets), en lugar de aparecer en una página determinada .
Tom Auger
La condición es incorrecta: (1) is_active_widget devolverá un sidebar_id, incluso si esa barra lateral no se muestra en la página actual. Esto agregará el script en cada página. (2) wp_enqueue_script agregará un script solo una vez, incluso si lo llama varias veces. no es necesario para self::$did_script (3) porque __constructse llama en cada solicitud de página, incluso si el widget ni siquiera se muestra
Philipp
2

Pierre

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

Entonces, haga lo que se wp_enqueue_scriptbasa en is_active_widgetque 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 cola se ejecuta con prioridad para asegurarse de que se ejecuta 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 el script 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 poner en cola y luego quitar de la cola si no se usa también funciona bien para complementos que definen códigos cortos que requieren scripts

Russell Jamieson
fuente
0

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



}
Dipesh KC
fuente
1
Ugh wp_enqueue_script()Por favor. Sin impresión directa de JS.
Tom Auger
Me temo que wp_enqueue_script () no funcionará aquí ya que el gancho además de wp_enqueue_script se dispara mucho antes de que se llame realmente al widget.
Dipesh KC
Puede llamar a wp_enqueue_script () en cualquier momento antes de la acción wp_footer. El widget se llama durante la creación de la página de plantilla. Puede engancharse a la dynamic_sidebaracción, detectar cuándo se muestra realmente su widget, o, más simplemente, simplemente poner su enqueue_script()derecho en el widget()método, como recomienda @ChipBennet.
Tom Auger