web-dev-qa-db-fra.com

Comment utiliser wp_dequeue_style () pour le style mis en attente dans la classe WP_Widget

J'ai un plugin qui crée un widget qui met en file d'attente des CSS front-end pour dénommer le widdget. J'appelle wp_enqueue_style depuis la méthode publicwidget() dans la classe étendue WP_Widget:

<?php class FPW_Widget extends WP_Widget {

    // ...

    public function widget( $args, $instance ) {

        // enqueuing here ensure that styles only load when plugin is being displayed
        wp_enqueue_style( 'fpw_styles_css', plugins_url( 'css/fpw_styles.css', dirname(__FILE__)), false, FPW_VERSION );

Ce que j'aimerais, c’est de pouvoir rendre la file d'attente possible tout en conservant la nature conditionnelle impressionnante de la mise en file d'attente (c'est-à-dire qu'un fichier CSS n'est chargé que lorsqu'il existe un widget actif).

J'ai essayé wp_dequeue_style() à la fois sur wp_enqueue_scripts avec une priorité élevée (999) et sur widgets_init mais sans aucune chance.

Est-ce possible et, si oui, comment puis-je le faire?

5
mrwweb

La méthode widget() est appelée lors du rendu du widget, ainsi le style que vous mettez en file d'attente est imprimé dans le pied de page (l'en-tête est déjà imprimé à ce moment-là).

Même si la majorité des navigateurs peuvent restituer les styles liés à partir du corps de la page, le code HTML n'est pas valide car, conformément aux normes HTML, contrairement aux scrypts, les styles doivent être placés dans la page <head>. (Essayez de validez votre balisage , et vous verrez des erreurs).

C'est aussi la raison pour laquelle 'widgets_init' et 'wp_enqueue_scripts' ne peuvent pas être utilisés pour supprimer le style: ces hooks sont activés avant l'appel de la méthode widget() et vous ne pouvez pas supprimer un style qui n'a pas encore été ajouté.

Il y a 2 solutions.

Solution 1

La première solution suppose que vous souhaitiez conserver votre approche, même si elle n'était pas conforme aux normes HTML: une fois le style imprimé en bas de page, les utilisateurs peuvent utiliser 'wp_footer' hook pour le retirer du style.

En supposant que le style est ajouté comme:

public function widget( $args, $instance ) {
    wp_enqueue_style('fpw_styles_css');
}

peut être enlevé avec:

add_action('wp_footer', function() {
   wp_dequeue_style('fpw_styles_css');
});

Solution 2

Si vous souhaitez que votre plug-in n'imprime pas un code HTML non valide, la solution consiste à utiliser is_active_widget() pour vérifier si le widget est actif et mettre le style en file d'attente si tel est le cas:

add_action( 'wp_enqueue_scripts', function() {
  if ( is_active_widget(false, false, $widgetid) ) {
      wp_enqueue_style('fpw_styles_css');
  }
}, 5); // used priority 5 to make possible dequeue using default 10 priority

Ce faisant, le style sera ajouté dans <head> et les utilisateurs pourront le retirer du style en utilisant l’approche standard suivante: wp_dequeue_style() accroché à 'wp_enqueue_scripts'.

Le seul problème est que is_active_widget() ne vérifie pas si le widget est réellement imprimé sur une page, mais uniquement si une instance du widget est configurée dans le backend, dans une barre latérale. Cela signifie qu'il est possible que le style soit ajouté même si le widget n'est pas réellement imprimé sur la page.

Toutefois, les utilisateurs peuvent facilement supprimer le style de pages spécifiques, car les balises conditionnelles fonctionnent correctement lorsque 'wp_enqueue_scripts' est activé. Exemple:

add_action( 'wp_enqueue_scripts', function() {
  if (! is_front_page()) { // allow widget style only in front page
      wp_dequeue_style('fpw_styles_css');
  }
});
5
gmazzap