Cargando scripts solo si un código corto o widget en particular está presente
-
-
¿Son los scriptsen elencabezado un requisitoestrictopara su situación?Losguiones alfinal de lapágina sonmásfáciles demanejar condicionalmente y se recomienda unaprácticaparael desempeño.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
-
Loprobéprimeroen wp_footer,lo queelimina lanecesidad deprefiltrarel contenido,pero aunque los scripts se cargaronbien,nofuncionaron.Estos scriptstienen queestaren wp_headpara hacer lo quenecesitan.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 respuestas
- votos
-
- 2010-09-28
Puede utilizar lafunción is_active_widget . Porejemplo:
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 cargarel scripten lapágina donde solo se cargael widget,deberá agregarel códigois_active_widget (),en su clase de widget. Porejemplo,consulteel widget de comentarios recientespredeterminado (wp-includes/default-widgets.php,línea 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') ); }
-
¿Sepuede llamar ANTES de que se carguen los widgets?Para que quede claro,esto debetener lugar antes de que se cargue lapágina.Mi código demuestra usathe_postsparafiltrarel contenido de lapágina,peroesono obtiene lasbarras laterales/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
-
Sí,veaelejemplo que agregué ami respuesta.Yes, see the example I added to my answer.
- 0
- 2010-09-28
- sorich87
-
Tuejemploen realidadnofunciona.¿Meestoyperdiendo algo obvio?Your example doesn't actually work. Am I missing something obvious?
- 0
- 2010-09-29
- Ashley G
-
De hecho loestaba.wp_enqueue_scriptnoparecefuncionar cuando se aplica a wp_head,pero wp_print_scripts sí.wp_enqueue_scriptfunciona si se aplica ainit así: 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
-
Sinembargo,carga los scriptsen cadapágina del sitio,incluso siel widget soloestá activoen unabarra lateral.porejemplo,sitengo unabarra lateralparapáginas deblog y otrabarra lateralpara otraspáginas.Agregoel widget debúsqueda a labarra lateral delblog y los scripts se cargan,perotambién se carganen páginas quenotienen labarra lateral delblog.Necesitopoder cargarel script solo siel widgetestápresenteen esapá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
-
Editémi respuestaI edited my answer
- 0
- 2010-09-29
- sorich87
-
¡Tueresel hombre! ¡Salud!You are the man! Cheers!
- 0
- 2010-09-29
- Ashley G
-
Muybuena solución :)Very nice solution :)
- 0
- 2011-12-25
- Anh Tran
-
Esmejor usar wp_enqueue_scriptsen lugar de wp_head.gran respuesta,gracias.Better to use wp_enqueue_scripts instead of wp_head. great answer, thank you.
- 0
- 2017-03-06
- wesamly
-
- 2012-09-25
Solo quería compartir una soluciónen la quetrabajé y queme permitió ser unpocomás versátil conmi implementación. En lugar de hacer que lafunción verifique una variedad de códigos cortos,lamodifiquéparabuscar un código corto único que haga referencia a unafunción de script/estilo que debeponerseen cola. Estofuncionarátantoparamétodosen otras clases (como complementos quepuedenno hacerestopor símismos) comoparafunciones dentro del alcance. Simplemente suelteel siguiente códigoen functions.php y agregue la siguiente sintaxis a cualquierpágina/publicación donde desee CSS & amp; JS.
Sintaxis depágina/publicación: [loadCSSandJSfunction="(clase->método/nombre defunción)"]
códigofunctions.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; }
Estotambién lepermitirá agregartantos como deseeen unapágina. Tengaen cuenta quenecesita unmétodo/funciónpara cargar.
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
¡Graciaspor compartireste consejo! Me dio unpequeño dolor de cabeza,porque alprincipionofuncionaba. Creo que hay unpar deerrores (tal vezerrorestipográficos)en el código anterior
has_my_shortcode
y reescribí lafunción de la siguientemanera: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; }
Creo que hubo dosproblemasprincipales:el
break
noestabaen el alcance de la declaraciónif,yesoprovocó queelbucle siempre se rompieraen laprimeraiteración. El otroproblemaeramás sutil y difícil de descubrir. El código anteriornofunciona siel shortcodees loprimero que seescribeen unapublicación. Tuve que usarel operador===
para resolveresto.Detodosmodos,muchasgraciaspor compartirestatécnica,ayudómucho.
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 hay otraforma de lograrestoen su archivo
functions.php
,add_action( 'wp_enqueue_scripts', 'register_my_script'); function register_my_script(){ wp_register_script('my-shortcode-js',$src, $dependency, $version, $inFooter); }
primero registratu script ,queen realidadno seimprimeen supágina amenos que lapongaen cola si se llama a su código corto,
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; }
el
do_shortcode_tag
fue introducidoen WP 4.7 y sepuedeencontraren laspáginas de documentaciónparanuevos desarrolladores .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.
Necesitaba unaforma defiltrarel contenido de unapágina/publicaciones antes de que se cargaraparapoder agregar scripts alencabezado si había un shortcodeespecífico. Después demuchobuscar,encontréestoen http://wpengineer.com
quees absolutamentebrillantee hizoexactamente lo quenecesitaba.
Ahoranecesitoextenderlo unpocomás y hacer lomismo con lasbarras laterales. Puede serpor untipo de widgeten particular,código corto,fragmento de código o cualquier otra cosa quefuncioneparaidentificar cuándoesnecesario cargarel script.
Elproblemaes quenopuedo averiguar cómo acceder al contenido de lasbarras laterales antes de que se cargue labarra lateral (eltemaen cuestióntendrá variasbarras laterales)