J'ai essayé de charger des scripts et des styles pour un widget WordPress avec les conditions suivantes ...
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.
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 );
}
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