Objectif Meilleures pratiques pour le développement de plug-ins? [fermé]

128

Création d'un wiki de communauté pour collecter les objectifs recommandés 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 à la définition des meilleures pratiques objectives afin que nous puissions éventuellement les utiliser dans le cadre d’un processus d’examen de la collaboration avec les communautés.

MISE À JOUR: Après avoir consulté les premières réponses, il apparaît clairement que nous n'avons besoin que d'une idée / suggestion / meilleure pratique par réponse et que les utilisateurs doivent consulter la liste pour s'assurer qu'il n'y a pas de doublons avant. poster.

    
posée MikeSchinkel 17.02.2011 - 17:29

37 réponses

66

Utiliser des actions et des filtres

Si vous pensez que les internautes souhaitent ajouter ou modifier des données: fournissez apply_filters () avant de renvoyer .

  

P.S. Une chose que je trouve un peu décevante et que répond à votre question est le pourcentage de plug-ins conçus uniquement pour les utilisateurs finaux, c’est-à-dire qui n’ont pas de crochets propres. Imaginez si WordPress était conçu comme la plupart des plugins? Ce serait inflexible et une solution très niche.

     

Peut-être que les choses seraient différentes si WordPress avait la possibilité d’installer automatiquement les plugins dont dépendaient d’autres plugins? En général, je dois écrire de nombreuses fonctionnalités dont j'ai besoin, car les clients veulent certaines choses et les plugins disponibles, même s'ils sont à 90%, ne me permettent pas de mettre à jour les 10% restants.

     

Je souhaite vraiment que les dirigeants de la communauté WordPress identifient un moyen de s'assurer que les plug-ins sont récompensés pour l'application des meilleures pratiques (comme l'ajout de points d'ancrage pour les autres développeurs), tout comme les bonnes réponses sont récompensées sur un site StackExchange.

Prenons un exemple dans une autre question :

  

Exemple: je veux faire quelque chose dans mon plugin quand quelqu'un retweet un article. S'il existait un point d'ancrage personnalisé dans le plug-in Retweet populaire auquel je pouvais m'attacher, ce serait génial. Donc, je peux modifier leur plug-in pour l'inclure, mais cela ne fonctionne que pour ma copie et je ne veux pas essayer de le redistribuer.

Connexes

réponse donnée Arlen Beiler 13.04.2017 - 14:37
53

Charger les scripts / CSS avec wp_enqueue_script et wp_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 et wp_enqueue_style lors de la liaison de fichiers JS et CSS et jamais directement via les balises <script> .

Connexes

réponse donnée hakre 13.04.2017 - 14:37
49

Prise en charge d'I18n

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 au cours de l'action init afin que l'utilisateur puisse accéder à l'action.

Voir le Codex: I18n pour les développeurs WordPress

Et aussi cet article: Charger correctement les fichiers de langue WP .

Depuis WordPress 4.6 +

WP 4.6 a modifié l’ordre de chargement et les emplacements vérifiés, ce qui facilite grandement 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, comme auparavant, ils devaient 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 pertinente depuis WP 4.6 +)

  

[...]
  Enfin, je voudrais souligner qu’il est important de charger les fichiers de langue utilisateur personnalisés à partir de WP_LANG_DIR avant de charger les fichiers de langue fournis avec le plug-in . Lorsque plusieurs fichiers mo sont chargés pour le même domaine, la première traduction trouvée sera utilisée. De cette manière, les fichiers de langue fournis par le plugin serviront de solution de secours pour les chaînes non traduites par l'utilisateur.

public function load_plugin_textdomain()
{
    $domain = 'my-plugin';
    // The "plugin_locale" filter is also used in load_plugin_textdomain()
    $locale = apply_filters( 'plugin_locale', get_locale(), $domain );

    load_textdomain( 
            $domain, 
            WP_LANG_DIR . '/my-plugin/' . $domain . '-' . $locale . '.mo' 
    );
    load_plugin_textdomain( 
            $domain, 
            FALSE, 
            dirname( plugin_basename(__FILE__) ) . '/languages/' 
    );
}
    
réponse donnée Stiofan O'Connor 04.05.2017 - 20:59
45

Assurez-vous que les plugins ne génèrent aucune erreur avec WP_DEBUG

Testez toujours vos plug-ins avec WP_DEBUG activé. allumez-le tout au long de votre processus de développement. Un plugin ne doit lancer AUCUNE erreur avec WP_DEBUG on. Cela inclut les avis obsolètes et les index non vérifiés.

Pour activer le débogage, modifiez votre fichier wp-config.php de sorte que la constante WP_DEBUG soit définie sur true . Consultez le Codex sur le débogage pour plus de détails.

    
réponse donnée John P Bloch 25.08.2010 - 22:13
40

Première utilisation des fonctions existantes dans WordPress Core

Si vous le pouvez: utilisez les fonctions existantes incluses dans le noyau de WordPress au lieu d'écrire les vôtres. Ne développez des fonctions PHP personnalisées que s’il n’existe pas de fonction préexistante appropriée dans le noyau WordPress.

Un des avantages est que vous pouvez utiliser "consigner les notifications obsolètes" pour surveiller facilement les fonctions qui doivent être remplacées. Les utilisateurs peuvent également consulter la documentation de la fonction 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.

Connexes

réponse donnée hakre 13.04.2017 - 14:37
33

Empêcher l'injection SQL avec les données d'entrée

Un plugin doit effacer 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: Mise en forme des instructions SQL .

    
réponse donnée hakre 25.08.2010 - 21:00
33

La désinstallation doit supprimer toutes les données d'un plugin

Lors de la suppression d'une installation WordPress, un plug-in doit supprimer tous les fichiers, dossiers, entrées de base de données et tableaux qu'il a créés, ainsi que les valeurs d'option créées. .

Les plug-ins peuvent offrir une option pour exporter / importer les paramètres, afin que les paramètres puissent être enregistrés en dehors de WordPress avant suppression.

Connexes

réponse donnée hakre 13.04.2017 - 14:37
30

Utiliser un code PHP5 orienté objets et classes

Il n'y a aucune raison de ne pas écrire du code PHP5 propre et orienté objet. La prise en charge de PHP4 disparaîtra après la prochaine version (WP 3.1). Bien sûr, vous pouvez préfixer tous vos noms de fonctions pour 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 afin de pouvoir facilement l'étendre et la maintenir:

// in functions.php
require 'inc/class-my-cool-plugin.php';
new MyCoolPlugin();

// in inc/class-my-cool-plugin.php
class MyCoolPlugin {
    function __construct() {
        // add filter hooks, wp_enqueue_script, etc.

        // To assign a method from your class to a WP 
        // function do something like this
        add_action('admin_menu', array($this, "admin"));
    }

    public function admin() {
        // public methods, for use outside of the class
        // Note that methods used in other WP functions 
        // (such as add_action) should be public
    }

    private function somethingelse() {
        // methods you only use inside this class
    }
}
    
réponse donnée Husky 01.09.2010 - 16:58
29

Préfixez tous les éléments d'espace de noms global

Un plugin devrait 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ôt comme jpb_init() .

Son nom commun doit utiliser un préfixe de trois ou quatre lettres devant les noms ou utiliser le PHP Fonction d'espace de noms . Comparez: Préfixe à lettre unique pour les constantes de classe PHP?

Connexes

réponse donnée hakre 23.05.2017 - 14:40
25

La désactivation ne doit pas provoquer la perte de données

Un plugin ne doit pas supprimer aucune de ses données lors de la désactivation .

Connexes

réponse donnée MikeSchinkel 13.04.2017 - 14:37
23

Incluez uniquement les fichiers dont vous avez besoin ...

Si vous êtes au début, n'incluez pas de code relatif au domaine d'administration.

    
réponse donnée Denis de Bernardy 13.01.2011 - 23:05
21

Annoncez la perte de données lors de la désinstallation du plugin

Lors de la désinstallation , un plug-in doit informer l'utilisateur qu'il va supprimer ses données et recevoir la confirmation qu'il accepte la suppression. les données avant de le faire et un plugin devrait également permettre à l'utilisateur de conserver les données lors de la désinstallation. (Cette idée de @EAMann.)

Connexes

réponse donnée hakre 13.04.2017 - 14:37
19

Que le nom du dossier du plug-in soit modifié

/ plugins / pluginname / {divers}

Le "nom du plugin" utilisé pour le dossier doit 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 de nombreux plugins populaires sont des pécheurs.

Connexes:

  • plugins_url() pour un lien facile vers des ressources, incluses dans le plugin.
réponse donnée AndyBeard 10.01.2011 - 08:39
18

Utiliser WordPress (intégré) Traitement des erreurs

Ne vous contentez pas de return; si une entrée utilisateur était fausse. Fournissez-leur des informations sur ce qui a été fait de manière erronée.

function some_example_fn( $args = array() ) 
{
    // If value was not set, build an error message
    if ( ! isset( $args['some_value'] ) )
        $error = new WP_Error( 'some_value', sprintf( __( 'You have forgotten to specify the %1$s for your function. %2$s Error triggered inside %3$s on line %4$s.', TEXTDOMAIN ), '$args[\'some_value\']', "\n", __FILE__, __LINE__ ) );

    // die & print error message & code - for admins only!
    if ( isset( $error ) && is_wp_error( $error ) && current_user_can( 'manage_options' ) ) 
        wp_die( $error->get_error_code(), 'Theme Error: Missing Argument' );

    // Elseif no error was triggered continue...
}

Une erreur (objet) pour tous

Vous pouvez configurer un objet d'erreur globale pour votre thème ou plug-in lors de l'amorçage:

function bootstrap_the_theme()
{
    global $prefix_error, $prefix_theme_name;
    // Take the theme name as error ID:
    $theme_data = wp_get_theme();
    $prefix_theme_name = $theme_data->Name;
    $prefix_error = new WP_Error( $theme_data->Name );

    include // whatever, etc...
}
add_action( 'after_setup_theme', 'bootstrap_the_theme' );

Plus tard, vous pourrez ajouter un nombre illimité d’erreurs à la demande:

function some_theme_fn( $args )
{
    global $prefix_error, $prefix_theme_name;
    $theme_data = wp_get_theme();
    if ( ! $args['whatever'] && current_user_can( 'manage_options' ) ) // some required value not set
        $prefix_error->add( $prefix_theme_name, sprintf( 'The function %1$s needs the argument %2$s set.', __FUNCTION__, '$args[\'whatever\']' ) );

    // continue function...
}

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 vous pouvez toujours afficher toutes vos erreurs pour le développement

function dump_theme_errors()
{
    global $prefix_error, $prefix_theme_name;

    // Not an admin? OR: No error(s)?
    if ( ! current_user_can( 'manage_options' ) ! is_wp_error( $prefix_error ) )
        return;

    $theme_errors = $prefix_error->get_error_messages( $prefix_theme_name );
    echo '<h3>Theme Errors</h3>';
    foreach ( $theme_errors as $error )
        echo "{$error}\n";
}
add_action( 'shutdown', 'dump_theme_errors' );

Pour plus d'informations, consultez la ce Q . Un ticket associé pour résoudre le "travail ensemble" de WP_Error et wp_die() est lié à partir de là et un autre ticket suivra. Commentaires, critiques & tel est apprécié.

    
réponse donnée kaiser 13.04.2017 - 14:37
17

Réduire les noms ajoutés à l'espace de noms global

Un plugin doit réduire son impact autant que possible en minimisant le nombre de noms qu'il ajoute à l'espace de nom global .

Ceci peut être réalisé en encapsulant les fonctions du plugin dans une classe ou en utilisant la fonctionnalité d'espaces de nommage PHP . Tout préfixer peut aussi aider, mais n’est pas aussi flexible.

A côté des fonctions et des classes, un plugin ne devrait pas introduire des variables globales. L’utilisation des classes les obsolète normalement et simplifie la maintenance des plugins.

Connexes

réponse donnée hakre 13.04.2017 - 14:37
16

Protection de la confidentialité des utilisateurs de plug-ins

(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 à la seconde. soirée non contrôlée.

    
réponse donnée EAMann 23.08.2010 - 22:17
16

Commenter avec PhpDoc

La meilleure pratique est proche du style PhpDoc. Si vous n'utilisez pas d'EDI tel que "Eclipse", vous pouvez simplement jeter un coup d'oeil sur le PhpDoc. Manuel .

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 votre façon d’expliquer cela au même niveau de connaissance.

    
réponse donnée kaiser 25.08.2010 - 22:00
16

Utilisez l'API de configuration 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 API de paramètres qui prend soin de tout pour vous.

Utilisez l'API de modification de thème avant add_option

La API de modifications 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 & simple.

    
réponse donnée kaiser 28.10.2011 - 11:51
14

Plugins hôtes sur WordPress.org

Utilisez le référentiel SVN fourni. sur WordPress.org pour l'hébergement de 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.

    
réponse donnée MikeSchinkel 25.08.2010 - 21:45
14

Fournir un contrôle d'accès à l'aide des autorisations

Dans de nombreux cas, les utilisateurs peuvent souhaiter que tout le monde n'ait pas accès aux zones créées par votre plug-in, en particulier les plug-ins effectuant plusieurs opérations complexes. Une vérification de la fonctionnalité codée en dur peut s'avérer insuffisante.

A tout le moins, ayez les contrôles de capacité appropriés pour tous les types de procédures pour lesquels votre plugin peut être utilisé.

    
réponse donnée eddiemoya 25.08.2010 - 21:47
12

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 doit fournir l'importation / exportation de données telles que la configuration et l'entrée utilisateur .

L'importation / exportation améliore la convivialité d'un plugin.

Un exemple de plug-in doté d'une telle fonctionnalité d'importation et d'exportation (ainsi que d'un mécanisme d'annulation) est Breadcrumb NavXT ( Wordpress Plugin) (divulgation complète: un peu de code de ma part, la plupart a été fait par mtekk).

Connexes

réponse donnée hakre 13.04.2017 - 14:37
12

Organisez 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., puis les fonctions dont le plugin / thème a besoin et enfin le constructeur (par exemple, l'écran d'administration, les éléments qui s'intègrent au thème, 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 au cours d'une année et que vous n'avez pas vu le code depuis plus longtemps.

C’est aussi bien d’avoir une structure que vous répétez souvent, pour que vous trouviez toujours 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.

    
réponse donnée kaiser 06.01.2011 - 22:12
11

Mourir avec style

mourir de manière décente Toutes les fonctions des plugins (et même des thèmes) doivent utiliser 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 et wp_die peut 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 interrompu.

L'utilisation de wp_die() contribue également à la compatibilité de vos plugins / thèmes avec suite de tests wordpress .

En relation:
réponse donnée hakre 13.04.2017 - 14:37
10

Offrir des formulaires extensibles

Quand un plugin offre la possibilité de saisir des données, il doit toujours avoir un crochet à 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 boutons aussi.

Voir: API de configuration

Connexes

réponse donnée hakre 13.04.2017 - 14:37
10

Fournir des écrans d'aide aux utilisateurs

Il est préférable de dire RTFM (cliquez sur Aide) comme réponse plutôt que de devoir répondre à la question à maintes reprises.

/**
  * Add contextual help for this screen
  * 
  * @param $rtfm
  * @uses get_current_screen
  */ 
  function ContextualHelp( /*string*/ $rtfm) 
  { 
     $current_screen = get_current_screen();
     if ($current_screen->id == $this->_pageid) 
     {
        $rtfm .= '<h3>The WordPress Plugin - Screen A</h3>';
        $rtfm .= '<p>Here are some tips: donate to me ' .
     }
     return $rtfm; 
  }
add_action('contextual_help', array($this,'ContextualHelp'),1,1);

update / note: (voir les commentaires de kaiser): l'exemple ci-dessus doit être utilisé dans une classe

    
réponse donnée edelwater 04.12.2013 - 11:09
9

inclure la fonction toujours par crochet, pas directement.

Exemple:

  • Ne pas utiliser pour inclure la classe du plug-in via new sans hook

  • Utilisez le crochet plugins_loaded

    // add the class to WP                                   
    function my_plugin_start() {                                                               
        new my_plugin();   
    }                                                        
    add_action( 'plugins_loaded', 'my_plugin_start' );
    

Mise à jour: un petit exemple en direct: plugin-svn-trunk-page et un pseudo exemple

//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

Vous pouvez également charger via mu_plugins_loaded lors d’une installation multisite, voir le codex pour la référence de l’action: enlace . Ici aussi, voyez-vous comment wlcude wp avec ce hook: enlace J'utilise cela très souvent et ce n'est pas si difficile et précoce, mieux comme une nouvelle classe difficile ();

    
réponse donnée bueltge 14.02.2011 - 22:13
8

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 licence GPL . Veillez à ce que toutes les bibliothèques de codes incluses dans le plug-in soient compatibles avec la même licence.

(Cela a posé un problème et posé un problème grave point de débat dans le passé et present .)

    
réponse donnée EAMann 13.04.2017 - 14:37
8

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.

Évitez 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.

    
réponse donnée Greg 30.08.2010 - 05:41
7

Réduire les effets secondaires des sources de données et des services Web distants

Un plugin devrait un service Web Cache / Shield et / ou des requêtes XMLRPC / SOAP via une couche de mise en cache / fournisseur de données si vous les utilisez afin de ne pas faire de demandes frontales en attente d'une réponse (lente) du service Web.

Cela inclut le téléchargement du flux RSS et d’autres pages. Indiquez aux plug-ins qu'ils demandent des données en arrière-plan.

Une étape possible est (par exemple, la publication sur ping.fm): Créez une table tampon, disons: ping_fm_buffer_post ( date, heure, message, soumis_heure, statut )

  1. Pour chaque fois que vous souhaitez soumettre une mise à jour à ping.fm, ajoutez-la à ce tableau.
  2. Nous devons maintenant créer un plugin pour gérer ces données. Ce plugin fonctionnera via crontab pour vérifier chaque mise à jour non encore soumise
  3. Comme nous avons ce tableau, nous pouvons également répertorier tous les messages soumis à ping.fm et vérifier le statut de chaque message. Juste au cas où il y aurait un problème du côté de ping.fm, nous pouvons le soumettre à nouveau.
réponse donnée hakre 30.08.2010 - 04:53
7

Testez votre plugin

Nous devrions définitivement avoir des outils de test sur notre environnement de développement de plugins.

D'après cette réponse de Ethan Seifert à une question test, voici les bonnes pratiques à suivre:

  • Votre test d'unité doit tester la plus petite quantité de comportement qu'une classe puisse avoir.
  • Lorsque vous atteignez le niveau de test fonctionnel, vous pouvez tester votre code avec des dépendances Wordpress.
  • En fonction de votre plug-in, envisagez d'utiliser des tests basés sur Selenium permettant de détecter la présence de données dans le DOM à l'aide d'identifiants
réponse donnée Fernando Briano 13.04.2017 - 14:37

Lire d'autres questions sur les étiquettes