Como enfileirar o script se o widget for exibido na página?

8

Eu criei um widget que usa um plugin jquery, e usei is_active_widget para enfileirar o script, ele está funcionando bem, mas também está incluindo o script, mesmo em páginas que não mostram esse widget. Então, há uma maneira de enfileirar o script apenas se esse widget estiver sendo exibido?

obrigado antecipadamente.

    
por Pierre 08.04.2012 / 20:08

4 respostas

10

Você deve poder chamar wp_enqueue_script() como parte da sua saída do Widget.

Editar

Rápido e sujo, usando o exemplo de classe de API de Widgets :

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

Adicione sua wp_enqueue_script() chamada , dentro da saída da sua Widget - ou seja, dentro da 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...
    }
?>
    
por Chip Bennett 08.04.2012 / 22:12
6

Se o script precisar ir na seção <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;
    }           

  }


}

Caso contrário, a solução do Chip Bennett funcionará para enfileirá-lo no rodapé.

A variável estática $did_script não é necessária, usei-a apenas para evitar mais chamadas desnecessárias para wp_enqueue_script se houver várias instâncias de widget na página ...

    
por onetrickpony 09.04.2012 / 14:02
2

Pierre,

A maneira como eu lido com isso é com wp_enqueue_script e wp_dequeue_script e uso uma variável de instância $is_active na classe Your_Widget

Portanto, faça o wp_enqueue_script com base em is_active_widget , que enfileira o script em todas as páginas, mas com o parâmetro footer definido como true. Observe que o desenfileiramento é executado com prioridade para garantir que ele seja executado antes da saída dos 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 );
  }

}

Em seguida, na função widget, indique se o widget está ativo nessa página

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

Em seguida, no rodapé, desencaixe o script se o widget não estiver ativo nessa página

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

Essa abordagem de enfileiramento, em seguida, remover o enfileiramento se não for usada também funciona bem para plug-ins que definem códigos de acesso que exigem scripts

    
por Russell Jamieson 20.10.2015 / 14:18
0

Eu considerei o hook 'wp_footer' porque esse hook é executado no rodapé e é provavelmente a melhor maneira de adicionar scripts somente onde o widget é usado.

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
    }



}
    
por Dipesh Kc 11.04.2013 / 13:57