Comment mettre en file d'attente le script si le widget est affiché sur la page?

8

J'ai créé un widget qui utilise un plugin jquery, et j'ai utilisé is_active_widget pour mettre le script en file d'attente, cela fonctionne bien mais il inclut également le script même sur les pages qui ne montrent pas ce widget. existe-t-il un moyen de ne mettre le script en file d'attente que si ce widget s'affiche?

Merci d'avance.

Pierre
la source

Réponses:

11

Vous devriez pouvoir appeler wp_enqueue_script()dans le cadre de la sortie de votre widget.

Éditer

Rapide et sale, en utilisant l' exemple de classe API Widgets 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' );
?>

Ajoutez votre wp_enqueue_script()appel en ligne , dans la sortie de votre widget - c'est-à-dire dans 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
la source
En fait, c'est ce que je fais et j'utilise is_active_widget () mais cela mettra le script en file d'attente sur toutes les pages si le widget est actif même sur une seule.
Pierre
L'utilisation is_active_widget()n'est pas la même chose que d'appeler wp_enqueue_script()depuis la sortie de votre widget . Voir la réponse mise à jour.
Chip Bennett
merci pour la mise à jour, mais que voulez-vous dire par l'exemple rapide et sale ou de cette façon pour utiliser wp_enqueue_script ()? et une autre question hors sujet s'il vous plaît, je vois beaucoup de ces fonctions privées et publiques avant dans les widgets alors que font-ils? et devrions-nous les utiliser des widgets spécifiques aux thèmes? et merci beaucoup :)
Pierre
Par " exemple rapide et sale ", je veux dire que je fais référence à la construction de classe Widget standard, comme décrit dans l'article Codex lié. Je suppose que vous avez écrit votre widget personnalisé à l'aide de l'API Widgets. Sinon, vous devriez l' être; mais néanmoins, si vous avez besoin de conseils plus spécifiques, nous aurons besoin de voir votre code Widget.
Chip Bennett
Ça ne marche pas. Je ne sais pas si cela fonctionnait, car il a été marqué comme réponse. Mais pour le moment, le formulaire de widget est déclenché après l'action wp_enqueue_scripts
Omar Abid
6

Si le script doit aller dans la <head>section:

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

  }


}

Sinon, la solution de Chip Bennett fonctionnera pour la mettre en file d'attente dans le pied de page.

La $did_scriptvariable statique n'est pas requise, je l'ai utilisée juste pour éviter d'autres appels inutiles à wp_enqueue_scripts'il y a plusieurs instances de widget sur la page ...

onetrickpony
la source
1
Idée sympa, mais cela ne répond pas réellement à la question de l'OP, car is-active_widget()vous permet simplement de savoir si un widget a été activé (c'est-à-dire: glissé dans l'une des zones de la barre latérale dans Apparence> Widgets), par opposition à apparaître réellement sur une page donnée .
Tom Auger
La condition est incorrecte: (1) is_active_widget renverra un sidebar_id, même si cette barre latérale n'est pas affichée sur la page actuelle. Cela ajoutera le script sur chaque page. (2) wp_enqueue_script n'ajoutera un script qu'une seule fois, même si vous l'appelez plusieurs fois. pas besoin de self::$did_script (3) car __constructest appelé à chaque demande de page, même si le widget n'est même pas affiché
Philipp
2

Pierre,

La façon dont je gère cela est avec wp_enqueue_scriptet wp_dequeue_script, et utilise une variable d'instance $is_activedans la classe Your_Widget

Il en va de même en wp_enqueue_scriptfonction de la mise en is_active_widgetfile d'attente du script sur toutes les pages mais avec le paramètre de pied de page défini sur true. Notez que la file d'attente est exécutée en priorité pour vous assurer qu'elle s'exécute avant la sortie des 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 );
  }

}

Ensuite, dans la fonction widget, indiquez si le widget est actif sur cette page

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

Ensuite, dans le pied de page, retirez le script si le widget n'est pas actif sur cette page

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

Cette approche de mise en file d'attente puis de retrait de la file d'attente si elle n'est pas utilisée fonctionne également bien pour les plugins qui définissent des codes courts qui nécessitent des scripts

Russell Jamieson
la source
0

J'ai considéré le crochet 'wp_footer' parce que ce crochet est exécuté au pied de page, et est probablement le meilleur moyen d'ajouter des scripts uniquement là où le widget est utilisé.

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
la source
1
Pouah. wp_enqueue_script()S'il vous plaît. Pas d'impression directe de JS.
Tom Auger
J'ai peur que wp_enqueue_script () ne fonctionne pas ici car le hook en plus de wp_enqueue_script est tiré bien avant que le widget ne soit réellement appelé.
Dipesh KC
Vous pouvez appeler wp_enqueue_script () à tout moment avant l'action wp_footer. Le widget est appelé lors de la construction de la page de modèle. Vous pouvez soit vous accrocher à l' dynamic_sidebaraction, détecter quand votre widget est réellement affiché, ou, plus simplement, simplement mettre votre enqueue_script()droit dans la widget()méthode, comme le recommande @ChipBennet.
Tom Auger