Mettre en file d'attente conditionnelle le script / la feuille de style d'un widget dans HEAD (uniquement lorsqu'ils sont présents sur la page!)

12

J'ai essayé de charger des scripts et des styles pour un widget WordPress avec les conditions suivantes ...

  1. Les scripts DOIVENT être chargés dans le HEAD (sinon ils se cassent).
  2. Les scripts doivent SEULEMENT être chargés lorsque le widget apparaît réellement (ils sont assez lourds).

J'ai fait beaucoup de recherches et cela semble être un problème commun (non résolu) ... mais j'espère que quelqu'un ici a mis en place une solution de contournement.

C’est le meilleur que j’ai eu jusqu’à présent ...

Ce qui suit est un simple widget qui imprime du texte dans la barre latérale. Il charge avec succès jQuery de manière conditionnelle (lorsque le widget est réellement affiché) ... bien que jamais dans le pied de page! (Remarque: il peut également fonctionner uniquement avec WordPress 3.3 , bien que ce hack peut fournir une compatibilité ascendante).

class BasicWidget extends WP_Widget
{

    function __construct() {
        parent::__construct(__CLASS__, 'BasicWidget', array(
            'classname' => __CLASS__,
            'description' => "This is a basic widget template that outputs text to the sidebar"
        ));
    }

  function form($instance) {
    $instance = wp_parse_args( (array) $instance, array( 'title' => '' ) );
    $title = $instance['title'];
?>
  <p><label for="<?php echo $this->get_field_id('title'); ?>">Title: <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($title); ?>" /></label></p>
<?php
  }

  function update($new_instance, $old_instance) {
    $instance = $old_instance;
    $instance['title'] = $new_instance['title'];
    return $instance;
  }

  function widget($args, $instance) {

    extract($args, EXTR_SKIP);

    echo $before_widget;
    $title = empty($instance['title']) ? ' ' : apply_filters('widget_title', $instance['title']);

    if (!empty($title))
      echo $before_title . $title . $after_title;;

    echo "<h1>This is a basic widget!</h1>";

    echo $after_widget;

        // if we're echoing out content, enqueue jquery.

        if (!empty($after_widget)) {
            wp_enqueue_script('jquery');
        }
    }
}
add_action( 'widgets_init', create_function('', 'return register_widget("BasicWidget");') );

Il semble que dès que WordPress commence à gérer les widgets, il est trop tard pour mettre en file d'attente (ou même annuler l'enregistrement de quelque chose précédemment mis en file d'attente).

Toutes les idées seraient très appréciées!

Mark.

    
posée Mark Jeldi 01.04.2012 - 21:06

3 réponses

15

Wordpress en tant que fonction sympa is_active_widget que vous pouvez utiliser dans votre __construct et tester si le widget est présent dans la page en cours et ajouter vos scripts / styles en fonction de cet ex:

function __construct() {
    parent::__construct(__CLASS__, 'BasicWidget', array(
        'classname' => __CLASS__,
        'description' => "This is a basic widget template that outputs text to the sidebar"
    ));
     if ( is_active_widget(false, false, $this->id_base) )
        add_action( 'wp_head', array(&$this, 'add_styles_and_scripts') );
}

function add_styles_and_scripts(){
    //since its wp_head you need to echo out your style link:
    echo '<link rel="stylesheet" href="http://example.com/css/style.css" type="text/css" />';
    //as for javascript it can be included using wp_enqueue_script and set the footer parameter to true:
    wp_enqueue_script( 'widget_script','http://example.com/js/script.js',array(),'',true );
}
    
réponse donnée Bainternet 01.04.2012 - 21:57
0

Vous pouvez également essayer le plug-in "Widget Logic" ... il utilise des instructions conditionnelles pour le chargement du widget.

C'est plutôt penser en sens inverse, mais le résultat devrait être celui attendu.

wp_print_scripts & wp_print_styles pourrait être le bon hook, ajoutez simplement des actions à ces points d'ancrage avec quelque chose de priorité 100 - pour être le dernier en file d'attente. wp_enqueue_script (), wp_enqueue_style (), wp_deregister_script (), wp_deregister_style () ...

Vos problèmes avec le code ci-dessus sont peut-être dépourvus du paramètre prioritaire (non testé)? codex WP

    
réponse donnée Martin Zeitler 04.04.2012 - 03:47
-1

Vous pouvez simplement utiliser wp_enqueue_script ou wp_enqueue_style dans la méthode du widget (fonction) de votre classe Widget personnalisée. Les scripts ne seront chargés que si le widget est actif. Voir les détails et les exemples ici: enlace

    
réponse donnée iStefan 10.04.2016 - 23:00

Lire d'autres questions sur les étiquettes