Laden von Skripten nur, wenn ein bestimmter Shortcode oder ein bestimmtes Widget vorhanden ist
-
-
Sind Skripteim Headerfür Ihre Situation schwierig?Skripte am Ende der Seite sind unterbestimmten Bedingungeneinfacher zu handhaben und werdenfür die Leistungempfohlen.Are scripts in header hard requirement for your situation? Scripts at end of page are easier to deal with conditionally and recommended practice for performance.
- 0
- 2010-09-28
- Rarst
-
Ich habees zuerstin wp_footer versucht,wodurch das Vorfiltern des Inhalts überflüssig wird,aber obwohl die Skriptegutgeladen wurden,funktionierten sienicht.Diese Skriptemüssen sichin wp_headbefinden,um das zutun,was siebenötigen.I did try it in wp_footer first which nicely eliminates the need for prefiltering the content, but while the scripts loaded fine, they didn't work. These scripts have to be in wp_head to do what they need to.
- 0
- 2010-09-28
- Ashley G
-
4 Antworten
- Stimmen
-
- 2010-09-28
Sie können die Funktion is_active_widget verwenden. Zum Beispiel:
function check_widget() { if( is_active_widget( '', '', 'search' ) ) { // check if search widget is used wp_enqueue_script('my-script'); } } add_action( 'init', 'check_widget' );
Um das Skript auf der Seite zu laden,auf dernur das Widgetgeladenist,müssen Sie den Codeis_active_widget ()in Ihre Widget-Klasseeinfügen. Siehebeispielsweise das Standard-Widgetfür aktuelle Kommentare (wp-includes/default-widgets.php,Zeile 602):
class WP_Widget_Recent_Comments extends WP_Widget { function WP_Widget_Recent_Comments() { $widget_ops = array('classname' => 'widget_recent_comments', 'description' => __( 'The most recent comments' ) ); $this->WP_Widget('recent-comments', __('Recent Comments'), $widget_ops); $this->alt_option_name = 'widget_recent_comments'; if ( is_active_widget(false, false, $this->id_base) ) add_action( 'wp_head', array(&$this, 'recent_comments_style') ); add_action( 'comment_post', array(&$this, 'flush_widget_cache') ); add_action( 'transition_comment_status', array(&$this, 'flush_widget_cache') ); }
You can use the function is_active_widget . E.g.:
function check_widget() { if( is_active_widget( '', '', 'search' ) ) { // check if search widget is used wp_enqueue_script('my-script'); } } add_action( 'init', 'check_widget' );
To load the script in the page where the widget is loaded only, you will have to add the is_active_widget() code, in you widget class. E.g., see the default recent comments widget (wp-includes/default-widgets.php, line 602):
class WP_Widget_Recent_Comments extends WP_Widget { function WP_Widget_Recent_Comments() { $widget_ops = array('classname' => 'widget_recent_comments', 'description' => __( 'The most recent comments' ) ); $this->WP_Widget('recent-comments', __('Recent Comments'), $widget_ops); $this->alt_option_name = 'widget_recent_comments'; if ( is_active_widget(false, false, $this->id_base) ) add_action( 'wp_head', array(&$this, 'recent_comments_style') ); add_action( 'comment_post', array(&$this, 'flush_widget_cache') ); add_action( 'transition_comment_status', array(&$this, 'flush_widget_cache') ); }
-
Kann das aufgerufen werden,BEVOR die Widgetsgeladen werden?Um klar zu sein,muss dieserfolgen,bevor die Seite überhauptgeladen wird.Mein Beispielcode verwendetthe_posts,um den Inhalt der Seite zufiltern,aber dadurch werden die Seitenleisten/Widgetsnicht angezeigt.Can that be called BEFORE the widgets are loaded. To be clear this has to take place before the page even loads. My sample code uses the_posts to filter the content on the page, but that doesn't get the sidebars/widgets.
- 0
- 2010-09-28
- Ashley G
-
Ja,siehe das Beispiel,dasichmeiner Antwort hinzugefügt habe.Yes, see the example I added to my answer.
- 0
- 2010-09-28
- sorich87
-
Ihr Beispielfunktioniertnicht wirklich.Vermisseichetwas Offensichtliches?Your example doesn't actually work. Am I missing something obvious?
- 0
- 2010-09-29
- Ashley G
-
Eigentlich warich.wp_enqueue_script scheintnicht zufunktionieren,wennes auf wp_head angewendet wird,wp_print_scriptsjedoch.wp_enqueue_scriptfunktioniertjedoch,wennes wiefolgt aufinit angewendet wird: add_action ('init','check_widget');Actually I was. wp_enqueue_script doesn't seem to work when applied to wp_head, but wp_print_scripts does. wp_enqueue_script does work though if applied to init like so: add_action( 'init', 'check_widget' );
- 0
- 2010-09-29
- Ashley G
-
Die Skripte werdenjedoch aufjeder Seite der Sitegeladen,auch wenn das Widgetnurin einer Seitenleiste aktivist.Zum Beispiel,wennicheine Seitenleistefür Blogseiten undeine andere Seitenleistefür andere Seiten habe.Ichfüge das Such-Widget zur Blog-Seitenleiste hinzu und die Skripte werdengeladen,aberes wird auch auf Seitengeladen,auf denen die Blog-Seitenleistenicht vorhandenist.Ichmuss das Skriptnur laden können,wenn das Widget auf dieser Seite vorhandenist.However it loads the scripts on every page of the site, even if the widget is only active in one sidebar. for example if I have a sidebar for blog pages and a another sidebar for other pages. I add the search widget to the blog sidebar and the scripts does load, but it also loads on pages that don't have the blog sidebar. I need to be able to load the script only if the widget is present on that page.
- 0
- 2010-09-29
- Ashley G
-
Ich habemeine AntwortbearbeitetI edited my answer
- 0
- 2010-09-29
- sorich87
-
Dubist der Mann! Prost!You are the man! Cheers!
- 0
- 2010-09-29
- Ashley G
-
Sehr schöne Lösung :)Very nice solution :)
- 0
- 2011-12-25
- Anh Tran
-
Verwenden Sie lieber wp_enqueue_scripts anstelle von wp_head.tolle Antwort,danke.Better to use wp_enqueue_scripts instead of wp_head. great answer, thank you.
- 0
- 2017-03-06
- wesamly
-
- 2012-09-25
Ich wolltenureine Lösungteilen,an derichgearbeitet habe und dieesmirermöglichte,meine Implementierungetwas vielseitiger zugestalten. Anstatt die Funktion aufeine Vielzahl von Shortcodesprüfen zu lassen,habeich sie sogeändert,dassein einzelner Shortcodegesucht wird,der aufeine Skript-/Stilfunktion verweist,diein die Warteschlangegestellt werdenmuss. Diesfunktioniert sowohlfür Methodenin anderen Klassen (z. B. Plugins,die diesmöglicherweisenicht selbsttun) als auchfür In-Scope-Funktionen. Fügen Sieeinfach denfolgenden Codein functions.phpein undfügen Sie diefolgende Syntax zujeder Seite/jedem Beitrag hinzu,auf derbzw. der Sie spezifisches CSS & amp; JS.
Seiten-/Nachsyntax: [loadCSSandJSfunction="(class->method/functionname)"]
functions.php code:
function page_specific_CSSandJS( $posts ) { if ( empty( $posts ) ) return $posts; foreach ($posts as $post) { $returnValue = preg_match_all('#\[loadCSSandJS function="([A-z\-\>]+)"\]#i', $post->post_content, $types); foreach($types[1] as $type) { $items = explode("->",$type); if (count($items) == 2) { global $$items[0]; if( method_exists( $$items[0], $items[1] )) add_action( 'wp_enqueue_scripts', array(&$$items[0], $items[1]) ); } else if( !empty( $type ) && function_exists( $type )) add_action( 'wp_enqueue_scripts', $type ); } } return $posts; }
Auf diese Weise können Sie auchbeliebig viele aufeiner Seite hinzufügen. Beachten Sie,dass Sie zum Ladeneine Methode/Funktionbenötigen.
Just wanted to share a solution I worked on which allowed me to be a bit more versatile with my implementation. Rather than having the function check for a variety of shortcodes, I modified it to seek out a single shortcode that references a script/style function that needs to be enqueued. This will work for both methods in other classes (such as plugins that may not do this themselves) and in-scope functions. Just drop the below code in functions.php and add the following syntax to any page/post where you want specific CSS & JS.
Page/Post Syntax: [loadCSSandJS function="(class->method/function name)"]
functions.php code:
function page_specific_CSSandJS( $posts ) { if ( empty( $posts ) ) return $posts; foreach ($posts as $post) { $returnValue = preg_match_all('#\[loadCSSandJS function="([A-z\-\>]+)"\]#i', $post->post_content, $types); foreach($types[1] as $type) { $items = explode("->",$type); if (count($items) == 2) { global $$items[0]; if( method_exists( $$items[0], $items[1] )) add_action( 'wp_enqueue_scripts', array(&$$items[0], $items[1]) ); } else if( !empty( $type ) && function_exists( $type )) add_action( 'wp_enqueue_scripts', $type ); } } return $posts; }
This will also allow you to add as many as you want on a page. Keep in mind that you do need a method/function to load.
-
- 2011-12-22
Vielen Dank,dass Sie diesen Tippgeteilt haben! Esgabmirein wenig Kopfschmerzen,weiles zuerstnichtfunktionierte. Ich denke,esgibt einpaar Fehler (möglicherweise Tippfehler)im Code über
has_my_shortcode
undich habe die Funktion wiefolgtneugeschrieben:function has_my_shortcode( $posts ) { if ( empty($posts) ) return $posts; $shortcode_found = false; foreach ($posts as $post) { if ( !( stripos($post->post_content, '[my-shortcode') === false ) ) { $shortcode_found = true; break; } } if ( $shortcode_found ) { $this->add_scripts(); $this->add_styles(); } return $posts; }
Ich denke,esgab zwei Hauptprobleme: Die
break
warnichtim Umfang derif-Anweisungenthalten,und diesführte dazu,dass die Schleifebei derersten Iterationimmer unterbrochen wurde. Das andere Problem war subtiler und schwer zuentdecken. Der obige Codefunktioniertnicht,wenn der Shortcode das allerersteist,wasin einem Beitraggeschrieben wird. Ichmusste den Operator===
verwenden,um dies zu lösen.Wie auchimmer,vielen Dank,dass Sie diese Technikgeteilt haben. Sie hatmir sehrgeholfen.
Thank you for sharing this tip! It gave me a little headache, because at first it wasn't working. I think there are a couple of mistakes (maybe typos) in the code above
has_my_shortcode
and I re-written the function as below:function has_my_shortcode( $posts ) { if ( empty($posts) ) return $posts; $shortcode_found = false; foreach ($posts as $post) { if ( !( stripos($post->post_content, '[my-shortcode') === false ) ) { $shortcode_found = true; break; } } if ( $shortcode_found ) { $this->add_scripts(); $this->add_styles(); } return $posts; }
I think there were two main issues: the
break
wasn't in the scope of the if statement, and that caused the loop to always break at the first iteration. The other problem was more subtle and difficult to discover. The code above doesn't work if the shortcode is the very first thing written in a post. I had to use the===
operator to solve this.Anyway, thank you so much for sharing this technique, it helped a lot.
-
- 2017-01-31
Mit Wordpress 4.7gibt eseine andere Möglichkeit,diesin Ihrer
zuerreichenfunctions.php
-Dateiadd_action( 'wp_enqueue_scripts', 'register_my_script'); function register_my_script(){ wp_register_script('my-shortcode-js',$src, $dependency, $version, $inFooter); }
Zuerstmüssen Sie Ihr Skript registrieren ,dasnichtgedruckt wird Ihre Seite,es sei denn,Sie stellen siein die Warteschlange,wenn Ihr Shortcode aufgerufen wird,
add_filter( 'do_shortcode_tag','enqueue_my_script',10,3); function enqueue_my_script($output, $tag, $attr){ if('myShortcode' != $tag){ //make sure it is the right shortcode return $output; } if(!isset($attr['id'])){ //you can even check for specific attributes return $output; } wp_enqueue_script('my-shortcode-js'); //enqueue your script for printing return $output; }
der
do_shortcode_tag
wurde in WP 4.7 undeingeführtfinden Sie auf den Seiten Dokumentationfürneue Entwickler .with Wordpress 4.7 there is another way to achieve this in your
functions.php
file,add_action( 'wp_enqueue_scripts', 'register_my_script'); function register_my_script(){ wp_register_script('my-shortcode-js',$src, $dependency, $version, $inFooter); }
first you register your script, which doesn't actually get printed on your page unless your enqueue it if your shortcode is called,
add_filter( 'do_shortcode_tag','enqueue_my_script',10,3); function enqueue_my_script($output, $tag, $attr){ if('myShortcode' != $tag){ //make sure it is the right shortcode return $output; } if(!isset($attr['id'])){ //you can even check for specific attributes return $output; } wp_enqueue_script('my-shortcode-js'); //enqueue your script for printing return $output; }
the
do_shortcode_tag
was introduced in WP 4.7 and can be found in the new developers documentation pages.
Ichbrauchteeine Möglichkeit,den Inhalteiner Seite/eines Beitrags vor dem Laden zufiltern,damitich dem Header Skripte hinzufügen konnte,wennein bestimmter Shortcode vorhanden war. Nach langem Suchenbin ich auf http://wpengineer.com
daraufgestoßendasist absolutgenial und hatgenau dasgetan,wasichbrauchte.
Jetztmussichesetwas weitererweitern und das Gleichefür Seitenleistentun. Dies kannein bestimmter Widget-Typ,ein Shortcode,ein Code-Snippet oderetwas anderes sein,mit demermittelt werden kann,wann das Skriptgeladen werdenmuss.
Das Problemist,dassichnicht herausfinden kann,wieich auf den Inhalt der Seitenleisten zugreifen kann,bevor die Seitenleistegeladen wird (dasbetreffende Thema hatmehrere Seitenleisten)