Wie fügt man andere Plugins CSS-Dateien in einen Shortcode ein?

Ich habe ein Plugin programmiert, das unter anderem einen Shortcode erstellt. Dieser Shortcode erwartet einen post_id-Parameter, extrahiert den Inhalt dieses Posts und gibt den gefilterten Inhalt dieses Posts zurück (z. B. wendet er alle Filter an, so dass ein anderer Shortcode in diesem Inhalt erstellt wird). Hier ist eine verkürzte Version des Codes:

public static function myshortcode($atts = null, $content = "") { global $wp_filter, $merged_filters, $wp_current_filter, $post; if (is_array($atts)) extract($atts, EXTR_OVERWRITE); $save_wp_filter = $wp_filter; $save_merged_filters = $merged_filters; $save_wp_current_filter = $wp_current_filter; $post = get_post($post_id); setup_postdata($post); $content = $post->post_content; $content = apply_filters('the_content', $content); $content = str_replace(']]>', ']]>', $content); $wp_filter = $save_wp_filter; $merged_filters = $save_merged_filters; $wp_current_filter = $save_wp_current_filter; return $content; } 

Alles funktioniert gut, außer dass andere Plugins-Shortcodes keine eigenen CSS-Dateien enthalten (zB Ultimate Addons für Visual Composer hat seine eigenen CSS-Dateien zu enthalten, aber sie enthält sie nicht, wenn sie auf diese Weise aufgerufen werden). Ich vermute, das Problem ist, dass wenn WP den “the_content” Hook für meinen Shortcode ausführt (nicht den, den ich explizit anrufe, sondern den Hook, den WP selbst an erster Stelle aufruft und der zu meiner Shortcode-Ausführung führt), ist es schon zu spät Fügen Sie CSS-Dateien in die Seite ein (zB ist das -Tag bereits geschlossen), und WordPress hat zu diesem Zeitpunkt die Möglichkeit gegeben, CSS-Dateien nur in die Plugins aufzunehmen, die für die Seite benötigt werden (zB nur mein Plugin, weil die Seite zunächst nur meinen Shortcode enthält).

Ich könnte wp_enqueue_style verwenden, um explizit die erforderlichen CSS-Dateien von Drittanbietern hinzuzufügen, aber das Problem ist, dass ich sie auf eine tragbare Weise einbeziehen möchte. Heute ist das Problem Ultimate Addons für VC, morgen wird Content Egg oder etwas anderes sein. Die beste Lösung wäre, die function von WP aufzurufen, die die Entscheidung über die erforderlichen Plugins für die Seite trifft und sie aufruft. Dabei wird der eigentliche Inhalt der Seite übergeben, nachdem der Shortcode ausgeführt wurde, und nicht der Inhalt Die Seite hat vor meiner Kurzwahl geklappt.

Existiert eine solche WP-function?

BEARBEITEN:

Zur Klarstellung nach den Kommentaren, ja, meine Shortcode ist wie [embed_page id = “123”], außer dass ich es umgekehrt brauche, zB [embed_post id = “123”] in einer Seite. Es besteht kein Risiko von Schleifen, da es nur zum Einbetten von Beiträgen in Seiten verwendet werden soll und nicht für Posts gedacht ist. Und schließlich enthält der eingebettete Inhalt auch andere Shortcodes von Drittanbietern, die automatisch ihr eigenes CSS, JS, was auch immer einfügen sollten.

EDITIEREN NACH EMPFANGENEN ANTWORTEN:

Die kurze Antwort ist nein, es gibt keine solche function in WordPress. Die lange Antwort ist unten. Ich möchte sowohl @majick als auch @cjbj für ihre ausführlichen und detaillierten Antworten belohnen, aber ich muss einen auswählen …

Solutions Collecting From Web of "Wie fügt man andere Plugins CSS-Dateien in einen Shortcode ein?"

Ich denke, Sie könnten das umgehen, indem Sie die Shortcodes auf der Seite vorlaufen lassen, indem Sie die Inhaltsfilter anwenden, bevor der Header ausgegeben wird. Dies sollte ermöglichen, dass interne Shortcodes, die in dem enthaltenen Post ausgeführt werden, alle Action-Hooks und somit alle benötigten Stylesheets / Ressourcen hinzufügen.

 add_action('wp_loaded','maybe_prerun_shortcodes'); function maybe_prerun_shortcodes() { if (is_page()) { global $post; if (has_shortcode($post->post_content,'embed_post')) { $content = apply_filters('the_content',$post->post_content); } } } 

BEARBEITEN Das oben genannte fügt nur Stylesheets und Ressourcen in die Warteschlange ein, die innerhalb von Shortcode-Aufrufen im eingebetteten Post eingereiht sind (was zwar besser ist, aber nicht oft gemacht wird). Es sollte für diese Fälle funktionieren, da die Filter auf den aktuellen angewendet werden Der Seiteninhalt führt den eingebetteten Shortcode aus, der dann Filter für den eingebetteten Post anwendet (in Ihrer bestehenden function).

Um jedoch die Stylesheets für einen bestimmten Beitrag zu erhalten, müssten Sie diesen bestimmten Beitrag abrufen (weshalb die iframe-Methode gut funktioniert, angesichts der bereits besprochenen Probleme.)

Meine vorgeschlagene Problemumgehung in diesem Fall besteht darin, die in einen Beitrag geladenen Stilressourcen zu speichern, wenn der Beitrag geladen wird …

 add_filter('style_loader_tag','custom_store_style_tags',11,2) function custom_store_style_tags($tag,$handle) { global $styletags; $styletags[$handle] = $tag;} } add_action('wp_footer','custom_save_style_tags'); function custom_save_style_tags() { global $embedstyles; if (is_single()) { global $styletags, $post; update_post_meta($post->ID,'styletags',$styletags); } elseif (is_array($embedstyles)) { global $styletags; foreach ($embedstyles as $handle => $tag) { if (!array_key_exists($handle,$styletags)) {echo $tag;} } } } 

Dann können Sie den Shortcode verwenden, um die Style-Tags abzurufen, die abgerufen werden sollen, und der zweite Teil der obigen function gibt sie in der Fußzeile aus:

 public static function myshortcode($atts = null, $content = "") { // EXISTING CODE SNIPPED global $embedstyles; $embedstyle = get_post_meta($post_id,'styletags',true); if (is_array($embedstyle)) { if (!is_array($embedstyles)) {$embedstyles = array();} $embedstyles = array_merge($embedstyle,$embedstyles); } return $content; } 

Und Sie können das gleiche für Skripte über den script_loader_tag Filter script_loader_tag und einfach die Variablen ändern, damit sie übereinstimmen …

Natürlich gibt es immer noch die Möglichkeit, dass einige body classn nicht durch Stile angesprochen werden, wie bereits von @cjbj erwähnt … oder einige Skripte können in der Fußzeile initialisiert werden, selbst wenn sie richtig eingereiht sind.

… und es berücksichtigt keine Inline-Styles / Scripts, die auf der Seite gedruckt (nicht in der Warteschlange) sind … aber es ist ein guter Anfang … hängt davon ab, wie weit Sie damit gehen wollen.

Das mag eine dumme Idee sein, aber es könnte funktionieren:

1 Lassen Sie Ihren query_var mit einem benutzerdefinierten query_var ( Lernprogramm ) zu einem iframe explodieren. So was:

  

2 In Ihrer single.php erkennen Sie den query_var und überspringen in diesem Fall den visuellen Header, Sidebars, Footer – alles, was nicht mit dem Post-Inhalt selbst verbunden ist.

Auf diese Weise laden Sie den Post auf die übliche Weise und vermeiden alle Probleme mit anderen Shortcodes, die nicht vollständig tun, was sie tun sollten.

Bearbeiten – Erklärung nach Kommentaren

Die Philosophie hinter diesem Ansatz ist, dass Sie keine Ahnung haben, was Plugins von Drittanbietern tun, vielleicht sogar unabhängig von der Ausführung des Shortcodes. Also, wenn du versuchst herauszufinden, was der Shortcode macht, vermisst du vielleicht Dinge. Zum Beispiel kann ein Shortcode zur Erzeugung von html und der Aufnahme einer css Datei führen, aber das Plugin kann auch eine body_class hinzufügen, von der das css abhängt. Es gibt keine Möglichkeit zu wissen. Um sicherzustellen, dass sich das externe Plug-in / Shortcode wie erwartet verhält, ist es am besten, wenn WP die gesamte Seite lädt. Daher der iframe .

Jetzt haben Sie das Problem, dass Sie eine ganze Seite erhalten, einschließlich Kopfzeile, Menü, Seitenleisten und so weiter. Sie benötigen also eine Vorlage, die nur the_title() und the_content() und eventuell andere Teile des the_title() the_content() . In gewisser Weise müssen Sie WP sagen, dass Sie das nicht wollen. WP muss wissen, ob es eine normale single.php oder eine nackte single.php erzeugen soll. Dies ist der query_var an dem query_var . Indem Sie es der URL hinzufügen, die in Ihrem Shortcode generiert wurde, geben Sie WP den Hinweis, dass dies kein normaler Aufruf von single.php . Dies ist immer noch relativ einfach, da Sie mit nur ein paar Zeilen Code eine benutzerdefinierte query_var einrichten können.

Die Dinge werden kompliziert, wenn Sie Ihren Shortcode in einem Plugin haben wollen, denn dann wissen Sie auch nicht, was das Thema macht. Sie müssen das Thema single.php und müssen Ihre bare bones single.php . Da Sie nicht wissen, wie das Thema aufgebaut ist, werden Sie nicht sicher sein, ob der Beitrag das gleiche Format wie das Thema hat. Sie könnten auch Ihr Plugin analysieren single.php und unerwünschte Elemente entfernen, aber das ist eine wilde Vermutung. Es kann auch benutzerdefinierte Vorlagen wie single-custompage.php . Wenn Sie diesem Pfad folgen, empfiehlt es sich daher, eine Optionsseite einzubeziehen, mit der Benutzer die Stile von Posts festlegen können, die in Seiten enthalten sind.

  • Laden Sie visual compose css

     function get_visual_composer_style($id) { return ''; } 
  • Laden Sie css basierend auf dem Shortcode

     function custom_shortcode_scripts() { global $post; if( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'custom-shortcode') ) { wp_enqueue_script( 'custom-script'); } } add_action( 'wp_enqueue_scripts', 'custom_shortcode_scripts');