Caricamento di script solo se è presente un particolare shortcode o widget
-
-
Gli scriptnell'intestazione sono un requisitofondamentaleper latua situazione?Gli script allafine dellapagina sonopiùfacili dagestirein modo condizionalee sono consigliatiper laperformance.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
-
L'hoprovatoprimain wp_footer,il cheeliminapiacevolmente lanecessità diprefiltrareil contenuto,mamentregli script vengono caricati correttamente,non hannofunzionato.Questi script devonoesserein wp_headperfare ciò di cui hannobisogno.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 risposta
- voti
-
- 2010-09-28
Puoi usare lafunzione is_active_widget . Adesempio:
function check_widget() { if( is_active_widget( '', '', 'search' ) ) { // check if search widget is used wp_enqueue_script('my-script'); } } add_action( 'init', 'check_widget' );
Per caricare lo script solonellapaginain cui è caricatoil widget,dovrai aggiungereil codiceis_active_widget (),nellatua classe widget. Adesempio,guardail widget dei commenti recentipredefinito (wp-includes/default-widgets.php,riga 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') ); }
-
Puòessere chiamato PRIMA chei widget vengano caricati.Peressere chiari,ciò deve avvenireprima ancora che lapagina venga caricata.Ilmio codice diesempio utilizzathe_postsperfiltrareil contenuto dellapagina,manon ottiene lebarre laterali/widget.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
-
Sì,guarda l'esempio che ho aggiunto allamia risposta.Yes, see the example I added to my answer.
- 0
- 2010-09-28
- sorich87
-
Iltuoesempioin realtànonfunziona.Mi stoperdendo qualcosa di ovvio?Your example doesn't actually work. Am I missing something obvious?
- 0
- 2010-09-29
- Ashley G
-
In realtà loero.wp_enqueue_scriptnon sembrafunzionare quando applicato a wp_head,ma wp_print_scripts sì.wp_enqueue_scriptfunzionaperò se applicato ainit in questomodo: 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
-
Tuttavia caricagli scriptin ognipagina del sito,anche seil widget è attivo soloin unabarra laterale.peresempio se ho unabarra lateraleper lepagine delbloge un'altrabarra lateraleper altrepagine.Aggiungoil widget di ricerca allabarra laterale delbloge gli script vengono caricati,ma vengono caricati anche sullepagine chenon hanno labarra laterale delblog.Devoesserein grado di caricare lo script solo seil widget èpresente su quellapagina.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
-
Homodificato lamia rispostaI edited my answer
- 0
- 2010-09-29
- sorich87
-
Tu sei l'uomo! Saluti!You are the man! Cheers!
- 0
- 2010-09-29
- Ashley G
-
Soluzionemoltobella :)Very nice solution :)
- 0
- 2011-12-25
- Anh Tran
-
Meglio usare wp_enqueue_scriptsinvece di wp_head.ottima risposta,grazie.Better to use wp_enqueue_scripts instead of wp_head. great answer, thank you.
- 0
- 2017-03-06
- wesamly
-
- 2012-09-25
Volevo solo condividere una soluzione su cui ho lavorato chemi hapermesso diessere unpo 'più versatile con lamiaimplementazione. Piuttosto chefarein modo che lafunzione controlli una varietà di shortcode,l'homodificataper cercare un singolo shortcode chefaccia riferimento a unafunzione di script/stile che deveessere accodata. Questofunzioneràperentrambii metodiin altre classi (comei plugin chepotrebberononfarlo da soli)e per lefunzioninell'ambito. Trascinail codice seguentein functions.phpe aggiungi la seguente sintassi a qualsiasipagina/postin cui desideri CSS & amp; JS.
Sintassipagina/articolo: [loadCSSandJSfunction="(class->nomemetodo/funzione)"]
codicefunctions.php:
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; }
Questoti permetterà anche di aggiungerne quantine vuoi su unapagina. Tienipresente che haibisogno di unmetodo/funzione da caricare.
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
Grazieper aver condiviso questo suggerimento! Mi ha dato unpo 'dimal ditesta,perché all'iniziononfunzionava. Penso che ci siano unpaio dierrori (forse refusi)nel codice sopra
has_my_shortcode
e ho riscritto lafunzione come di seguito: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; }
Penso che cifossero dueproblemiprincipali:il
break
noneranell'ambito dell'istruzioneif e questo causava l'interruzione del ciclo allaprimaiterazione. L'altroproblemaerapiù sottilee difficile da scoprire. Il codice sopranonfunziona se lo shortcode è laprima cosa scrittain unpost. Ho dovuto usare l'operatore===
per risolvere questoproblema.Comunque,graziemilleper aver condiviso questatecnica,ha aiutatomolto.
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
con Wordpress 4.7 c'è un altromodoper ottenere questo risultatoneltuofile
functions.php
,add_action( 'wp_enqueue_scripts', 'register_my_script'); function register_my_script(){ wp_register_script('my-shortcode-js',$src, $dependency, $version, $inFooter); }
perprima cosa registriiltuo script ,chein realtànon viene stampato latuapagina ameno chenon la accodi se viene chiamatoiltuo shortcode,
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; }
il
do_shortcode_tag
è stato introdottoin WP 4.7 e puòesseretrovatonellepagine della documentazione deinuovi sviluppatori .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.
Avevobisogno di unmodoperfiltrareil contenuto di unapagina o di unpostprima chefosse caricatoin modo dapoter aggiungere script all'intestazione sefossepresente uno shortcode specifico. Dopomolte ricerchemi sonoimbattutoin questo su http://wpengineer.com
che è assolutamentegenialee hafattoesattamente ciò di cui avevobisogno.
Ora devoestenderlo unpo 'dipiùe fare lo stessoper lebarre laterali. Puòessere unparticolaretipo di widget,shortcode,snippet di codice o qualsiasi altra cosa chepotrebbefunzionareperidentificare quando lo script deveessere caricato.
Ilproblema è chenon riesco a capire come accedere al contenuto dellebarre lateraliprima che labarra laterale venga caricata (iltemain questione avrà diversebarre laterali)