Je construis un plugin en utilisant le WordPress Plugin Boilerplate de DevinVinson .
Tout fonctionne bien, sauf une chose:
J'essaie de mettre en file d'attente les scripts et les CSS uniquement lorsqu'un shortcode est présent dans la page.
Dans la fonction define_public_hooks
, j'ai ajouté un appel au chargeur pour enregistrer les scripts au lieu de les mettre en file d'attente:
private function define_public_hooks() {
// ...
$this->loader->add_action( 'wp_register_script', $plugin_public, 'register_styles' );
$this->loader->add_action( 'wp_register_script', $plugin_public, 'register_scripts' );
// ...
}
Ensuite, dans le fichier class-my-plugin-public.php
, j'ai créé deux fonctions publiques register_styles()
et register_scripts()
. À l'intérieur de ces fonctions, je ne fais qu'inscrire des scripts et des styles, au lieu de les mettre en file d'attente. C'est quelque chose de basique, comme ça:
public function register_scripts() {
wp_register_script( $this->plugin_name . '_google_maps_api', '//maps.googleapis.com/maps/api/js?key='. $gmap_key .'&v=3&libraries=places', array( 'jquery' ), '3', true );
}
Ensuite, je voudrais les mettre en file d'attente dans la fonction de retour shortcode, mais ils ne sont pas enregistrés du tout.
J'ai vérifié avec wp_script_is( $this->plugin_name . '_google_maps_api', 'registered' )
, et il retourne false
.
Si je fabrique exactement les mêmes choses, mais avec enqueue
au lieu de register
, tout se passe bien.
Une idée pourquoi?
Vous devez utiliser le hook wp_enqueue_scripts
action. Vous avez utilisé wp_register_script
comme crochet d’action. Cependant, il n’existe pas de crochet d’action nommé wp_register_script
dans le noyau de WordPress.
Si c'était juste une erreur stupide, alors vous avez déjà la réponse. Continuez à lire si vous avez besoin de plus d’informations sur le sujet:
Associer une fonction de rappel à wp_enqueue_scripts
action hook ne signifie pas que vos scripts et styles seront mis en file d'attente, cela signifie simplement que vous souhaitez exécuter cette fonction de rappel .
L'enregistrement et la mise en file d'attente d'origine sont effectués à l'aide de fonctions telles que: wp_register_script()
, wp_register_style
, wp_enqueue_script()
, wp_enqueue_style()
etc., et non par aucun hook .
Notez la différence entre le rôle des fonctions et des hooks:
A function exécute un code pour accomplir des tâches prédéfinies lorsqu'il est appelé.
Exemple: ce sont toutes des fonctions de base de WordPress:
wp_register_script()
,wp_register_style
,wp_enqueue_script()
,wp_enqueue_style()
.Un hook attache uniquement une fonction callable (à exécuter ultérieurement) en un point prédéfini de l'exécution du CODE.
Exemple: il s'agit d'un point d'ancrage (action) principal de WordPress:
wp_enqueue_scripts
- notez las
(pluriel) à la fin.Double vérification:} _
wp_enqueue_script()
est une fonction etwp_enqueue_scripts
est un crochet d’action.
Donc, votre CODE corrigé devrait être comme:
private function define_public_hooks() {
// ...
$this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'register_styles' );
$this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'register_scripts' );
// ...
}
Ensuite,
public function register_scripts() {
wp_register_script( $this->plugin_name . '_google_maps_api', '//maps.googleapis.com/maps/api/js?key='. $gmap_key.'&v=3&libraries=places', array( 'jquery' ), '3', true );
}
Après cela, vous mettez en file d'attente le script (& style) à partir de votre fonction de gestionnaire de shortcode:
public function your_shortcode_handler( $atts ) {
// shortcode related CODE
wp_enqueue_script( $this->plugin_name . '_google_maps_api' );
// more shortcode related CODE
}
Avec ce CODE, vos scripts/styles mis en file d'attente à partir de la fonction your_shortcode_handler
ne seront ajoutés à votre site que s'il existe un shortcode dans cette URL particulière.
Cette réponse a une discussion intéressante sur la mise en file d'attente des scripts et des styles uniquement lorsque le shortcode est présent.
Le problème est donc que le premier argument de l'appel add_action
doit être un WordPress nom de l'action ... Ainsi, "wp_register_script", n'étant pas une action WP, n'est jamais appelé.
En fait, tout ce que vous devez faire, c’est d’ajouter vos appels d’enregistrement à la fonction enqueue_scripts de votre plugin; vous n'avez pas besoin de vous embêter avec define_public_hooks, ni de créer une nouvelle fonction register_scripts. Allez simplement avec la fonction existante enqueue_scripts, mais ajoutez-y vos inscriptions:
public function enqueue_scripts() {
wp_enqueue_script( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'js/plugin-name-public.js', array( 'jquery' ), $this->version, false );
// NOTICE this is a *registration* only:
wp_register_script( $this->plugin_name.'_google_maps_api', '//maps.googleapis.com/maps/api/js?key='. $gmap_key.'&v=3&libraries=places', array( 'jquery' ), '3', true );
}
Ensuite, lorsque votre code court, votre script devrait être enregistré, prêt à être mis en file d'attente.
J'espère que cela t'aides!