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

8

Criei um widget que usa um plug-in jquery e usei is_active_widget para enfileirar o script, está funcionando bem, mas também inclui o script mesmo em páginas que não mostram esse widget. então existe uma maneira de enfileirar o script apenas se esse widget estiver sendo exibido?

desde já, obrigado.

Pierre
fonte

Respostas:

11

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

Editar

Rápido e sujo, usando o exemplo de classe básica da 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 em linha , na saída do seu Widget - ou seja, dentro do 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
fonte
Na verdade, estou fazendo isso e usando is_active_widget (), mas ele enfileirará o script em todas as páginas se o widget estiver ativo, mesmo em uma.
314 Pierre
Usar is_active_widget()não é o mesmo que chamar wp_enqueue_script()de dentro da saída do Widget . Veja a resposta atualizada.
Chip Bennett
obrigado pela atualização, mas o que você quer dizer com rápida e suja do exemplo ou desta maneira para usar wp_enqueue_script ()? e mais uma pergunta fora do tópico, por favor, estou vendo muitas dessas funções privadas e públicas antes nos widgets. O que elas fazem? e devemos usá-los widgets específicos para temas? e muito obrigado :)
Pierre
Por " exemplo rápido e sujo ", quero dizer que estou referenciando a construção da classe Widget padrão, conforme descrito no artigo vinculado do Codex. Eu estou supondo que você tenha escrito o seu costume Widget usando a API Widgets. Se não, você deveria ser; no entanto, se você precisar de orientações mais específicas, precisaremos ver seu código do widget.
Chip Bennett
Isso não funciona. Não tenho certeza se costumava funcionar, pois estava marcado como resposta. Mas agora, a forma widget é desencadeada após a ação wp_enqueue_scripts
Omar Abid
6

Se o script precisar ir na <head>seção:

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 de Chip Bennett funcionará para enfileirá-la no rodapé.

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

onetrickpony
fonte
11
Ideia legal, mas isso realmente não aborda a questão do OP, pois is-active_widget()permite que você saiba se um widget foi ativado (ou seja: arrastado para uma das áreas da barra lateral em Aparência> Widgets), em vez de realmente aparecer em qualquer página .
Tom Auger
A condição está incorreta: (1) is_active_widget retornará um sidebar_id, mesmo que essa barra lateral não esteja exibida na página atual. Isso adicionará o script em todas as páginas. (2) wp_enqueue_script adicionará um script apenas uma vez, mesmo que você o chame várias vezes. não há necessidade de self::$did_script (3) porque __constructé chamado em cada solicitação de página, mesmo que o widget não é ainda exibido
Philipp
2

Pierre,

A maneira como lida com isso é com wp_enqueue_scriptand wp_dequeue_script, e use uma variável de instância $is_activena classe Your_Widget

Então, fazer a wp_enqueue_scriptbase em is_active_widgetque enfileira o script em todas as páginas, mas com o conjunto de parâmetros de rodapé para true. Observe que a desenfileiramento é executada com prioridade para garantir que seja executada 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 do 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é, desenfileire 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 enfileirar e desenfileirar se não for usada também funciona bem para plug-ins que definem códigos de acesso que requerem scripts

Russell Jamieson
fonte
0

Eu considerei o gancho 'wp_footer' porque esse gancho é executado no rodapé e provavelmente é a melhor maneira de adicionar scripts apenas 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
    }



}
Dipesh KC
fonte
11
Ugh. wp_enqueue_script()por favor. Nenhuma impressão direta de JS.
Tom Auger
Receio que o wp_enqueue_script () não funcione aqui, pois o gancho, além do wp_enqueue_script, é acionado muito antes do widget ser chamado.
Dipesh KC
Você pode chamar wp_enqueue_script () a qualquer momento antes da ação wp_footer. O widget é chamado durante a construção da página de modelo. Você pode entrar em dynamic_sidebaração, detectar quando o widget é realmente exibido ou, mais simplesmente, colocar seu enqueue_script()direito no widget()método, como o @ChipBennet recomenda.
Tom Auger