Chargement des scripts uniquement si un shortcode ou un widget particulier est présent
-
-
Les scripts dans l'en-tête sont-ilsexigéspour votre situation?Les scriptsen fin depage sontplusfaciles àgérer sous conditionet lespratiques recommandéespour lesperformances.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
-
Je l'ai d'abordessayé dans wp_footer,ce qui éliminebien lebesoin depré-filtrer le contenu,maisbien que les scripts se soientbien chargés,ilsn'ontpasfonctionné.Ces scripts doivent être dans wp_headpourfaire ce dontils ontbesoin.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 réponses
- votes
-
- 2010-09-28
Vouspouvez utiliser lafonction is_active_widget . Exemple:
function check_widget() { if( is_active_widget( '', '', 'search' ) ) { // check if search widget is used wp_enqueue_script('my-script'); } } add_action( 'init', 'check_widget' );
Pour charger le script dans lapage où le widgetest chargé uniquement,vous devrez ajouter le codeis_active_widget (),dans votre classe de widget. Parexemple,voir le widget de commentaires récentspar défaut (wp-includes/default-widgets.php,ligne 602):
La classeclass 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') ); }
-
Celapeut-il être appelé AVANT que les widgetsne soient chargés.Pour être clair,cela doit avoir lieu avantmême que lapagene se charge.Monexemple de code utilisethe_postspourfiltrer le contenu de lapage,mais celan'obtientpas lesbarres latérales/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
-
Oui,voyez l'exemple quej'ai ajouté àma réponse.Yes, see the example I added to my answer.
- 0
- 2010-09-28
- sorich87
-
Votreexemplene fonctionnepas réellement.Est-ce queje rate quelque chose d'évident?Your example doesn't actually work. Am I missing something obvious?
- 0
- 2010-09-29
- Ashley G
-
Enfait,je l'étais.wp_enqueue_scriptne semblepasfonctionner lorsqu'ilest appliqué à wp_head,contrairement à wp_print_scripts.wp_enqueue_scriptfonctionne cependant s'ilest appliqué àinit comme ceci: 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
-
Cependant,il charge les scripts sur chaquepage du site,même si le widgetn'est actif que dans unebarre latérale.parexemple sij'ai unebarre latéralepour lespages debloget une autrebarre latéralepour les autrespages.J'ajoute le widget de recherche à labarre latérale dubloget les scripts se chargent,maisil se charge également sur lespages quin'ontpas labarre latérale dublog.J'aibesoin depouvoir charger le script uniquement si le widgetestprésent sur cettepage.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
-
J'aimodifiéma réponseI edited my answer
- 0
- 2010-09-29
- sorich87
-
Tues l'homme! À votre santé!You are the man! Cheers!
- 0
- 2010-09-29
- Ashley G
-
Trèsbelle solution :)Very nice solution :)
- 0
- 2011-12-25
- Anh Tran
-
Mieux vaut utiliser wp_enqueue_scripts au lieu de wp_head.excellente réponse,merci.Better to use wp_enqueue_scripts instead of wp_head. great answer, thank you.
- 0
- 2017-03-06
- wesamly
-
- 2012-09-25
Je voulaisjustepartager une solution sur laquellej'aitravailléet quim'apermis d'être unpeupluspolyvalent dansmonimplémentation. Plutôt que de demander à lafonction de vérifier une variété de codes courts,je l'aimodifiépour rechercher un seul code court quifait référence à unefonction de script/style qui doit êtremiseen file d'attente. Celafonctionnera à lafoispour lesméthodes d'autres classes (telles que lesplugins quipeuventne pas lefaireeux-mêmes)et pour lesfonctions dans le champ d'application. Déposez simplement le code ci-dessous dansfunctions.phpet ajoutez la syntaxe suivante àn'importe quellepage/publication où vous voulez un CSS & amp; JS.
Syntaxe de lapage/article: [loadCSSandJSfunction="(class->method/functionname)"]
codefunctions.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; }
Cela vouspermettra également d'en ajouter autant que vous le souhaitez sur unepage. Gardez à l'esprit que vous avezbesoin d'uneméthode/fonction à charger.
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
Merci d'avoirpartagé cette astuce! Celam'a donné unpetit mal detête,parce qu'au début çane fonctionnaitpas. Jepense qu'il y a quelqueserreurs (peut-être desfautes defrappe) dans le code ci-dessus
has_my_shortcode
et j'ai réécrit lafonction comme ci-dessous: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; }
Jepense qu'il y avait deuxproblèmesprincipaux: le
break
n'étaitpas dans laportée de l'instructionif,et celaprovoquaittoujours la rupture de laboucle à lapremièreitération. L'autreproblème étaitplus subtilet difficile à découvrir. Le code ci-dessusne fonctionnepas si le shortcodeest latoutepremière chose écrite dans un article. J'ai dû utiliser l'opérateur===
pour résoudre ceproblème.Quoi qu'ilen soit,mercibeaucoup d'avoirpartagé cettetechnique,cela abeaucoup aidé.
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
avec Wordpress 4.7,ilexiste un autremoyen d'yparvenir dans votrefichier
functions.php
,add_action( 'wp_enqueue_scripts', 'register_my_script'); function register_my_script(){ wp_register_script('my-shortcode-js',$src, $dependency, $version, $inFooter); }
D'abord,vous enregistrez votre script ,quin'estpasimprimé sur votrepage sauf si vous lamettezen file d'attente si votre shortcodeest appelé,
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; }
le
do_shortcode_tag
a été introduit dans WP 4.7 et setrouve dans lespages de documentation desnouveaux développeurs .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.
J'avaisbesoin d'unmoyen defiltrer le contenu d'unepage/d'articles avant qu'ilne soit chargé afin queje puisse ajouter des scripts à l'en-tête si un shortcode spécifique étaitprésent. Après denombreuses recherches,je suistombé sur ceci sur http://wpengineer.com
quiest absolumentgénialet afaitexactement ce dontj'avaisbesoin.
Je doismaintenant l'étendre unpeupluset faire demêmepour lesbarres latérales. Celapeut êtrepar untype de widgetparticulier,un code court,unextrait de code outout autre élément quipermettrait d'identifier lemoment où le script doit être chargé.
Leproblèmeest queje nepeuxpas comprendre comment accéder au contenu desbarres latérales avant que labarre latéralene soit chargée (lethèmeen question auraplusieursbarres latérales)