Plus de conseils sur les meilleures pratiques de développement WordPress

Bienvenue dans la deuxième partie de la série. Dans le premier article, nous avons expliqué les normes de codage WordPress, comment éviter les collisions d’espaces de nom, les commentaires dans le code et quelques conseils de sécurité de base..

Aujourd'hui, nous allons aller un peu plus loin et écrire un peu plus de code et apprendre quelques techniques pour améliorer les performances et la sécurité de nos plugins. Les sujets que nous couvrirons sont les suivants:

  1. Quand et comment inclure mes scripts / styles
  2. Comment effectuer correctement des appels Ajax
  3. Filtres et actions pour donner la liberté à vos utilisateurs

Saisissez votre éditeur de code et préparez-vous à jouer avec WordPress!

Comment et quand dois-je inclure mes scripts??

La première chose à garder à l’esprit est que WordPress a deux fonctions formidables (wp_enqueue_script et wp_enqueue_style) pour vous permettre d’inclure vos scripts et vos styles. À cette fin, veuillez ne pas les ajouter manuellement dans l'en-tête ou en utilisant wp_head crochet d'action. 

Si vous utilisez les méthodes WordPress, les plugins de mise en cache et de minification pourront inclure vos scripts dans leurs fonctions, vous pourrez choisir de les placer très facilement en pied de page ou en-tête, vous pourrez ajouter des scripts dépendants et également utiliser tous les scripts. astuces expliquées ci-dessous avec d'autres fonctionnalités. 

Incorrect:

add_action ('wp_head', 'my_custom_scripts'); function my_custom_scripts () echo ''; 

Correct:

add_action ('wp_enqueue_scripts', 'my_customs_scripts'); function my_customs_scripts () wp_enqueue_script ('gestionnaire de scripts', get_template_directory_uri (). '' /js/my.js ', array (' jquery '),' 1.0.0 ', true); 

Je ne vous donnerai pas un tutoriel complet sur la façon d'utiliser wp_enqueue_xxxx car ils sont nombreux (et le Codex est une excellente ressource!) Et j'essaie simplement de vous indiquer comment ajouter des scripts dans vos thèmes ou plugins..

Ce que vous devez toujours avoir à l’esprit est de laisser l’empreinte la plus légère possible. Cela signifie que vous ne devriez pas inclure de fichiers où ils ne sont pas censés être. 

Vous pensez peut-être que «ce n’est qu’un fichier, cela n’affectera pas le site Web» et, dans cet état d’esprit, c’est comme jeter un papier dans le parc parce qu’il s’agit d’un simple bout de papier, mais ce n’est pas ainsi que les choses se passent: tous les développeurs laissent leurs scripts partout, l'utilisateur final se retrouvera avec un site totalement gonflé et nous ne voulons pas que.

Maintenant que nous avons couvert cela, voyons quelques astuces pour inclure vos scripts uniquement lorsque cela est nécessaire..

1. Ne jamais inclure de fichiers frontaux dans le backend et vice-versa

// FRONT END UNIQUEMENT add_action ('wp_enqueue_scripts', 'my_front_customs_scripts'); function my_customs_scripts () wp_enqueue_script ('gestionnaire de scripts', get_template_directory_uri (). '' /js/my.js ', array (' jquery '),' 1.0.0 ', true);  // BACKEND ONLY add_action ('admin_enqueue_scripts', 'mon_back_customs_scripts'); function my_customs_scripts () wp_enqueue_script ('gestionnaire de scripts', get_template_directory_uri (). '' /js/my.js ', array (' jquery '),' 1.0.0 ', true); 

Mais attendez! Allons un peu plus loin et n'incluons que des scripts dans les pages dont vous avez vraiment besoin. Une bonne méthode consiste à les enregistrer d'abord, puis à les mettre en file d'attente dans les pages nécessaires.

2. Inclure les fichiers uniquement sur les pages nécessaires

// FRONT END UNIQUEMENT add_action ('wp_enqueue_scripts', 'my_front_customs_scripts'); function my_customs_scripts () wp_register_script ('gestionnaire de scripts', get_template_directory_uri (). '/js/my.js', array ('jquery'), '1.0.0', true); if (is_page ('ma-page')) wp_enqueue_script ('gestionnaire de script');  // Soyez créatif pour inclure des fichiers uniquement lorsque cela est nécessaire // if (is_single ()) // if (is_home ()) // if ('nom_cpt' == get_post_type ()) // BACKENDEND UNIQUEMENT add_action (' admin_enqueue_scripts ',' my_back_customs_scripts '); function my_customs_scripts ($ hook) wp_register_script ('script-handler', get_template_directory_uri (). '/js/my.js', array ('jquery'), '1.0.0', true); // Pour l'inclure uniquement lors de l'édition d'un message if ('edit.php' == $ hook) wp_enqueue_script ('script-handler');  // Si vous avez ajouté une page d'options comme celle-ci // $ plugin_screen_id = add_options_page (…) // vous pouvez faire $ screen = get_current_screen (); if ($ plugin_screen_id == $ screen-> id) wp_enqueue_script ('gestionnaire de scripts');  / * Une autre façon d'utiliser l'ID d'écran * / add_action ('admin_print_styles-'. $ Plugin_screen_id, 'my_back_customs_scripts');

3. Êtes-vous en train de mettre des scripts à utiliser avec des codes courts??

// FRONT END UNIQUEMENT add_action ('wp_enqueue_scripts', 'my_front_customs_scripts'); function my_customs_scripts () wp_register_script ('gestionnaire de scripts', get_template_directory_uri (). '/js/my.js', array ('jquery'), '1.0.0', true); // si vous avez besoin d'inclure un script pour un shortcode // Ne l'ajoutez pas partout // Vous pouvez l'inclure uniquement si nécessaire global $ post; if (is_a ($ post, 'WP_Post') && has_shortcode ($ post-> post_content, 'custom-shortcode')) wp_enqueue_script ('script-handler'); 

4. Inclure les styles avec des conditions

Alors que les autres extraits de code s'appliquent aux scripts et aux styles, les éléments suivants ne fonctionnent qu'avec wp_enqueue_style (au moins pour l'instant).

// FRONT END UNIQUEMENT add_action ('wp_enqueue_scripts', 'my_front_customs_styles'); function my_front_customs_styles () wp_register_style ('mon-plugin-css', plugins_url ('mon-plugin / css / plugin.css')); // Incluons ce css uniquement pour les navigateurs anciens (et de mauvaise qualité) wp_enqueue_style ('my-plugin-css'); global $ wp_styles; $ wp_styles-> add_data ('my-plugin-css', 'conditionnel', 'lte IE 9'); 

Vous pouvez voir quelques exemples supplémentaires dans le Codex. Un autre excellent exemple que vous pouvez utiliser pour démarrer tous vos plugins est le plugin Boilerplate de WordPress. Examinez le code pour voir comment les scripts et les styles sont inclus. Le plugin Wpfavs (basé sur WordPress Plugin Boilerplate) est un bon exemple de la création d’un plugin pour le backend de Wordpress..

2. Comment effectuer correctement des appels Ajax

Pour ce sujet, je vais partager quelques mauvaises habitudes que j’ai souvent vues en faisant Ajax dans WordPress et qui pourraient être divisées en phrases suivantes:

  • Les appels Ajax ne doivent pas être effectués directement dans un fichier
  • Les appels Ajax doivent utiliser une valeur de nonce
  • Vérifier les autorisations de l'utilisateur, si nécessaire
  • Les variables JavaScript doivent être incluses avec wp_localize_script

Je sais que jQuery fait de l’appel Ajax une partie du gâteau, et nous pouvons simplement créer un fichier appelé ajax.php, comprendrewp-load.php dessus et faites notre Ajax là-bas. Mais ce n'est pas la "manière WordPress" - ce n'est pas à l'épreuve du futur. Plus encore, il est moins sécurisé et vous manquerez de nombreuses fonctionnalités de WordPress..

La bonne façon est d'utiliser le wp_ajax_my_action et wp_ajax_nopriv_my_action crochets d'action. La principale différence entre les deux est que le premier est utilisé pour les utilisateurs connectés et le second pour les utilisateurs non connectés..

Notez que "my_action" doit être changé pour votre nom d'action. Nous verrons comment cela fonctionne dans un instant.

Voyons tout cela dans un exemple simple avec un peu de code et d'imagination. Imaginons que nous voulions afficher 5 messages lorsqu'un utilisateur (connecté ou non) clique sur un bouton. Nous allons nommer cette action cool_ajax_example, alors commençons à ajouter les fonctions de rappel Ajax qui renverront les données.

Vous pouvez inclure ce code sur votre functions.php ou dans votre plugin.

// Nous ajoutons d'abord les actions hook add_action ('wp_ajax_cool_ajax_example', 'cool_ajax_example_callback'); add_action ('wp_ajax_nopriv_cool_ajax_example', 'cool_ajax_example_callback'); function cool_ajax_example_callback () …

Comme vous pouvez le constater, les deux hooks utilisent la même fonction de rappel qui renvoie les données. Notez également que notre action se nomme à la fin du nom du crochet wp_ajax_cool_ajax_example

C'est très importantécrire le nom de l'action partout ou cela ne fonctionnera pas du tout.

Avant de continuer avec la fonction de rappel, passons à jQuery nécessaire pour l'appel Ajax. Le script jQuery se déclenchera lorsque nous appuierons sur un simple bouton HTML, et nous devrons envoyer cette demande au admin-ajax.php fichier que c’est le script qui gère toutes les demandes AJAX dans Wordpress. De plus, nous devons ajouter un nonce car nous avons déjà dit que nous voulons le sécuriser. wp_localize_script une fonction.

Si vous avez inclus vos scripts correctement, comme expliqué au début de cet article, vous avez un nom de gestionnaire de script (dans nos exemples ci-dessus, 'gestionnaire de script'), utilisez-le pour transmettre nos valeurs PHP à notre fichier javascript. Vous pouvez inclure ce morceau de code juste après le wp_enqueue_function utilisé pour inclure le JavaScript.

wp_localize_script ('script-handler', 'MyVarName', array ('ajax_url' => admin_url ('admin-ajax.php'), 'nonce' => wp_create_nonce ('return_posts'));

Comme vous pouvez le voir wp_localize_script est un moyen assez facile de transmettre une variable PHP à nos fichiers JavaScript et il imprimera un xhtml valide en raison de la  Mots clés. Le code ci-dessus sera imprimé dans l'en-tête lorsque le fichier JavaScript avec gestionnaire de script comme le nom est chargé et il ressemblera à quelque chose comme:

Il est maintenant temps de créer notre fichier javascript, appelons-le my.js et cela ressemblera à quelque chose comme:

(fonction ($) $ (fonction () $ ('bouton #'). click (fonction (e) e.preventDefault (); $ .ajax (url: monVarName.ajax_url, données: action: ' cool_ajax_example ', nonce: monVarName.nonce, succès: fonction (réponse) $ (' # conteneur_réponse '). html (réponse);, tapez: "POST",);); ) (jQuery);

Veuillez noter comment nous utilisons le nonce et ajax_url que nous avons passé avec wp_localize_script. Vérifiez également que nous transmettons une valeur POST appelée "action" qui correspond au nom de l’action que nous avons utilisé dans le processus. wp_ajax crochets. 

Il est maintenant temps de terminer notre fonction de rappel. La première chose à faire est de vérifier que le nonce est correct et de pouvoir ensuite renvoyer certains messages..

function cool_ajax_example_callback () $ nonce = $ _POST ['nonce']; // La première chose que nous faisons est de vérifier le nonce et de tuer le script s'il est erroné si (! Wp_verify_nonce ($ nonce, 'return_posts')) die ('Wron nonce!'); $ args = array ('post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => 5,); // La requête $ the_query = new WP_Query ($ args); // La boucle si ($ the_query-> have_posts ()) echo '
'; while ($ the_query-> have_posts ()) $ the_query-> the_post (); écho '

'. get_the_title (). '

'; écho '
'; else echo 'Messages non trouvés'; / * Restaure les données de post d'origine * / wp_reset_postdata (); // n'oublie pas ceci // Nous faisons un appel simple, nous ne voulons rien exécuter d'autre die ();

Si vous avez besoin de quelque chose de plus complexe, comme supprimer un message, vérifiez toujours les autorisations des utilisateurs, comme je l’ai mentionné au début de ce sujet. Par exemple, si vous voulez que les administrateurs seulement fassent certaines actions, vous pouvez faire dans votre script quelque chose comme:

if (current_user_can ('administrator')) wp_delete_post ($ postid, $ force_delete); 

Avec tous les conseils ci-dessus, vous êtes maintenant un maître dans WordPress Ajax et vous pouvez effectuer toutes les actions que vous voulez. Essayez de jouer avec ce qui précède et ajustez-le à vos besoins. Personnellement, j'aime utiliser JSON type de données et je fais echo json_encode () au lieu de faire un simple écho sur mes scripts, mais c'est une autre affaire.

3. Filtres et actions

Le but de cette section ne sera pas de vous apprendre comment fonctionnent les filtres et les actions. Il existe d'excellents tutoriels autour de ce sujet qui l'expliquent en détail. Ce que je vais expliquer, c’est pourquoi vous devriez ajouter des filtres et des actions sur vos plugins et vous montrer quelques exemples pour en faciliter la compréhension..

Mais commençons par une introduction à ces concepts:

  • Crochets: Un crochet d'action est ajouté à un certain point de votre plugin, généralement autour des actions importantes (par exemple, avant le contenu, après le contenu). Tout utilisateur peut alors "y accrocher" des fonctions afin que son code soit exécuté à ce moment-là. Lorsqu’un hook d’action est exécuté, toutes les fonctions qui lui sont connectées ou "accrochées" s’exécutent également..
  • Filtres: Un crochet de filtre est également placé dans votre plug-in pour que d'autres fonctions soient liées. Dans ce cas, les filtres permettent aux données d'être manipulées ou modifiées avant leur utilisation. Donc, vous le placez généralement avec des variables que vous souhaitez laisser les utilisateurs manipuler.

Vérifier la API de plugin pour plus d'informations sur les crochets d'action et les filtres.

Pourquoi devrais-je rendre mon plugin extensible??

C'est simple: parce que cela rend votre plugin meilleur. De cette façon, les développeurs et les utilisateurs normaux ensemble pourront étendre, adapter ou améliorer votre plugin au-delà de son objectif initial sans toucher au cœur de celui-ci.. 

Prenons par exemple un plugin de commerce électronique. Grâce aux crochets et aux filtres, vous pouvez créer de nouveaux plug-ins qui s'y rattachent, comme par exemple de nouvelles passerelles de paiement, des fonctions d'expédition et bien plus encore..

Cela semble bien, mais où je devrais les ajouter sur mon plugin?

Ne devenez pas fou en ajoutant des actions et des filtres partout. Au début, vous trouverez cela un peu difficile ou ennuyeux, alors essayez de penser comme si vous étiez un autre développeur regardant un nouveau plugin et demandez-vous "Ai-je besoin ici d'un crochet d'action?". En outre, un pourcentage énorme d'actions et de filtres sera ajouté à la demande une fois que vous aurez commencé à recevoir une demande d'assistance (oui, vous les aurez toujours!) Ou à recevoir les commentaires de vos utilisateurs..

Comme tout dans la vie, une fois que cela devient une habitude, vous verrez clairement où les inclure..

Quelques recommandations pour savoir où inclure les filtres:

  • Lorsque les tableaux sont configurés, il est judicieux d’ajouter un filtre pour permettre aux utilisateurs de les modifier..
  • Lorsque les objets de données sont configurés, la même chose se produit. Vous voudrez peut-être laisser les utilisateurs modifier l'objet avant son utilisation
  • Lorsque les chaînes de données sont configurées, vous pouvez ajouter des filtres pour permettre aux utilisateurs de les modifier..

Utilisons la fonction de rappel utilisée dans cet article pour voir un exemple des recommandations ci-dessus. Pour créer des variables filtrables sur ce cas, nous utilisons apply_filters ()

function cool_ajax_example_callback () $ nonce = $ _POST ['nonce']; // La première chose que nous faisons est de vérifier le nonce et de tuer le script s'il est faux if (! Wp_verify_nonce ($ nonce, 'return_posts')) die ('Wrong nonce!');  $ args = array ('post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => 5,); // La requête $ the_query = new WP_Query (apply_filters ('cool_ajax_query', $ args)); // La boucle si ($ the_query-> have_posts ()) echo '
'; while ($ the_query-> have_posts ()) $ the_query-> the_post (); écho '

'. get_the_title (). '

'; écho '
'; else echo 'Messages non trouvés'; / * Restaure les données de post d'origine * / wp_reset_postdata (); // n'oublie pas ceci // Nous faisons un appel simple, nous ne voulons rien exécuter d'autre die ();

Comme vous pouvez le voir, j’ai ajouté un filtre au $ args variable qui fonctionnera juste avant WP_Query exécute la requête. Avec un simple filtre, tout utilisateur peut modifier, par exemple, le nombre de publications renvoyées..

fonction wpt_alter_coolajax_query ($ args) $ args ['posts_per_page'] = 10; return $ args;  add_filter ('cool_ajax_query', 'wpt_alter_coolajax_query');

Vous pouvez utiliser des filtres dans différents scénarios, utilisez simplement votre imagination. Par exemple, sur mon plugin Invitations sociales WordPress, je laisse les utilisateurs modifier la feuille de style contextuelle avec un filtre au cas où ils auraient un style totalement différent.

Ou à cette occasion, lorsque le plugin envoie des emails, je donne la possibilité de changer le "De l'email" qui wp_mail () va utiliser.

function get_from_email () if (isset ($ this -> _données_utilisateur)) return apply_filters ('wsi_from_email', $ this -> _données_utilisateur-> user_email);  return apply_filters ('wsi_from_email', get_bloginfo ('admin_email')); 

En ce qui concerne les actions, cela change un peu. Vous souhaitez ajouter des points d'ancrage d'action dans les scénarios suivants (sans s'y limiter):

  • avant que la tâche ne soit exécutée,
  • après l'exécution des tâches,
  • pendant la tâche sont exécutés pour par exemple étendre le balisage.

Pour créer ces zones d'accrochage, nous utilisons le do_action () une fonction. Appliquons-les dans notre exemple.

function cool_ajax_example_callback () $ nonce = $ _POST ['nonce']; // La première chose que nous faisons est de vérifier le nonce et de tuer le script s'il est erroné si (! Wp_verify_nonce ($ nonce, 'return_posts')) die ('Wron nonce!'); $ args = array ('post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => 5,); // La requête $ the_query = new WP_Query (apply_filters ('cool_ajax_query', $ args)); // La boucle if ($ the_query-> have_posts ()) // nous lançons le hook avant que la boucle ne soit traitée do_action ('cool_ajax_before_loop', get_the_ID ()); écho '
'; while ($ the_query-> have_posts ()) $ the_query-> the_post (); // nous courons le crochet avant que le titre ne soit imprimé do_action ('cool_ajax_before_title', get_the_ID ()); écho '

'. get_the_title (). '

'; // nous courons le crochet après que le titre est imprimé do_action ('cool_ajax_after_title', get_the_ID ()); écho '
'; // nous lançons le hook après que la boucle ait été traitée do_action ('cool_ajax_after_loop', get_the_ID ()); else echo 'Messages non trouvés'; / * Restaure les données de post d'origine * / wp_reset_postdata (); // n'oublie pas ceci // Nous faisons un appel simple, nous ne voulons rien exécuter d'autre die ();

Comme vous pouvez le voir, je passe un argument aux crochets avec get_the_ID () . Toute fonction accrochée à notre action hook pourra utiliser cet argument. Voyons quelques exemples:

/ ** * Afficher l'image sélectionnée avant le titre * / function wpt_show_post_image ($ post_id) echo get_the_post_thumbnail ($ post_id, 'thumbnail');  add_action ('cool_ajax_before_title', 'wpt_show_post_image'); / ** * Afficher les catégories de message après le titre * / function wpt_show_post_cats ($ post_id) echo get_the_category_list (",", $ post_id);  add_action ('cool_ajax_after_title', 'wpt_show_post_cats');

Aussi, vous pouvez utiliser do_action () crochets pour exécuter d'autres actions au lieu d'ajouter un nouveau balisage comme dans l'exemple ci-dessus. Par exemple, dans WordPress Social Invitations, j’ai un crochet d’action qui se déclenche chaque fois qu’un message est envoyé. Puis en utilisant myCRED plugin je peux accrocher l'action de donner des points à l'utilisateur qui vient d'envoyer le message.

Comme vous pouvez le constater, l'ajout de points d'ancrage et de filtres profitera non seulement à votre plugin, mais également aux autres développeurs et utilisateurs. Alors pourquoi ne pas commencer à ajouter des filtres et des actions autour de?

Conclusion

Aujourd'hui, nous avons appris comment inclure des scripts et des styles, comment procéder. Ajax appelle la méthode WordPress et quelques astuces de base pour le filtrage et les actions. Nous avons déjà beaucoup d’informations pour développer un joli plugin et je peux maintenant dire que ces séries sont proches de la fin.

 Dans l'article à venir et final, je vais parler d'internationalisation, de débogage et de documentation pour résumer ce que je considère comme les principaux éléments à prendre en compte lors du développement d'un plugin..