Übergeben von Werten von einem Widget an eine function innerhalb eines Plugins

Ich habe ein Plugin, das mit vielen Widgets erstellt wird. Das Paket eines Widgets. Jedes Widget erstellt seinen eigenen benutzerdefinierten CSS-Code.

Anstelle von unordentlichem Quellcode, in dem ich 15 verschiedene Inline-CSS-Codes anzeigen kann, möchte ich den benutzerdefinierten CSS-Code von jedem Widget an eine benutzerdefinierte CSS-Hauptdatei übergeben, die ich über WordPress AJAX erstellt habe.

Ich werde die functionen anzeigen, die ich eingerichtet habe, um dies zu ermöglichen.

Die AJAX erstellte CSS-Datei

Die folgende CSS-Datei wird über WordPress AJAX erstellt. Es ermöglicht mir, benutzerdefinierte CSS-statementen in der Datei zu platzieren. Es enthält auch einen Filter, in dem ich hoffe, das extra generierte CSS von den Widgets an diese function (Datei) weitergeben zu können.

/** * Echo the CSS for the custom widgets style */ public function advanced_widget_pack_css() { if(empty($_GET['action']) || $_GET['action'] != 'advanced_widget_pack_gen_css') return; if(!isset($_GET['ver'])) return; $css_text = ''; /* ============================= */ /* Archives Widget */ /* ============================= */ $css_text .= ".awp_archives_colour { color:".awp_option('awp_archives_dropdown_inst_colour')." !important }\n"; /** * Filter for any incoming CSS */ $css_text = apply_filters('advanced_widget_pack_css', $css_text); header("Content-type: text/css"); echo $css_text; exit(); } 

Eine der Widget-classn mit individuell generiertem CSS-Code

Der folgende Code ist ein Ausschnitt aus einem der vielen Widgets, die im Plugin verwendet werden. Das Widget erstellt benutzerdefinierten CSS-Code und speichert ihn in der Variablen $sc_css . Was ich von hier aus tun möchte, gebe den Inhalt der Variablen $sc_css oder $sc_css den Inhalt der function advanced_widget_pack_css() die ich zuvor erstellt habe.

 class Advanced_Widget_Pack_Widget_Archives extends WP_Widget { public function __construct(){ // This filter hooks the custom genrated css code to the advanced_widget_pack_css function add_filter('advanced_widget_pack_css', array(&$this,'awp_pass_css_code')); } public function form($instance) {} public function widget($args, $instance){ extract($args); // All the widget code is contained here.... // Styling for the shortcode if($is_awp_sc == 'true'){ /* Generate unique id if shortcode - used for styling */ $sc_id = mt_rand(1, 100000); $sc_css = ".awp_archive_widget_sc".$sc_id." { border:".$awp_archives_border_width.' '.$awp_archives_border_style.' '.$awp_archives_border_color." !important }\n"; $sc_css .= $awp_archives_border_radius == 'round' ? '.awp_archive_widget_sc'.$sc_id.' { -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px }' : ''.''." \n"; $sc_css .= ".awp_archive_widget_sc".$sc_id." li a, .awp_archive_widget_sc".$sc_id." li { font-size:".$awp_archives_font_size." !important }\n"; $sc_css .= ".awp_archive_widget_sc".$sc_id." li a { color:".$awp_archives_link_std." !important }\n"; $sc_css .= ".awp_archive_widget_sc".$sc_id." li a:hover { color:".$awp_archives_link_hover." !important }\n"; // This should pass the variable echo $this->awp_pass_css_code($sc_css); } // The widget code gets outputted here } // This function is created to pass the content of the variable $sc_css to the advanced_widget_pack_css function function awp_pass_css_code( $sc_css ) { return $sc_css; } } 

Die Probleme

Ich habe versucht, dies zu erreichen, indem ich den Inhalt der Variable $sc_css an eine function innerhalb des Widgets übergebe und ihn dann über einen WordPress-Filter an die function advanced_widget_pack_css() anhefte.

Das Problem besteht darin, dass der Inhalt der Variablen immer leer ist, wenn sie an das von AJAX generierte Stylesheet übergeben werden.

Solutions Collecting From Web of "Übergeben von Werten von einem Widget an eine function innerhalb eines Plugins"

Zunächst einmal kann ich sagen, warum dein Code nicht funktioniert.

Das benutzerdefinierte CSS wird innerhalb der widget function erstellt, die von WordPress aufgerufen wird, sobald das Widget angezeigt wird.

Ich schätze, dass Sie im Dokument bereit eine Ajax-Anfrage senden, die advanced_widget_pack_css() function advanced_widget_pack_css() aufruft. Aber jede Ajax-Anfrage ist eine komplett neue http-Anfrage, dass der einzige Bereich eine function ausführt, sicher kein Widget einbetten.

Aus diesem Grund ruft die neue Anfrage über Ajax niemals die widget() -Methode in Ihrer Widget-class auf und so werden natürlich keine CSS hinzugefügt.

Sagte das, denke eine Minute für das, was du tust.

Angenommen, Ihr Workflow funktioniert, schlägt er fehl, wenn der Benutzer keine js aktiviert hat. Und selbst wenn die js aktiviert sind, wird die Seite ohne benutzerdefinierte CSS geladen, die auf AJAX-Anfrage geladen werden sollte (und AJAX in WordPress sind nicht sehr schnell …) also:

  • wenn kein js kein css so gut
  • Auch wenn js Seite ohne CSS laden, so haben Sie Widget für eine Sekunde oder mehr unstyled
  • Der Browser darf die CSS nicht zwischenspeichern

Dein Code funktioniert also nicht (ich habe dir ja erklärt warum), aber selbst wenn du einen Weg findest, es zu machen, ist das keine großartige Lösung.

Was kann eine Lösung sein?

Zuerst im Widget isolieren die function, die die benutzerdefinierte CSS generiert.

Danach sollten Sie die function nicht über die Methode widget() , sondern über die Methode update aufrufen. Auf diese Weise wird das CSS jedes Mal generiert, wenn das Widget aktualisiert wird, und Sie können das neu erzeugte CSS speichern, um es in einer CSS-Datei zu speichern .

Es empfiehlt sich, diese Datei im Ordner uploads zu speichern, da Sie sicher sind, dass der Ordner von WP aus schreibbar ist.

Pseudocode:

 class Advanced_Widget_Pack_Widget_Archives extends WP_Widget { function generate_css( $instance ) { // some code here to generate css from instance arguments... return $sc_css; } function update( $new_instance, $old_instance ) { // some code here to update the widget instance... $css = $this->generate_css( $new_instance ); $upload_dir = wp_upload_dir(); $path = $upload_dir['basedir'] . '/myplugin/myplugin-customwidget.css'; if ( ! file_exists($upload_dir['basedir'] . '/myplugin') ) mkdir($upload_dir['basedir'] . '/myplugin'); file_put_contents($path, $css); } } 

Danach können Sie die soeben mit WordPress-Standard erstellte Datei in die Warteschlange stellen …

Alternativ zu dieser Methode generieren Sie die CSS in der widget() -Methode (wie Sie bereits tun) und nur als Inline-Stil in der Markup-Ausgabe.

Eine schnelle Lösung für Sie ist es, alle generierten CSS-Daten in einem serialisierten Array in der WordPress-database zu speichern und mit get_option/set_option