web-dev-qa-db-de.com

Verwendung von wp_dequeue_style () für Stile in der WP_Widget-Klasse

Ich habe ein Plugin, das ein Widget erstellt, das Front-End-CSS in die Warteschlange einfügt, um das Widdget zu formatieren. Ich rufe wp_enqueue_style von der publicwidget() -Methode in der erweiterten WP_Widget -Klasse auf:

<?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 );

Was ich möchte ist, in der Lage zu sein, diese Dequeue-fähig zu machen, während die fantastische Konditionalität der Enqueue-Funktion beibehalten wird (d. H. CSS-Datei wird nur geladen, wenn ein Widget aktiv ist).

Ich habe wp_dequeue_style() sowohl auf wp_enqueue_scripts mit hoher Priorität (999) als auch auf widgets_init ausprobiert, aber ohne Erfolg.

Ist das möglich und wenn ja, wie kann ich das tun?

5
mrwweb

Die Methode widget() wird beim Rendern des Widgets aufgerufen, sodass der Stil, den Sie in die Warteschlange stellen, in der Fußzeile gedruckt wird (die Kopfzeile wird zu diesem Zeitpunkt bereits gedruckt).

Selbst wenn die Mehrheit der Browser Stile rendern kann, die über den Seitenkörper verlinkt wurden, ist dies ungültiges HTML, da Stile gemäß HTML-Standards im Gegensatz zu Skripten in der Seite <head> platziert werden müssen. (Versuchen Sie, Ihr Markup zu validieren , und Sie werden Fehler sehen).

Dies ist auch der Grund, warum 'widgets_init' und 'wp_enqueue_scripts' nicht zum Entfernen des Stils verwendet werden können: Diese Hooks werden ausgelöst, bevor die Methode widget() aufgerufen wird, und Sie können einen noch nicht hinzugefügten Stil nicht entfernen.

Es gibt 2 Lösungen.

Lösung 1

Bei der ersten Lösung wird davon ausgegangen, dass Sie Ihren Ansatz beibehalten möchten, auch wenn er nicht den HTML-Standards entspricht: Sobald der Stil in der Fußzeile gedruckt wurde, können Benutzer den Stil mit dem Hook 'wp_footer' entschlüsseln.

Angenommen, der Stil wird wie folgt hinzugefügt:

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

kann entfernt werden mit:

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

Lösung 2

Wenn Sie möchten, dass Ihr Plugin kein ungültiges HTML ausgibt, können Sie mit is_active_widget() prüfen, ob das Widget aktiv ist, und den Stil in eine Warteschlange einreihen, wenn dies der Fall ist:

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

Auf diese Weise wird der Stil in <head> eingefügt, und Benutzer können den Stil mithilfe der folgenden Standardmethode aus der Warteschlange entfernen: wp_dequeue_style() hooked in 'wp_enqueue_scripts'.

Das einzige Problem ist, dass is_active_widget() nicht überprüft, ob das Widget tatsächlich auf einer Seite gedruckt wird, sondern nur, ob eine Instanz des Widgets im Backend in einer Seitenleiste konfiguriert ist. Es ist möglich, dass der Stil hinzugefügt wird, auch wenn das Widget nicht auf der Seite gedruckt wird.

Benutzer können den Stil jedoch einfach für bestimmte Seiten entfernen, da bedingte Tags ordnungsgemäß funktionieren, wenn 'wp_enqueue_scripts' ausgelöst wird. Beispiel:

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