Lancer un wiki de communauté pour rassembler les meilleures pratiques objectives pour le développement de plugins. Cette question a été inspirée par les commentaires de @ EAMann sur les wp-hackers .
L'idée est de collaborer sur ce que pourraient être les meilleures pratiques objectives afin que nous puissions éventuellement les utiliser dans le cadre d'un processus d'examen de la collaboration avec la communauté.
MISE À JOUR: Après avoir vu les premières réponses, il devient clair que nous n'avons besoin que d'une idée / suggestion / meilleure pratique par réponse et les personnes doivent consulter la liste pour s'assurer qu'il n'y a pas de doublons avant la publication.
plugin-development
customization
wiki
MikeSchinkel
la source
la source
Réponses:
Utiliser des actions et des filtres
Si vous pensez que les gens aimeraient ajouter ou modifier des données: fournissez apply_filters () avant de retourner .
Prenons un exemple d' une autre question :
Apparenté, relié, connexe
la source
Charger des scripts / CSS avec
wp_enqueue_script
etwp_enqueue_style
Les plug-in ne doivent pas charger / tenter de charger des versions en double de fichiers JS / CSS, en particulier jQuery et d'autres fichiers JS inclus dans WP Core.
Les plugins doivent toujours utiliser
wp_enqueue_script
etwp_enqueue_style
lors de la liaison de fichiers JS et CSS et jamais directement via des<script>
balises.Apparenté, relié, connexe
la source
I18n soutien
Toutes les chaînes de sortie doivent être liées à un domaine de texte approprié pour permettre l’internationalisation par les parties intéressées, même si le développeur n’a aucun intérêt à traduire son propre plug-in.
Notez qu'il est très important de charger les fichiers de langue pendant l'
init
action pour que l'utilisateur puisse s'y connecter.Voir le Codex: I18n pour les développeurs WordPress
Et aussi cet article: Chargement des fichiers de langue WP correctement .
Depuis WordPress 4.6+
WP 4.6 a modifié l’ordre de chargement et les emplacements vérifiés, ce qui a grandement facilité la tâche des développeurs et des utilisateurs.
Considérant un plugin avec un textdomain 'my-plugin', WordPress va maintenant rechercher un fichier de traduction dans:
/wp-content/languages/plugins/my-plugin-en_US.mo
S'il ne parvient pas à en trouver un ici, il en recherchera un pour lequel le plug-in lui dit de regarder (habituellement dans le dossier 'language' des pluigns si vous suivez le codex):
/ wp-content / plugins / my-plugin / languages / my- plugin-en_US.mo
Enfin, si aucun fichier de langue n’est trouvé, il vérifiera l’emplacement par défaut de:
/wp-content/languages/my-plugin-en_US.mo
La première vérification a été ajoutée en 4.6 et donne aux utilisateurs un emplacement défini pour ajouter un fichier de langue, car ils devaient auparavant savoir où le développeur avait ajouté le fichier de langue. Désormais, l'utilisateur doit simplement connaître le domaine textuel du plugin: / wp-content / languages / plugins / TEXTDOMAIN-LOCAL.mo
Ci-dessous l'ancienne méthode (non pertinent depuis le WP 4.6+)
la source
Assurez-vous que les plugins ne génèrent aucune erreur avec WP_DEBUG
Testez toujours vos plugins avec
WP_DEBUG
activé et idéalement, activez-le tout au long de votre processus de développement. Un plugin ne devrait lancer AUCUNE erreur avecWP_DEBUG
. Cela inclut les avis obsolètes et les index non vérifiés.Pour activer le débogage, modifiez votre
wp-config.php
fichier de sorte que laWP_DEBUG
constante soit définie surtrue
. Voir le Codex sur le débogage pour plus de détails.la source
Première utilisation des fonctions existantes dans WordPress Core
Si vous le pouvez: utilisez les fonctions existantes incluses dans WordPress Core au lieu d’écrire les vôtres. Ne développez des fonctions PHP personnalisées que lorsqu'il n'existe pas de fonction préexistante appropriée dans le noyau WordPress.
Un des avantages est que vous pouvez utiliser des "avis obsolètes" pour contrôler facilement les fonctions à remplacer. Un autre avantage est que les utilisateurs peuvent consulter la documentation sur les fonctions dans le Codex et mieux comprendre ce que fait le plug-in, même s'ils ne sont pas des développeurs PHP expérimentés.
Apparenté, relié, connexe
la source
wp-login.php
. Donc, "Si vous pouvez" était un bon débutant pour la réponse ...La désinstallation devrait supprimer toutes les données d'un plugin
Lorsqu'il est supprimé d'une installation WordPress, un plug-in doit supprimer tous les fichiers, dossiers, entrées de base de données et tables qu'il a créées, ainsi que les valeurs d'option créées.
Les plugins peuvent offrir une option pour exporter / importer les paramètres, afin que les paramètres puissent être enregistrés en dehors de WordPress avant la suppression.
Apparenté, relié, connexe
la source
Empêcher l'injection SQL avec les données d'entrée
Un plugin doit supprimer toutes les entrées utilisateur récupérées directement ou indirectement (par exemple via
$_POST
ou$_GET
) avant d'utiliser des valeurs d'entrée pour interroger la base de données MySQL.Voir: Formatage des instructions SQL .
la source
Préfixer tous les éléments d'espace de noms globaux
Un plugin doit correctement préfixer TOUS les éléments d’espace de noms globaux (constantes, fonctions, classes, variables, voire des éléments tels que les taxonomies personnalisées, les types de publication, les widgets, etc.). Par exemple, ne créez pas une fonction appelée
init()
; nommez-le plutôtjpb_init()
.Son point commun devrait utiliser un préfixe de trois ou quatre lettres devant les noms ou utiliser la fonctionnalité PHP Namespace . Comparez: Préfixe à une lettre pour les constantes de classe PHP?
Apparenté, relié, connexe
la source
Utiliser un code PHP5 orienté objet et classe
Il n'y a aucune raison de ne pas écrire du code PHP5 propre et orienté objet. Le support de PHP4 disparaîtra après la prochaine version (WP 3.1). Bien sûr, vous pouvez préfixer tous les noms de fonctions de manière à ce qu'ils finissent par interminly_long_function_names_with_lots_of_underscores, mais il est beaucoup plus facile d'écrire une simple classe et de regrouper tout le contenu. En outre, placez votre classe dans un fichier séparé et nommez-la en conséquence pour pouvoir l'étendre et la maintenir facilement:
la source
La désactivation ne doit pas provoquer la perte de données
Un plugin ne doit supprimer aucune de ses données lors de la désactivation .
Apparenté, relié, connexe
la source
Incluez uniquement les fichiers dont vous avez besoin ...
Si vous êtes au début, n'incluez pas de code lié à la zone d'administration.
la source
Annonce de Data-Loss lors de la désinstallation d'un plugin
Lors de la désinstallation, un plug-in doit inviter l'utilisateur à supprimer ses données et à recevoir une confirmation confirmant que l'utilisateur accepte de supprimer les données avant de le faire. Un plug-in doit également permettre à l'utilisateur de conserver les données lors de la désinstallation. (Cette idée de @EAMann.)
Apparenté, relié, connexe
la source
Que le nom du dossier du plugin soit changé
/ plugins / pluginname / {divers}
Le "pluginname" utilisé pour le dossier devrait toujours être modifiable.
Ceci est normalement géré en définissant les constantes et en les utilisant systématiquement dans le plugin.
Inutile de dire que beaucoup de plugins populaires sont des pécheurs.
Apparenté, relié, connexe:
plugins_url()
pour un lien facile aux ressources, inclus avec le plugin.la source
plugin_basename(__FILE__)
pour déterminer le nom local du plugin. Cela est utile pour avoir des copies du même plugin (test, plusieurs comptes ailleurs mais seulement un par plugin, ...).Utiliser WordPress (intégré) Traitement des erreurs
Ne vous contentez pas
return;
si une entrée utilisateur était fausse. Livrez-leur des informations sur a été fait mal.Une erreur (objet) pour tous
Vous pouvez configurer un objet d'erreur globale pour votre thème ou votre plugin pendant l'amorçage:
Plus tard, vous pourrez ajouter un nombre illimité d’erreurs à la demande:
Ensuite, vous pouvez tous les récupérer à la fin de votre thème. De cette façon, vous n'interrompez pas le rendu de la page et pouvez toujours afficher toutes vos erreurs pour le développement.
Vous trouverez de plus amples informations à ce Q . Un ticket associé pour résoudre le "travail ensemble" de
WP_Error
etwp_die()
est lié à partir de là et un autre ticket suivra. Les commentaires, critiques et autres sont appréciés.la source
wp_die();
était incorrect (inversé). A propos de votre Q) Je ne comprends pas tout à fait. Lorsque vous configurez une instance de la classe WP_Error vous avez accès à ses données grâce à des fonctions telles queget_error_code();
,get_error_message();
,get_error_data();
et les versions plurielles. Vous pouvez également l'instancier une seule fois au démarrage de votre thème ou de votre plug-in et simplement l'utiliser$error->add();
pour corriger d'autres erreurs et enfin l'afficher dans le pied de page avec$error->get_error_messages();
toutes les erreurs .WP_Error
et sewp_die()
rapproche (possède déjà un patch) au bas de la Q. Tous les commentaires, suggestions, critiques et autres sont très appréciés.Réduire les noms ajoutés à l'espace de noms global
Un plugin devrait réduire son impact autant que possible en minimisant le nombre de noms qu'il ajoute à l'espace de noms global .
Cela peut être fait en encapsulant les fonctions du plugin dans une classe ou en utilisant la fonction d'espaces de nommage PHP . Tout préfixer peut aussi aider mais n'est pas si flexible.
A côté des fonctions et des classes, un plugin ne doit pas introduire de variables globales. Utiliser des classes les obsolète normalement et cela simplifie la maintenance des plugins.
Apparenté, relié, connexe
la source
Commenter avec PhpDoc
La meilleure pratique est proche du style PhpDoc. Si vous n'utilisez pas d'IDE comme "Eclipse", vous pouvez simplement consulter le manuel de PhpDoc .
Vous n'avez pas besoin de savoir exactement comment cela fonctionne. Les développeurs professionnels peuvent quand même lire le code et en ont besoin comme résumé. Les codeurs amateurs et les utilisateurs peuvent apprécier la façon dont vous l'expliquez au même niveau de connaissance.
la source
Utiliser l'API Settings avant add_option
Au lieu d'ajouter des options à la base de données via la fonction add_option, vous devez les stocker sous forme de tableau avec l'aide de l' API de configuration qui s'occupe de tout pour vous.
Utiliser l'API de modification de thème avant add_option
L' API de modification est une construction assez simple et un moyen sûr qui permet d'ajouter et de récupérer des options. Tout est enregistré en tant que valeur sérialisée dans votre base de données. Facile, sûr et simple.
la source
update_option
et jamaisadd_option
, la fonction de mise à jour créera l'option lorsqu'elle n'existe pas .. :)add_option
. Il existe un bon cas d'utilisation dansadd_option
lequel, si l'option est déjà définie, elle n'est pas modifiée. Je l'utilise donc lors de l'activation pour conserver les préférences utilisateur déjà existantes.add_option
est lorsque vous souhaitez explicitement désactiver le chargement automatique.update_option
forcera automatiquement le chargement automatique à true, vous voulez donc désactiver le chargement automatique, à utiliseradd_option
lors de la création initiale de l'option.Protéger la confidentialité des utilisateurs du plugin
(Auparavant: Communication anonyme avec l'API)
Si un plug-in communique avec un système externe ou une API (par exemple, un Webservice), il doit le faire de manière anonyme ou fournir à l'utilisateur une option anonyme garantissant qu'aucune donnée liée à l'utilisateur du plug-in ne fuit à une deuxième partie sans contrôle.
la source
Plugins hôtes sur WordPress.org
Utilisez le référentiel SVN fourni sur WordPress.org pour héberger des plugins. Cela facilite la mise à jour de l'expérience utilisateur et, si vous n'avez jamais utilisé SVN auparavant, vous comprendrez vraiment en l'utilisant dans un contexte qui le justifie.
la source
Fournir un contrôle d'accès à l'aide d'autorisations
Dans de nombreux cas, les utilisateurs ne souhaitent peut-être pas que tout le monde ait accès aux zones créées par votre plug-in, en particulier dans le cas de plug-ins effectuant plusieurs opérations complexes. Une vérification de la fonctionnalité codée en dur peut s'avérer insuffisante.
Ayez au minimum des contrôles de capacité appropriés pour tous les types de procédures pour lesquels votre plugin peut être utilisé.
la source
Paramètres du plug-in d'importation / exportation
Ce n'est pas si commun entre les plugins, mais si votre plugin a (certains) paramètres, il devrait fournir Import / Export de données telles que la configuration et l'entrée utilisateur .
Import / Export améliore la facilité d'utilisation d'un plugin.
Breadcrumb NavXT (plugin Wordpress ) est un exemple de plug-in doté d'une telle fonctionnalité d'importation et d'exportation (ainsi que d'un mécanisme d'annulation ).
Apparenté, relié, connexe
la source
Organiser votre code
Il est toujours difficile de lire du code qui n'est pas écrit dans l'ordre dans lequel il est exécuté. Commencez par inclure / require, define, wp_enqueue_style & _script etc.
Essayez de séparer les éléments tels que css et js dans leurs propres dossiers. Essayez également de le faire avec des fonctions qui ne sont que des aides, comme les aplatissements de tableaux et similaires. Garder le fichier "principal" aussi propre et lisible que possible est un moyen d'aider les utilisateurs, les développeurs et vous-même lorsque vous essayez de mettre à jour votre logiciel dans l'année et que vous n'avez pas vu le code depuis plus longtemps.
Il est également bon d'avoir une structure que vous répétez souvent afin de toujours trouver votre chemin. Développer dans une structure connue sur différents projets vous donnera le temps de l'améliorer et même si votre client passe chez un autre développeur, vous n'entendrez jamais "il a laissé un chaos". Cela renforce votre réputation et devrait être un objectif à long terme.
la source
Mourir avec style
mourir de manière décente Toutes les fonctions d'un plugin (et même d'un thème) doivent être utilisées
wp_die()
dans des endroits critiques pour offrir à l'utilisateur un peu d'informations sur ce qui s'est passé. Les erreurs php sont ennuyeuses etwp_die
peuvent donner à l’utilisateur un joli message stylé sur ce que le plugin (ou eux) a mal fait. De plus, si l'utilisateur a désactivé le débogage, le plug-in sera simplement interrompu.En utilisant
Apparenté, relié, connexe:wp_die()
également, vos plugins / thèmes sont compatibles avec la suite de tests wordpress .la source
Fournir des écrans d'aide aux utilisateurs
Il est plus agréable de dire RTFM (cliquez sur aide) comme une réponse que de devoir répondre à la question à maintes reprises.
update / note: (voir les commentaires de kaiser): l'exemple ci-dessus doit être utilisé dans une classe
la source
Offrir des formulaires extensibles
Lorsqu'un plugin offre la possibilité de saisir des données, il doit toujours avoir un point d'accroche à la fin, juste avant le bouton "soumettre" et / ou "réinitialiser", afin que les développeurs puissent facilement étendre le formulaire avec non seulement des champs, mais également des boutons.
Voir: API de paramètres
Apparenté, relié, connexe
la source
inclure la fonction toujours par crochet, pas directement.
Exemple:
Ne pas utiliser pour inclure la classe du plugin via new sans hook
Utilisez le crochet plugins_loaded
Mise à jour: un petit exemple en direct: Plugin-svn-trunk-page et un pseudo exemple
Vous pouvez également charger via mu_plugins_loaded sur multisite-install, voir le codex pour la référence d’action: http://codex.wordpress.org/Plugin_API/Action_Reference . Ici aussi, vous voyez comment wLcude wP avec ce hook: http: // adambrown. info / p / wp_hooks / hook / plugins_loaded? version = 2.1 & fichier = wp-settings.php J'utilise cela très souvent et ce n'est pas si difficile et précoce, mieux comme une nouvelle classe difficile ();
la source
//avoid direct calls to this file where wp core files not present if (!function_exists ('add_action')) { header('Status: 403 Forbidden'); header('HTTP/1.1 403 Forbidden'); exit(); } if ( !class_exists( 'plugin_class' ) ) { class plugin_class { function __construct() { } } // end class function plugin_start() { new plugin_class(); } add_action( 'plugins_loaded', 'plugin_start' ); } // end class_exists
Licence Plugins sous une licence compatible GPL
Les plug-ins et les thèmes doivent être concédés sous une licence compatible WordPress. Cela leur permet d'être redistribués avec WordPress en tant que "programme". Une licence recommandée est la GPL . Veillez à ce que toutes les bibliothèques de codes fournies avec le plug-in soient compatibles avec la même licence.
(Cela a été un problème et un sujet de débat sérieux dans le passé et le présent .)
la source
La description de votre plugin doit détailler avec précision les fonctions de votre plugin. Il y a 10 plugins postaux en vedette. Tous affichent les articles en vedette, mais beaucoup ont des caractéristiques différentes. Il devrait être facile de comparer votre plugin à des plugins similaires en lisant la description.
Vous devriez éviter de vous vanter de la simplicité de votre plugin, à moins que ce ne soit vraiment très basique. Vous devez inclure des liens utiles dans la description, comme le lien vers les paramètres.
la source
Minimiser les effets secondaires des sources de données et des services Web distants
Un plugin doit mettre en cache / bouclier le service Web et / ou les requêtes XMLRPC / SOAP via une couche de mise en cache / fournisseur de données si vous les utilisez afin de ne pas créer de demandes frontales en attente d'une réponse (lente) du service Web.
Cela inclut le téléchargement de flux RSS et d'autres pages. Concevez vos plugins pour qu’ils demandent des données en arrière-plan.
Une étape possible est la suivante (prenez un message sur ping.fm par exemple): Créez une table tampon, par exemple: ping_fm_buffer_post (date, heure, message, heure soumise, statut)
la source
Testez votre plugin
Nous devrions définitivement avoir des outils de test sur notre environnement de développement de plugins.
Sur la base de cette réponse d’ Ethan Seifert à une question test, voici les bonnes pratiques à suivre:
la source