web-dev-qa-db-fra.com

Mettre en attente conditionnelle le script/la feuille de style d'un widget dans HEAD (uniquement si présent sur la page!)

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 s'affiche 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 jusqu'à présent ...

Ce qui suit est un simple widget qui affiche 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 ne peut également fonctionner que sur WordPress 3.3 , bien que ce hack puisse 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 qu'une fois que WordPress commence à gérer les widgets, il est trop tard pour mettre en file d'attente (ou même désenregistrer quelque chose précédemment mis en file d'attente).

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

Marque.

12
Mark Jeldi

Wordpress en tant que fonction agréable 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 exemple:

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 );
}
15
Bainternet

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

C'est tout à fait penser l'inverse - mais le résultat devrait être comme prévu.

wp_print_scripts & wp_print_styles peuvent être les hooks appropriés, il suffit d’ajouter des actions à ces hooks avec la priorité 100 (quelque chose d’autre) - pour être le dernier en file d'attente. wp_enqueue_script (), wp_enqueue_style (), wp_deregister_script (), wp_deregister_style () ...

Votre problème avec le code ci-dessus pourrait manquer le paramètre de priorité (non testé)? WP codex

0
Martin Zeitler