Question

Démarrage d'un wiki communautaire pour recueillir des objectifs les meilleures pratiques pour le développement du plugin. Cette question a été inspirée par @ commentaires de EAMann sur wp-pirates .

L'idée est de collaborer à ce que les meilleures pratiques objectives pourraient être afin que nous puissions éventuellement éventuellement les utiliser dans un processus d'examen de la collaboration communautaire.

Mise à jour: Après avoir vu les premières réponses, il est clair que nous devons avoir une seule idée / suggestion / les meilleures pratiques par réponse et les gens devraient examiner la liste pour assurer qu'il n'y a pas de doublons avant affichage.

Était-ce utile?

La solution

utiliser les actions et filtres

Si vous pensez que les gens aimeraient ajouter ou modifier certaines données: apply_filters () avant de retourner .

  

P.S. Une chose que je trouve un peu décevant et que vos adresses question est le pourcentage des plug-ins qui ne sont conçus que pour les utilisateurs finaux, à savoir qui ne disposent pas de leur propre crochets. Imaginez si WordPress a été conçu comme la plupart des plugins? Il serait inflexible et une solution de niche très.

     

Peut-être que les choses seraient différentes si WordPress devaient avoir la possibilité de plug-ins d'auto-installation sur lequel d'autres plugins dépendaient? Comme il est généralement j'écrire beaucoup de la fonctionnalité dont j'ai besoin à partir de zéro parce que les clients veulent que les choses d'une certaine façon et les plug-ins disponibles, alors que 90% là-bas, ne me permet pas la possibilité de mettre à jour les 10% restants.

     

Je ne souhaite vraiment ceux qui dirigent la communauté WordPress identifierait un moyen de faire en sorte que les plugins sont récompensés pour suivre les meilleures pratiques (telles que l'ajout des crochets pour d'autres développeurs) tout comme les bonnes réponses sont récompensées sur un site StackExchange.

Prenons un exemple de autre question :

  

Exemple: Je veux faire quelque chose dans mon plug-in quand quelqu'un retweets un article. S'il y avait un crochet personnalisé quel que soit le plugin retweet populaire est que je pouvais accrocher et pour tirer hors de, ce serait génial. Il n'y a pas, donc je peux modifier leur plug-in pour l'inclure, mais qui ne fonctionne que pour ma copie, et je ne veux pas essayer de redistribuer cela.

Related

Autres conseils

Scripts de charge / CSS avec wp_enqueue_script et wp_enqueue_style

Plugins ne doit pas charger / tenter de charger les versions en double de JS / fichiers CSS, en particulier jQuery et autres fichiers JS inclus dans WP base.

Plugins doit toujours utiliser wp_enqueue_script et wp_enqueue_style lors de la liaison des fichiers JS et CSS et jamais directement via des balises <script>.

Related

I18n soutenir

Toutes les chaînes de sortie doit être liée à un domaine de texte approprié pour permettre l'internationalisation par les parties intéressées, même si le développeur n'a pas d'intérêt

à traduire leur propre plug-in.

Notez qu'il est très important de charger les fichiers de langue pendant l'action de init afin que l'utilisateur peut se connecter dans l'action.

Voir le Codex: I18n pour WordPress développeurs

Et aussi cet article: Chargement langage WP fichiers correctement le <. / p>

Depuis WordPress 4.6 +

WP 4.6 a changé l'ordre de chargement et les lieux sélectionnés, il a rendu beaucoup plus facile pour les développeurs et les utilisateurs.

En considérant un plug-in avec un textdomain 'my-plugin', WordPress va maintenant rechercher d'abord un fichier de traduction:
/wp-content/languages/plugins/my-plugin-en_US.mo

Si elle ne parvient pas à trouver un là, il recherche ensuite un plug-in où le dit à regarder (usualy dans la langue de la «pluigns dossier si, après le codex):
/wp-content/plugins/my-plugin/languages/my-plugin-en_US.mo

Enfin si aucun fichier de langue est trouvé, il vérifiera l'emplacement par défaut:
/wp-content/languages/my-plugin-en_US.mo

Le premier chèque a été ajouté à 4,6 et donne aux utilisateurs un lieu défini pour ajouter un fichier de langue, comme avant qu'ils ont besoin de savoir où le développeur a ajouté le fichier de langue, maintenant l'utilisateur a juste besoin de connaître le textdomain du plugin: /wp-content/languages/plugins/TEXTDOMAIN-LOCAL.mo


Ci-dessous l'ancienne (Sans objet depuis WP 4.6 +)

  

[...]
  Enfin, je voudrais souligner que est important de charge des fichiers de langue utilisateur personnalisés à partir WP_LANG_DIR avant de charger les fichiers linguistiques du navire avec le plugin . Lorsque plusieurs fichiers mo-chargés pour le même domaine, la première traduction de découvertes seraient utilisées. De cette façon, les fichiers de langues fournis par le plug-in servira comme solution de repli 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/' 
    );
}

Assurez-Plugins ni erreur avec WP_DEBUG

Testez toujours vos plugins avec WP_DEBUG activée et ont idéalement, il allumé tout au long de votre processus de développement. Un plugin ne doit pas jeter les erreurs avec WP_DEBUG sur. Cela inclut les avis dépréciée et les index non contrôlés.

Pour activer le débogage sur, modifier votre fichier wp-config.php afin que la constante de WP_DEBUG est réglé sur true. Voir du Codex sur Debug pour plus de détails.

Première utilisation existant fonctions dans WordPress noyau

Si vous pouvez: utiliser les fonctions existantes incluses dans le noyau WordPress au lieu d'écrire votre propre. Seulement développer des fonctions PHP personnalisés quand il n'y a pas une fonction pré-existante appropriée dans le noyau WordPress.

L'un des avantages est que vous pouvez utiliser « log avis dépréciés » pour contrôler facilement les fonctions qui doivent être remplacées. Un autre avantage est les utilisateurs peuvent consulter la documentation de fonction dans le Codex et de mieux comprendre ce que le plugin ne même si elles ne sont pas un développeur PHP expérimenté.

Related

devrait supprimer toutes les Désinstaller des données d'un plug-in

Après avoir été retiré d'une installation de WordPress, un plug-in doit supprimer tous les fichiers, les dossiers, les entrées de la base de données et tables qui il a créé ainsi que les valeurs d'option il a créé .

Plugins peut offrir une option d'exportation / paramètres d'importation, de sorte que les paramètres peuvent être enregistrés en dehors de WordPress avant la suppression.

Related

Empêcher SQL Injection avec l'entrée de données

Un plugin devraient désinfecter toutes les entrées utilisateur récupérées directement ou indirectement (par exemple via $_POST ou $_GET ) avant d'utiliser les valeurs d'entrée pour interroger la base de données de MySQL.

Voir: Mise en forme des instructions SQL

.

Prefix Articles Tous espace de noms global

Un plug-in doit correctement tous les éléments préfixe d'espace de noms global (constantes, fonctions, classes, variables, même des choses comme taxonomies personnalisées, les types de poste, widgets, etc.). Par exemple, ne pas créer une fonction appelée init(); au contraire, nommez quelque chose comme jpb_init().

Sa commune doit utiliser un préfixe trois ou quatre lettres devant des noms ou d'utiliser la balise PHP Namespace fonction. Comparez: préfixe unique lettre pour les constantes de classe PHP

Related

Utiliser un code orienté objet et classe PHP5

Il n'y a aucune raison de ne pas écrire du code propre PHP5, orienté objet. le soutien PHP4 sera progressivement après la prochaine version (WP 3.1). Bien sûr, vous pouvez préfixer tous vos noms de fonction pour se retrouver avec endlessly_long_function_names_with_lots_of_underscores, mais il est beaucoup plus facile d'écrire juste une classe simple et tout paquet dans cela. De plus, mettez votre classe dans un fichier séparé et nommez-le en conséquence afin que vous puissiez facilement étendre et 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
    }
}

ne devrait pas provoquer de désactivation de la perte de données-

Un plugin ne devrait pas supprimer l'une de ses données sur désactivation .

Related

uniquement les fichiers que vous avez besoin ...

Si vous êtes à l'avant, ne comprennent pas le code qui se rapporte à la zone d'administration.

Annoncer la perte de données sur Plugin Uninstallation

Une fois la désinstallation un plugin devrait utilisateur invite qu'il supprimerons ses données et recevez une confirmation que l'utilisateur est d'accord avec la suppression les données avant de le faire et un plugin devrait aussi permet à l'utilisateur la possibilité de conserver les données sur la désinstallation. (Cette idée de @EAMann.)

Related

Que le nom du dossier de plug-in modifier

/ plugins / pluginname / {divers}

Le « pluginname » utilisé pour le dossier doit toujours être modifiable.

Ceci est normalement pris en charge par la définition des constantes et de les utiliser consistantly à travers le plug-in.

Inutile de dire que de nombreux plugins populaires sont pécheurs.

Related:

  • plugins_url() pour la liaison facile aux ressources, inclus avec plug-in.

Utiliser WordPress (intégré) Gestion des erreurs

Ne vous contentez pas return; si une entrée utilisateur a eu tort. Délivre des informations sur a eu tort fait.

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 global d'erreur pour votre thème ou plug-in au cours du bootstrap:

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 pouvez ajouter un nombre illimité d'erreurs sur 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 les chercher tout à la fin de votre thème. De cette façon, vous ne interruption rendu de la page et peut encore sortie 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' );

Vous pouvez trouver plus d'informations à ce Q . Un billet lié pour fixer le « travailler ensemble » de WP_Error et wp_die() est liée à partir de là et un autre billet suivra. Commentaires, critiques et c'est apprécié.

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

Un plugin devrait réduire son impact , autant que possible par réduisant au minimum le nombre de noms il ajoute à l'espace de noms global .

Cela peut être fait en encapsulant dans une classe de fonctions du plug-in ou en utilisant le PHP namespaces disposent. Préfixant tout peut aider aussi bien mais pas flexible.

A côté de fonctions et de classes, un plug-in ne doit pas introduire des variables globales. L'utilisation de classes normalement les Obsolètes et simplifie la maintenance plug-in.

Related

Commentaire en utilisant phpdoc

Les meilleures pratiques est proche du style phpdoc. Si vous ne l'utilisez pas un IDE comme « Eclipse », il vous suffit de jeter un oeil à la phpdoc manuel.

Vous ne devez pas savoir exactement comment cela fonctionne. Professional Developers peut lire le code de toute façon et juste besoin cela comme un résumé. codeurs et les utilisateurs pourraient loisirs apprécier la façon dont vous l'expliquer sur le même niveau de connaissances.

Utiliser les API des paramètres avant add_option

Au lieu d'ajouter des options à la DB via la fonction add_option, vous devez les stocker dans un tableau avec l'aide de la Paramètres API prend soin de tout pour vous.

Utiliser le thème API Modifications avant add_option

API Modifications est une construction assez simple et de manière sûre 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.

Plugin utilisateurs Protéger la confidentialité

(précédemment: API Anonyme Communication)

Si un plug-in communique avec un système externe ou API (par exemple, certains Webservice), il devrait le faire de manière anonyme ou fournir à l'utilisateur une option anonyme qui garantit qu'aucune des données relatives à l'utilisateur des fuites de plug-in à une seconde partie non contrôlée.

Plugins hôtes sur WordPress.org

Utiliser le référentiel SVN fourni sur WordPress.org pour les plugins d'hébergement. Il en fait un si vous ne l'avez jamais utilisé SVN avant la mise à jour plus facile l'expérience utilisateur et, il vous arrive à comprendre réellement en l'utilisant dans un contexte qui le justifie.

Fournir le contrôle d'accès en utilisant des autorisations

Dans de nombreux cas, les utilisateurs ne veulent pas que tout le monde d'avoir accès à des zones créées par votre plugin en particulier avec des plugins qui font de multiples opérations complexes, un contrôle unique capacité hardcoded peut ne pas suffire.

À tout le moins, avoir des contrôles de capacité appropriés pour tous les différents types de procédures votre plug-in peut être utilisé pour.

Importer / Exporter Plugin Paramètres

Il est pas commun à travers des plugins, mais si votre plugin a (certains) les 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 plug-in.

Un exemple-plugin qui a une telle fonctionnalité d'importation et d'exportation (et ainsi un mécanisme undo) est Fil d'ariane NavXT (Plugin Wordpress) (divulgation complète: un code peu par moi là-bas, la plupart a été fait par mtekk).

Related

Organisez votre code

Il est alway difficile à lire le code qui est pas écrit dans l'ordre qu'il get exécutées. Tout d'abord include / require, définir, wp_enqueue_style & _script, etc., puis les fonctions que les besoins plugin / thème et enfin le constructeur (ex. Écran admin, des choses qui intègre dans le thème, etc.).

Essayez de choses différentes comme css et js dans leurs propres dossiers. Essayez également de faire avec des fonctions qui ne sont que des aides, comme aplatisseurs et similaire tableau. Garder le fichier « principal » aussi propre et facile à lire que possible est un moyen qui aide les utilisateurs, les développeurs et vous, lorsque vous essayez de mettre à jour en un an et ne l'avez pas vu le code pour un temps plus long.

Il est également bon d'avoir une structure vous répétez souvent, vous trouverez toujours votre chemin à travers. Le développement d'une structure connue sur différents projets vous donnera le temps de faire mieux et même si votre client passe à un autre développeur, vous ne serez jamais entendre « il a laissé un chaos ». Cela renforce votre réputation et devrait être un objectif à long terme.

Die avec le style

meurent de manière décente Tout d'un plug-ins (et thèmes) même fonctions devraient utiliser wp_die() dans des endroits critiques pour offrir à l'utilisateur un peu d'informations sur ce qui était arrivé. les erreurs sont Php ennuyeux et wp_die peuvent donner à l'utilisateur un joli message de style sur ce que le plug-in (ou ils) a fait du tort. De plus, si l'utilisateur a désactivé le plugin débogage va simplement casser.

Utilisation wp_die() aide également que vos plugins / thèmes sont compatibles avec le wordpress testsuite.

En relation:

Fournir de l'aide des écrans pour les utilisateurs

Il est plus agréable de dire RTFM (cliquez aide) comme une réponse que d'avoir à répondre à la période de questions et encore.

/**
  * 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);

Mise à jour / Note: (voir les commentaires de kaiser): l'exemple ci-dessus doit être utilisé dans une classe

Offre formes extensibles

Quand un plug-in offre la possibilité aux données d'entrée, il faut toujours avoir un crochet à la fin, juste avant le « soumettre » et / ou sur le bouton « reset », afin que les développeurs peuvent facilement étendre le formulaire avec non seulement des champs, mais boutons aussi.

Voir: Paramètres API

Related

inclure la fonction toujours en raccrochant, pas directement.

Exemple:

  • Ne pas utiliser pour inclure la classe du plug-in via nouveau sans crochet

  • 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-tronc et un exemple de pseudo

//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 sur multisite installer, voir le codex de référence d'action: http://codex.wordpress.org / Plugin_API / Action_Reference Ici aussi vous voyez, comment inlcude avec ce crochet wP: http: // adambrown.info/p/wp_hooks/hook/plugins_loaded?version=2.1&file=wp-settings.php J'utilise ce très souvent et son pas si difficile et au début, mieux comme une nouvelle classe () dur;

Plugins de licence sous une licence compatible GPL

Plug-ins et les thèmes devraient être sous une licence compatible avec WordPress. Cela leur permet d'être redistribuées avec WordPress comme un « programme ». Une licence est recommandée GPL. Prenez soin que toutes les bibliothèques de code inclus avec le plug-in sont compatibles avec la même licence.

(Cela a été problème et grave point du débat à la fois dans le passé et présent .)

Votre description de plug-in doit détailler avec précision les fonctions de votre plug-in. Il y a 10 plug-ins de poste en vedette. Tous les afficher messages en vedette, mais beaucoup ont des caractéristiques différentes. Il devrait être facile de comparer votre plugin plugins similaires en lisant la description.

Vous devriez éviter vantant la simplicité de votre plug-in est à moins qu'il est vraiment très basique. Vous devez inclure des liens utiles dans la description comme le lien vers les paramètres.

Réduire au minimum les effets secondaires de distance et Datasources Webservices

Un plugin devrait Cache / Bouclier Webservice et / ou XMLRPC / requêtes SOAP à travers une couche de mise en cache / fournisseur de données si vous les utilisez afin de ne pas faire des demandes en attente d'avant-(lente) de réponse webservice.

Cela inclut le téléchargement de flux RSS et autres pages. Concevez vos plugins qu'ils demandent des données en arrière-plan.

Un pas est possible (Prendre annonce à ping.fm comme exemple): Créer une table tampon, disons que: ping_fm_buffer_post ( date, l'heure, le message, submitted_time, état )

  1. Pour chaque fois que vous voulez soumettre mise à jour ping.fm, ajouter à ce tableau.
  2. Maintenant, nous avons besoin de créer un plugin pour gérer ces données. Ce plugin fonctionnera via crontab pour vérifier chaque mise à jour qui est pas encore soumis
  3. Parce que nous avons cette table, nous pouvons également la liste tous les messages soumis à ping.fm et vérifier l'état de chaque poste. Juste au cas où il y a problème du côté de ping.fm, nous pouvons le soumettre à nouveau.

Testez votre plugin

Nous devrions définitivement avoir des outils de test sur notre environnement de développement de plug-in.

Basé sur cette réponse par Ethan Seifert à une question d'essai, ce sont les bonnes pratiques à suivre:

  • Votre test unitaire doit tester la plus petite quantité de comportement qu'une classe peut effectuer.
  • Lorsque vous obtenez au niveau des tests fonctionnels est ce que vous pouvez-vous où tester le code avec dépendances Wordpress.
  • En fonction de votre plugin ne - pensez à utiliser des tests à base de sélénium qui testent la présence de données dans les DOM en utilisant ID
Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top