Conseils pour les meilleures pratiques de développement WordPress

Dans cette série, nous allons couvrir les points les plus importants à prendre en compte lors du développement d’un plugin WordPress ou d’un thème WordPress.. 

Ce guide a pour objectif de fournir un ensemble de bonnes pratiques utiles aux débutants et aux développeurs experts qui commencent à utiliser WordPress.

Mais attendez! Si vous développez des plugins WordPress depuis un moment, jetez un œil avant de décider que ce guide ne vous convient pas. Je suis sûr que vous aurez quelque chose de cela. Après tout, nous avons tous quelque chose d'unique à offrir.

La plupart des explications de cette série existent déjà dans le Codex, mais je sais qu’elle contient tellement d’informations qu’il peut être difficile de savoir par où commencer..

Aujourd'hui, nous couvrons les sujets suivants:

  1. Les normes de codage WordPress
  2. Eviter les collisions de nom de fonction
  3. Commentaires de code
  4. Conseils de sécurité

La série se veut aussi claire que possible et inclura des exemples bons et bas afin de donner une idée de la façon dont certaines choses devrait fonctionne lors de l'écriture de code spécifique à WordPress.

Notez que tout n’est pas obligatoire pour écrire un plugin; Cependant, si vous ne faites que commencer, alors pourquoi ne pas partir du bon pied?

Je vais essayer de rendre ces séries faciles à lire. Je vais inclure des exemples de code bons et mauvais. Tout ce qui est expliqué ici n’est pas obligatoire pour écrire un plugin, mais si vous débutez avec le développement Wordpress, pourquoi ne pas commencer du bon pied? Une fois que cela deviendra une habitude, il sera difficile de le faire mal.

Normes de codage WordPress

Personnellement, c'est l'un de mes plus gros défauts lorsque je développe des plugins. Si vous développez des outils pour WordPress, vous devez simplement suivre les normes de codage WordPress. Les normes de codage contribuent à améliorer la lisibilité du codeetaide à éviter les erreurs de codage courantes. 

WordPress est un CMS collaboratif et une chose aussi simple, puisque tout le monde écrit du code de la même manière, facilite la lecture, l'écriture et la maintenance du code pour tous. Au début, il peut être difficile de changer le style de codage avec lequel vous êtes habitué, mais vous constaterez que cela deviendra une seconde nature et que votre code sera plus propre et beaucoup plus facile à lire..

Dans le manuel WordPress, les normes sont réparties dans les quatre principales langues utilisées

  1. Normes de codage CSS
  2. Normes de codage HTML
  3. Normes de codage JavaScript
  4. Normes de codage PHP

Exemples

Ci-dessous, je vais vous montrer quelques exemples simples de style d'accolade PHP, afin que vous puissiez avoir une idée.

Mauvais exemples

if (condition) action0 ($ var); si (condition) action1 ();  elseif (condition2) action2a (); action2b (); 

Bons exemples

if (condition) action0 ($ var);  if (condition) action1 ();  elseif (condition2) action2a (); action2b (); 

Le deuxième exemple est beaucoup plus facile à lire, n'est-ce pas? Le Manuel des normes de codage regorge d'exemples qui vous aideront à rendre votre code plus propre. Il est facile de s’étonner de voir comment quelque chose d'aussi simple que quelques espaces et tabulations peut améliorer la lisibilité de votre code.

En écrivant cet article, j'ai acheté un thème pour un client et quand je suis allé éditer du code, j'ai été choqué de voir à quel point il était difficile de le faire.. 

Voici ce que je veux dire:

 
>
"title =""> ';?> '; foreach ($ categories as $ tag) $ tag_link = get_category_link ($ tag-> term_id); $ titleColor = categorys_title_color ($ tag-> term_id, "category", false); echo ''. $ tag-> name. ''; écho "";?>

Un peu effrayant, non? Après quelques minutes d'utilisation de ce code, j'ai envoyé un courrier électronique à l'auteur avec un lien vers le livre des normes de codage..

Eviter les collisions de nom de fonction

Les collisions de noms se produisent lorsqu'une fonction porte le même nom qu'une fonction déjà définie. Par exemple, si dans votre thème vous avez une fonction appelée get_the_post_terms () et vous installez un plugin qui a une fonction avec le même nom, vous obtiendrez quelque chose comme:

Erreur fatale: impossible de redéclarer get_the_post_terms () (précédemment déclaré dans… 

Malheureusement, ils se produisent beaucoup plus souvent qu'ils ne le devraient. Le truc, c'est qu'il est facile d'éviter.

Pour éviter cela, nous avons des options:

1. Préfixez vos fonctions

Par exemple, si le nom de votre plugin est "WordPress Cool Plugin", vous pouvez utiliser un wcc_ préfixe dans toutes vos fonctions. 

Donc, dans l'exemple ci-dessus, notre nom de fonction sera wcc_get_the_post_terms ()

Je vous recommande également de préfixer votre CSS, ou du moins d'essayer de le rendre plus unique pour éviter de modifier d'autres styles de plugins

2. Enveloppez vos fonctions dans une classe

Peut-être que votre plugin est si simple qu'il n'a pas besoin de cours, mais vous pouvez toujours en créer un pour que tout reste organisé. J'aime particulièrement utiliser le modèle singleton, mais consultez l'exemple ci-dessous pour une classe simple avec une méthode statique.

class Wcc_Mailer fonction statique send ($ post_ID) $ friends = '[email protected]'; mail ($ friends, "Nouveau message!", "Vérifier mon nouveau message dans". get_permalink ($ post_ID)); return $ post_ID;  add_action ('publish_post', array ('Wcc_Mailer', 'send'));

Comme vous pouvez le voir sur cet exemple, je n'ai préfixé que le nom de ma classe, mais ma fonction s'appelle simplement "envoyer". Ce nom de méthode est maintenant protégé de l'espace de noms global et ne peut pas être appelé directement. Pour l'appeler, je devrai faire ceci:

Wcc_Mailer :: send ($ post_id);

Code de commentaire

Les commentaires de Code sont les meilleurs amis du développeur. Vous trouverez peut-être inutile de commenter chaque fonction ou variable que vous créez, mais croyez-moi, lorsque votre code s'agrandit - en particulier lorsqu'il reçoit des contributions d'autres personnes - il peut devenir difficile de savoir exactement quoi faire..

Comme je l’ai déjà dit, WordPress est un CMS collaboratif. Beaucoup de développeurs se pencheront sur votre code et, avec de l'aide, ils iront dans la bonne voie..

Personnellement, j'utilise PHPDoc sintax pour commenter mes fonctions et avec Sublime + Docblockr, il est très facile de le faire.. 

Voyons comment les gars de Wordpress commentent le wp_mail () fonction située dans wp-includes / pluggable.php

/ ** * Envoi d'un courrier similaire à celui de PHP * * Une valeur de retour vraie ne signifie pas automatiquement que l'utilisateur a reçu le courrier électronique avec succès. Cela signifie simplement que la méthode utilisée a été en mesure de * traiter la requête sans erreur. * * L'utilisation des deux hooks 'wp_mail_from' et 'wp_mail_from_name' permet de * créer une adresse de type comme 'Nom 'quand les deux sont définis. Si * uniquement 'wp_mail_from' est défini, seule l'adresse e-mail sera utilisée sans * nom. * * Le type de contenu par défaut est 'text / plain', ce qui ne permet pas l'utilisation de HTML. * Toutefois, vous pouvez définir le type de contenu de l'email en utilisant le filtre * 'wp_mail_content_type'. * * Le jeu de caractères par défaut est basé sur le jeu de caractères utilisé sur le blog. Le jeu de caractères peut * être défini à l'aide du filtre 'wp_mail_charset'. * * @since 1.2.1 * * @uses PHPMailer * * @param string | array $ to Array ou liste d'adresses e-mail séparées par des virgules pour l'envoi de messages. * @param string $ subject Objet de l'e-mail * @param string $ message Contenu du message * @param string | array $ headers Facultatif. En-têtes supplémentaires. * @param string | array $ attachments Facultatif. Fichiers à joindre. * @return bool Si le contenu de l'e-mail a été envoyé avec succès. * / function wp_mail ($ to, $ subject, $ message, $ headers = ", $ attachments = array ()) […] // Envoyer! try return $ phpmailer-> Send (); catch (phpmailerException $ e) retour false;

Comme vous pouvez le voir, ils décrivent ce que fait la fonction, quels paramètres sont nécessaires et ce qu’elle va retourner.. 

Assez explicite, à droite?

Les commentaires ne sont pas destinés à être utilisés uniquement avec PHP. En HTML, par exemple, j'aime bien utiliser à la fin de gros blocs de code afin que je ne me perds pas si facilement.

Pour les CSS, j'utilise des commentaires pour diviser mon code en différentes sections.. 

Par exemple :

/ ********************** GENERAL STYLES ******************** / body font- famille: Arial; couleur: # 333;  / *********************************************** ****************** H1, H2, H3, H4, H5 STYLES ********************* ******************************************* / h1, .h1  taille de police: 2.5em; hauteur de ligne: 1em; famille de polices: $ vag-bold;  / ********************** STYLES DE NAVIGATION ********************* / nav color :rouge  [… ]

Partagez vos astuces avec nous!

Conseils de sécurité

La sécurité doit être prise très au sérieux! Si votre plugin ou thème devient populaire, croyez-moi, vous ne voulez pas être le coupable de milliers de sites piratés. Si vous pensez que j'exagère, jetez un coup d'œil à la recherche effectuée par Checkmarx en 2013 sur les 50 principaux plugins WordPress.

Voyons maintenant quelques conseils de sécurité pour le développement de WordPress:

Vulnérabilités XSS

Pour prévenir XSS, nous devons faire deux choses. Désinfectez l'entrée de données et désinfectez les données de sortie. Nous disposons de plusieurs méthodes pour assainir en fonction des données et du contexte utilisé. En règle générale, vous n’avez pas besoin de faire confiance aux données d’entrée ni aux données qui seront exportées..

Pour les données d'entrée, vous pouvez utiliser par exemple sanitize_text_field () qui vérifie la validité de UTF-8, Convert single < characters to entity, strip all tags, remove line breaks, tabs and extra white space and strip octets. Depending on the context you are, there are different functions that will help you out sanitizing your data.

La même chose se produit lorsque vous sortez vos données. Vérifiez l'exemple suivant sur la façon de générer un lien:

"> 

esc_url rejette les URL non valides, élimine les caractères non valides et supprime les caractères dangereux

esc_html encode < > & "'lors de la sortie HTML.

Encore une fois, en fonction des données dont vous disposez, différentes fonctions vous aideront. Pour JavaScript, vous pouvez utiliser esc_js.

En plus de la désinfection, n'oubliez pas de valider votre date, ainsi que.

Empêcher l'accès direct à vos fichiers

La plupart des hôtes permettent un accès direct aux fichiers. Dans votre plugin, cela signifie probablement que certaines erreurs PHP se produiront et que ces erreurs sont des informations précieuses pour les attaquants.. 

Un code très basique pour empêcher cela, que vous pouvez placer en haut de votre script est le suivant:

// Quitter si on y accède directement si (! Defini ('ABSPATH')) exit; 

Cela empêche essentiellement d'exécuter le script si nous n'y accédons pas via WordPress.

Supprimer tous les avertissements et avis

Non seulement les erreurs PHP aident les attaquants - les notifications et les avertissements contiennent également de nombreuses informations utiles. Chaque plugin devrait être codé en utilisant le mode DEBUG. Cela aidera également à attraper des fonctions obsolètes sur votre plugin. Autoriser DÉBOGUER mode simple recherche cette ligne sur votre wp-config.php et le changer en VRAI.

define (WP_DEBUG, true);

Parallèlement à cela, vous devriez essayer l'excellent plugin Debug Bar. En ajoutant cette autre ligne simple, vous pourrez également analyser toutes les requêtes de la base de données..

define ('SAVEQUERIES', vrai);

Utiliser des valeurs nonce

Les valeurs nonce sont des abréviations pour les nombres utilisés une seule fois et servent à protéger contre les falsifications de requêtes intersites, ou CSRF, qui, en d’autres termes, sont des requêtes inattendues ou en double susceptibles de provoquer des modifications non souhaitées, permanentes ou irréversibles, du site Web et en particulier base de données. Tout cela peut être effectué par un attaquant ou simplement par la simple erreur d'un utilisateur de confiance..

Selon l'endroit où vous avez besoin du nonce, vous pouvez le créer de différentes manières:

Pour l'utiliser sur un lien, utilisez wp_nonce_url ()

$ complete_url = wp_nonce_url ($ bare_url, 'trash-post', 'my_nonce');

Pour l'utiliser sur un formulaire, utilisez wp_nonce_field ()

wp_nonce_field ('trash-post', 'my_nonce');

Pour l'utiliser ailleurs, utilisez wp_create_nonce ()

wp_localize_script ('mon-script', 'mon-nom-var', array ('nonce' => wp_create_nonce ('trash-post', 'mon_nonce'));

Si vous vérifiez mon exemple ci-dessus, vous verrez comment je l'utilise wp_localize_script (dont je parlerai dans le prochain article) pour inclure mon nonce dans un bloc de code JavaScript. Je le fais parce que je prévois d'utiliser jQuery pour faire une demande AJAX plus tard et que vous devriez toujours inclure un nonce sur vos appels AJAX..

Ensuite, dans votre script pour simplement vérifier le nonce, vous entrez le code suivant

if (! wp_verify_nonce ('trash_post', 'my_nonce')) die ('Busted!'); 

Utiliser les fonctions et les bibliothèques de WordPress

Vérifiez toujours si ce que vous essayez de faire est possible avec les fonctions et bibliothèques principales de WordPress. De cette façon, vos scripts seront moins sujets aux vulnérabilités et, si certains apparaissent, ils seront corrigés par les contributeurs principaux de WordPress et vous n'aurez plus à vous soucier de contacter tous vos clients..

L'exemple le plus célèbre est la bibliothèque TimThumb qui, il y a quelques années encore, était utilisée par des milliers de plugins et de thèmes. Un jour, en 2011, la vulnérabilité a été révélée. Depuis lors, nous pouvons maintenant utiliser la fonction intégrée add_image_size () fonctionner à cet effet. 

D'autres fonctions courantes sont intégrées aux fonctions WordPress telles que boucle qui peut être facilement remplacé par wp_remote_get et wp_remote_post qui va non seulement encoder les données mais ils offriront également des solutions de rechange, si boucle échoue.

Un autre exemple sera l'utilisation de get_template_part () au lieu d'utiliser le exiger() ou comprendre() Fonctions PHP. Bien qu’ils soient fondamentalement identiques, le premier sait déjà où se trouve votre thème et il recherchera le fichier demandé dans le répertoire de ce thème. Il n’émettra pas d’avertissement ni d’erreur fatale si le fichier demandé n’existe pas. recherche d'autres fichiers appropriés, si le fichier demandé est introuvable et qu'il est informé des thèmes enfants et des thèmes parents.

Le noyau WordPress comprend de nombreux scripts que nous pouvons utiliser dans nos plugins ou nos thèmes. Alors jetez toujours un coup d'œil avant d'ajouter de nouvelles bibliothèques.

Et après?

J'espère que vous avez beaucoup tiré de cet article. Comme je l'ai mentionné au début, la plupart de ces informations existent déjà dans le Codex, ce qui devrait être votre premier arrêt maintenant que vous avez commencé votre aventure de développement WordPress..

Lorsque j'ai commencé à développer avec WordPress il y a quelques années, j'aurais souhaité avoir un guide comme celui-ci avec toutes les informations, alors c'est la raison principale pour laquelle j'ai décidé d'écrire ces séries.. 

Dans le prochain article, j'expliquerai les sujets suivants:

  1. La bonne façon d'ajouter JavaScript et les feuilles de style dans votre plugin
  2. Comment utiliser correctement Ajax dans WordPress
  3. Laissez vos utilisateurs faire des changements avec des crochets

S'il vous plaît n'hésitez pas à laisser vos commentaires ou suggestions pour les deux articles restants sur ces séries.