Wie erkennt man, ob eine function auf einer Seite ausgetriggers wurde, so dass Skripte / Stile bedingt geladen werden können

Ich baue ein kleines Galerie-Plugin und möchte nur Skripte / Stile auf die Seite laden, WENN die Galerie über das Template-Tag geladen wurde. Das Schablonen-Tag kann einen Post-ID-Parameter annehmen, wenn es verwendet wird, um die Galerie eines Posts von wo auch immer innerhalb des Themas aufzurufen.

Ich weiß, wie man das auf einzelnen Seiten macht (ich kann einfach den meta_key nachschlagen und ihn mit dem aktuell angesehenen Beitrag abgleichen), aber es ist schwieriger festzustellen, ob sich eine Galerie auf der Homepage (oder irgendeiner anderen Seite) befindet.

Nehmen wir an, das Template-Tag sieht ungefähr so ​​aus:

if ( function_exists( 'my_gallery' ) ) echo my_gallery( '100' ); // gallery of image from post 100 will be shown 

Und die Galerie-function sieht so aus (vereinfacht):

 function my_gallery( $post_id = '' ) { // whole bunch of stuff in here which is returned } 

Die Skripte und Stile für die Galerie würden so aussehen (vereinfacht):

 function my_gallery_scripts() { wp_register_script( 'my-gallery-js', MY_GALLERY_URL . 'js/my-gallery.js', array( 'jquery' ), '1.0', true ); wp_register_style( 'my-gallery-css', MY_GALLERY_URL . 'css/my-gallery.css', '', '1.0', 'screen' ); // need to load these conditionally, but how? wp_enqueue_style( 'my-gallery-js' ); wp_enqueue_script( 'my-gallery-css' ); } add_action( 'wp_enqueue_scripts', 'my_gallery_scripts' ); 

Ich habe versucht, set_query_var in my_gallery() zu verwenden, um eine globale Variable in $ wp_query zu setzen.

  function my_gallery( $post_id = '' ) { set_query_var( 'has_gallery', true ); // whole bunch of stuff in here which is returned } 

Das Problem ist jedoch, dass ich get_query_var innerhalb der Aktion wp_enqueue_scripts .

Das folgende wäre also ideal für mich, glaube ich, das Laden von has_gallery in das $ wp_query-Objekt, das mir auf jeder Seite zur Verfügung stehen würde (außer es funktioniert nicht).

  function my_gallery_scripts() { wp_register_script( 'my-gallery-js', MY_GALLERY_URL . 'js/my-gallery.js', array( 'jquery' ), '1.0', true ); wp_register_style( 'my-gallery-css', MY_GALLERY_URL . 'css/my-gallery.css', '', '1.0', 'screen' ); // does not work $has_gallery = get_query_var( 'has_gallery' ); if ( $has_gallery ) { wp_enqueue_style( 'my-gallery-js' ); wp_enqueue_script( 'my-gallery-css' ); } } add_action( 'wp_enqueue_scripts', 'my_gallery_scripts' ); 

Gibt es eine andere Möglichkeit, eine globale Option wie set_query_var festzulegen, die aber in meinem Szenario funktioniert? Ich möchte natürlich die Verwendung einer globalen Variable vermeiden. Ich habe auch versucht, eine Konstante ohne Erfolg zu setzen.

Solutions Collecting From Web of "Wie erkennt man, ob eine function auf einer Seite ausgetriggers wurde, so dass Skripte / Stile bedingt geladen werden können"

Für Skripte ist das kein Problem – einfach in die my_gallery() function my_gallery() und sie werden in der Fußzeile ausgegeben (da der Header bereits übergeben wurde).

Stylesheets sind jedoch eine Herausforderung, sie sollten nur im head funktionieren und Enqueueing für die Fußzeile wird nicht unterstützt.

Im Wesentlichen müssen Sie wissen, ob die function aufgerufen wurde, bevor sie aufgerufen wurde. Dies hat keine einfache Lösung für gegebene Bedingungen.

Ich würde wahrscheinlich versuchen, Stylesheet aus JS-Code zu laden, um dies in der Form zu erreichen, die Sie beschreiben.

Der beste Weg, den ich mir vorstellen könnte (und mit besten ich meine “arbeiten”, nicht “schnell”), ist, den Inhalt der Post auf die Existenz dieses Shortcodes zu überprüfen. Mit der Regex-corefunktion ist das ganz einfach.

Schritt 1: Registrieren

 /** * Register the needed assets */ add_action( 'wp_enqueue_scripts', 'wpse_105537_register_assets', 0 ); function wpse_105537_register_assests() { wp_register_script( 'wpse_105537_script', // ETC. ); wp_register_style( 'wpse_105537_style', // ETC. ); } 

Schritt 2: Enqueue

 /** * Enqueue the needed assets if the shortcode is present anywhere */ add_action( 'wp_enqueue_scripts', 'wpse_105537_register_assets' ); function wpse_105537_enqueue_assets() { if ( ! wpse_105537_check_content() ) return; wp_enqueue_script( 'wpse_105537_script' ); wp_enqueue_style( 'wpse_105537_style' ); } 

Helfer: Suche den Shortcode in den Post-Inhalten

Diese Hilfsfunktion bricht nach der ersten Übereinstimmung ab.

 /** * Check if any of the posts has the shortcode in its post_content * @return bool */ function wpse_105537_check_content() { global $wp_query; foreach ( $GLOBALS['wp_query']->posts as $post ) { $pattern = get_shortcode_regex(); if ( preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches ) AND array_key_exists( 2, $matches ) AND in_array( 'gallery', $matches[2] ) ) return true; } return false; } 

Ich weiß, wie man das auf einzelnen Seiten macht (ich kann einfach den meta_key nachschlagen und ihn mit dem aktuell angesehenen Beitrag abgleichen), aber es ist schwieriger festzustellen, ob sich eine Galerie auf der Homepage (oder irgendeiner anderen Seite) befindet.

Wenn es also einen Metaschlüssel gibt, wäre es noch einfacher: Nimm ihn früh. Die ersten beiden functionen können der anderen Antwort entnommen werden. Nur die Prüfung selbst würde durch die folgende function ersetzt:

 /** * Check if any of the posts has the needed gallery meta data attached * @return bool */ function wpse_105537_check_meta() { global $wp_query; foreach ( $GLOBALS['wp_query']->posts as $post ) { if ( '' !== get_post_meta( $post->ID, 'your_meta_key', true ) ) return true; } return false; }