Carregando scripts somente se um determinado shortcode ou widget estiver presente
-
-
São scriptsno requisito difícil de cabeçalhopara sua situação?Os scriptsnofinal dapágina sãomaisfáceis de lidar com aprática condicionale recomendadapara o desempenho.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
-
Euexperimenteiem WP_Footerprimeiro queeliminabem anecessidade deprefilter o conteúdo,masenquanto os scripts carregavambem,elesnãofuncionaram.Esses scriptsprecisamestarno WP_HEADparafazer o queprecisam.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 respostas
- votos
-
- 2010-09-28
Vocêpode usar afunção is_active_widget . Porexemplo:
function check_widget() { if( is_active_widget( '', '', 'search' ) ) { // check if search widget is used wp_enqueue_script('my-script'); } } add_action( 'init', 'check_widget' );
Para carregar o scriptnapáginaem que o widget é carregado apenas,vocêterá que adicionar o códigois_active_widget (),em sua classe widget. Porexemplo,consulte o widget de comentários recentepadrão (WP-Inclui/default-widgets.php,linha 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') ); }
-
Pode ser chamado antes dos widgets serem carregados.Para ser claro,issotem que ocorrer antes que apágina seja carregada.Meu código de amostra usa o The_Postsparafiltrar o conteúdonapágina,masissonão recebe asbarras laterais/widgets.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
-
Sim,veja oexemplo que adicionei àminha resposta.Yes, see the example I added to my answer.
- 0
- 2010-09-28
- sorich87
-
Seuexemplonãofuncionana verdade.Estouperdendo algo óbvio?Your example doesn't actually work. Am I missing something obvious?
- 0
- 2010-09-29
- Ashley G
-
Na verdadeeuestava.wp_enqueue_scriptnãoparecefuncionar quando aplicado a wp_head,mas o wp_print_scriptsfaz.wp_enqueue_scriptfunciona,embora aplicado comoinit assim: 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
-
Noentanto,ele carrega os scriptsem todas aspáginas do site,mesmo que o widgetesteja ativo apenasem umabarra lateral.Porexemplo,seeutiver umabarra lateralparapáginas dobloge outrabarra lateralpara outraspáginas.Eu adiciono o widget depesquisa àbarra lateral dobloge os scripts são carregados,mastambém carrega aspáginas quenãotêm abarra lateral doblog.Eupreciso ser capaz de carregar o script somente se o widgetestiverpresentenessapágina.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
-
Euediteiminha respostaI edited my answer
- 0
- 2010-09-29
- sorich87
-
Você é o cara!Saúde!You are the man! Cheers!
- 0
- 2010-09-29
- Ashley G
-
Soluçãomuitoboa :)Very nice solution :)
- 0
- 2011-12-25
- Anh Tran
-
Melhor usar wp_enqueue_scriptsem vez de wp_head.Ótima resposta,obrigado.Better to use wp_enqueue_scripts instead of wp_head. great answer, thank you.
- 0
- 2017-03-06
- wesamly
-
- 2012-09-25
Só queria compartilhar uma solução quetrabalheino queme permitiu ser umpoucomais versátil comminhaimplementação. Em vez deter a verificação dafunçãopara uma variedade de códigos depouco,modificá-loparaprocurar um único shiccode quefaz referência a umafunção de script/estilo queprecisa serenfigual. Issofuncionarápara ambos osmétodosem outras classes (comoplugins quepodemnãofazerissoem si)e funçõesnoescopo. Basta soltar o código abaixono Functions.phpe adicione a seguinte sintaxe a qualquerpágina/post onde você deseja csse amplificadoresespecíficos; Js
Página/Post Syntax: [loadcssandjsfunction="(class-> Método/nome defunção)"]
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; }
Issotambémpermitirá que você adicione quantos quiserem umapágina. Tenhaem mente que vocêprecisa de ummétodo/funçãopara carregar.
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
Obrigadopor compartilharesta dica! Issome deu umapequena dor de cabeça,porqueno começonãoestavafuncionando. Eu acho que há algunserros (talveztyps)no código acima
has_my_shortcode
e eu reescrevi afunção como abaixo:função has_my_shortcode ($postagens) { Se (vazio ($posts)) retornarmensagens de $; $ shortcode_found=false; foreach ($posts como $post) { if (! (stripos ($post-egt;post_content,'[my-shortcode')===false)) { $ shortcode_found=true; intervalo; } } if ($ shortcode_found_found) { $this- > add_scripts (); $this- > add_styles (); } retornarmensagens de $; }
Eu acho que houve doisproblemasprincipais: o
Break
nãoestavanoescopo da declaração IF,e que causou o looppara sempre quebrarnaprimeiraiteração. O outroproblemaeramais sutile difícil de descobrir. O código acimanãofunciona se o shortcode é aprimeira coisaescritaem umpost. Eutive que usar o operador===
para resolverisso.de qualquermaneira,muito obrigadopor compartilharestatécnica,ajudoumuito.
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
Com o WordPress 4.7 Há outramaneira de conseguirissoem seu arquivo
functions.php
arquivo,add_action( 'wp_enqueue_scripts', 'register_my_script'); function register_my_script(){ wp_register_script('my-shortcode-js',$src, $dependency, $version, $inFooter); }
primeiro você registre seu script ,quenão éimpressoem suapágina,amenos que você sejafechada se o seu shortcode é chamado,
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; }
o
do_shortcode_tag
foi introduzidono WP 4.7 e pode serencontradono nova documentação de desenvolvedores páginas.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.
Euprecisava de umamaneira defiltrar um conteúdo depágina/posts antes de ser carregadopara queeupudesse adicionar scripts ao cabeçalho se um shortcodeespecíficoestiverpresente. Depois demuitabusca,me deparei comissoem http://wpengineer.com
O que é absolutamentebrilhantee fezexatamente o queeuprecisava.
Agoraeuprecisoestendê-lo umpoucomaise fazer omesmoparabarras laterais. Pode serpor umtipo de widgetparticular,shortcode,snippet de código ou qualquer outra coisa quefuncionariaparaidentificar quando o scriptprecisar ser carregado.
Oproblema é quenão consigo descobrir como acessar o conteúdo dasbarras laterais antes que abarra lateral seja carregada (otemaem questãoterá váriasbarras laterais)