Objektive Best Practices für die Plugin-Entwicklung? [geschlossen]

135

Starten eines Community-Wikis, um objektive Best Practices für die Plugin-Entwicklung zu sammeln . Diese Frage wurde von @ EAManns Kommentaren zu wp-Hackern inspiriert .

Die Idee ist, gemeinsam an den objektiven Best Practices zu arbeiten, damit wir sie eventuell in einem Überprüfungsprozess für die Zusammenarbeit in der Community verwenden können.

AKTUALISIERUNG: Nachdem wir die ersten Antworten gesehen haben, wird klar, dass wir nur eine Idee / einen Vorschlag / eine bewährte Methode pro Antwort benötigen, und die Leute sollten die Liste überprüfen, um sicherzustellen, dass es vor dem Posten keine Duplikate gibt.

MikeSchinkel
quelle
Ich verstehe wirklich nicht, wie Community-Wiki mit SE richtig damit (und den anderen) umgehen soll, aber vielleicht ist das eine Frage zu Meta. Es werden sich nur die meisten Betrüger in Antworten stapeln.
Hakre
@hakre: Großartiger Punkt. Nachdem ich etwas gesehen habe, werde ich der Beschreibung hinzufügen, dass die Leute nur eine Idee pro "Antwort" hinzufügen sollen, und ich werde meine vorhandene Antwort in mehrere Antworten ändern.
MikeSchinkel

Antworten:

72

Verwenden Sie Aktionen und Filter

Wenn Sie der Meinung sind, dass Personen Daten hinzufügen oder ändern möchten, geben Sie apply_filters () ein, bevor Sie zurückkehren .

PS Eine Sache finde ich ein bisschen enttäuschend und dass Ihre Frage Adressen ist der Prozentsatz der Plugins, die nur für Endbenutzer gedacht sind, dh die keine eigenen Hooks haben. Stellen Sie sich vor, WordPress wäre wie die meisten Plugins gestaltet? Es wäre unflexibel und eine sehr Nischenlösung.

Vielleicht wäre es anders, wenn WordPress die Möglichkeit hätte, Plugins automatisch zu installieren, von denen andere Plugins abhängen? In der Regel muss ich einen Großteil der Funktionen, die ich benötige, von Grund auf neu schreiben, da die Clients bestimmte Anforderungen erfüllen und die verfügbaren Plugins zu 90% nicht die Flexibilität bieten, die verbleibenden 10% zu aktualisieren.

Ich wünschte wirklich, die Verantwortlichen der WordPress-Community würden einen Weg finden, um sicherzustellen, dass Plugins für das Befolgen von Best Practices (wie das Hinzufügen von Hooks für andere Entwickler) belohnt werden, ähnlich wie gute Antworten auf einer StackExchange-Site belohnt werden.

Nehmen wir ein Beispiel aus einer anderen Frage :

Beispiel: Ich möchte etwas in meinem Plugin tun, wenn jemand einen Artikel retweetet. Wenn es einen benutzerdefinierten Hook in dem beliebten Retweet-Plugin geben würde, an den ich mich anschließen und von dem ich abfeuern könnte, wäre das großartig. Da dies nicht der Fall ist, kann ich das Plugin ändern, um es einzuschließen, aber das funktioniert nur für meine Kopie, und ich möchte nicht versuchen, das weiterzugeben.

verbunden

Arlen Beiler
quelle
55

Laden Sie Skripte / CSS mit wp_enqueue_scriptundwp_enqueue_style

Plugins sollten keine doppelten Versionen von JS / CSS-Dateien laden / versuchen, insbesondere keine jQuery- und anderen JS-Dateien, die in WP Core enthalten sind.

Plugins sollten immer wp_enqueue_scriptund wp_enqueue_stylebeim Verknüpfen von JS- und CSS-Dateien und niemals direkt über <script>Tags verwendet werden.

verbunden

hakre
quelle
1
Vorschlag : Vielleicht lohnt es sich, eine kleine Notiz über die Verwendung von Abhängigkeiten zu machen (da dies Teil des Enqueue-Systems ist).
t31os
Richtig, aber besser ist, dass Sie die Stile und Skripte vorher registrieren und diese Skripte dann über die ID in die Warteschlange stellen. Dies ist sehr gut für andere Entwickler, um die Skripte zu ändern oder sie in benutzerdefinierten Plugins zu verwenden. Es ist auch einfacher, die Reihenfolge zu ändern oder eine sommerliche Datei zu erstellen.
Bueltge
2
Außerdem können Sie Skripte und Stile auf Seiten laden, sofern erforderlich. scribu.net/wordpress/optimal-script-loading.html
MR
49

I18n-Unterstützung

Alle Ausgabezeichenfolgen sollten mit einer geeigneten Textdomäne verknüpft werden, um die Internationalisierung für interessierte Parteien zu ermöglichen, auch wenn der Entwickler kein Interesse daran hat, sein eigenes Plug-In zu übersetzen.

Beachten Sie, dass es sehr wichtig ist, die Sprachdateien während der initAktion zu laden, damit sich der Benutzer an der Aktion beteiligen kann.

Siehe den Codex: I18n für WordPress-Entwickler

Und auch dieser Artikel: Laden der WP-Sprachdateien richtig .

Seit WordPress 4.6+

In WP 4.6 wurden die Ladereihenfolge und die überprüften Speicherorte geändert, was Entwicklern und Benutzern die Arbeit erheblich erleichtert hat.

In Anbetracht eines Plugins mit einer Textdomäne 'my-plugin' sucht WordPress nun ZUERST nach einer Übersetzungsdatei in:
/wp-content/languages/plugins/my-plugin-en_US.mo

Wenn es dort keinen findet, sucht es dort nach einem, wo das Plugin es anweist (normalerweise im Ordner 'language', wenn es dem Codex folgt):
/ wp-content / plugins / my-plugin / languages ​​/ my- plugin-de_DE.mo

Wenn keine Sprachdatei gefunden wird, wird der Standardspeicherort von
/wp-content/languages/my-plugin-en_US.mo überprüft

Die erste Überprüfung wurde in 4.6 hinzugefügt und gibt den Benutzern einen definierten Ort zum Hinzufügen einer Sprachdatei, da der Benutzer nur die Textdomäne des Plugins kennen muss, bevor er wissen muss, wo der Entwickler die Sprachdatei hinzugefügt hat: / wp-content / languages ​​/ plugins / TEXTDOMAIN-LOCAL.mo


Unten ist der alte Weg (Nicht relevant seit WP 4.6+)

[...]
Abschließend möchte ich darauf hinweisen, dass es wichtig ist, benutzerdefinierte Benutzersprachdateien aus WP_LANG_DIR zu laden, bevor Sie die mit dem Plugin gelieferten Sprachdateien laden . Wenn mehrere Mo-Dateien für dieselbe Domain geladen werden, wird die zuerst gefundene Übersetzung verwendet. Auf diese Weise dienen die vom Plugin bereitgestellten Sprachdateien als Ersatz für Zeichenfolgen, die nicht vom Benutzer übersetzt wurden.

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/' 
    );
}
Stiofan O'Connor
quelle
Für mich das Wichtigste. Es ist nicht viel zusätzliche Arbeit, es zu tun, aber eine der Sachen, die Sie Ihr Plugin nützlicher für die Millionen Benutzer machen können, die nicht Englisch als ihre Muttersprache sprechen. Sie müssen nicht einmal ein Wort selbst übersetzen, sondern bereiten alles vor, was übersetzt werden soll.
2ndkauboy
Dies ist eine so wertvolle und doch so einfache Sache. Ich wollte nur sagen, dass ich damit einverstanden bin und dass jeder Plugin-Autor dies tun sollte.
t31os
48

Stellen Sie sicher, dass Plugins mit WP_DEBUG keine Fehler generieren

Testen Sie Ihre Plugins immer mit WP_DEBUGaktiviertem und lassen Sie es idealerweise während Ihres gesamten Entwicklungsprozesses aktivieren. Ein Plugin sollte KEINE Fehler mit WP_DEBUGon auslösen . Dies schließt veraltete Hinweise und ungeprüfte Indizes ein.

Bearbeiten Sie Ihre wp-config.phpDatei so, dass die WP_DEBUGKonstante auf festgelegt ist , um das Debuggen zu aktivieren true. Weitere Informationen finden Sie im Codex on Debug .

John P Bloch
quelle
In der AKTUALISIERUNG erfahren Sie, ob pro Antwort nur Best Practices verfügbar sind. Können Sie in mehrere Antworten aufteilen?
MikeSchinkel
Sicher kein Problem. Das tut mir leid.
John P Bloch
Danke, und war nicht dein Versehen, es war meins. Ich habe die Frage überarbeitet, um eine Best Practice pro Antwort zu erhalten, basierend auf der Frage von @ hakre zu Duplikaten und wie diese funktionieren.
MikeSchinkel
6
Wenn ich diese Antwort zweimal positiv bewerten könnte, würde ich. Es ist so frustrierend, wenn ich an einer Entwickler-Site arbeite und WP_DEBUG ausschalten muss, weil ein Plugin, das ich verwenden muss, überall Warnungen und Hinweise verbreitet.
Ian Dunn
42

Verwenden Sie zunächst vorhandene Funktionen in WordPress Core

Wenn Sie können: Verwenden Sie vorhandene Funktionen, die in WordPress Core enthalten sind, anstatt Ihre eigenen zu schreiben. Entwickeln Sie benutzerdefinierte PHP-Funktionen nur, wenn es in WordPress Core keine entsprechende bereits vorhandene Funktion gibt.

Ein Vorteil ist, dass Sie "Protokoll veraltete Hinweise" verwenden können, um Funktionen, die ersetzt werden sollten, einfach zu überwachen. Ein weiterer Vorteil ist, dass Benutzer die Funktionsdokumentation im Codex einsehen und besser verstehen können, was das Plugin tut, auch wenn sie kein erfahrener PHP-Entwickler sind.

verbunden

hakre
quelle
Eines der größten Probleme dabei ist zu lernen, dass eine entsprechende vorhandene Funktion vorhanden ist. Was nützlich wäre, wäre ein Ort, an dem Code und / oder Funktionen bereitgestellt werden müssen, damit die Community kommentieren kann, welche Funktion am besten verwendet werden kann. Vielleicht könnte StackExchange dafür verwendet werden?
MikeSchinkel
Puh. Das wäre ziemlich schwierig und ich denke, eine endlose Aufgabe. Ich denke, dass es am besten ist, den Codex auf diese Weise zu erweitern, da er bereits existiert.
Kaiser
Ich denke, es wäre gut genug, den Codex zu erweitern und von dort aus auf verwandte Börsenthreads zu verlinken.
Kaiser
4
Ein Problem dabei ist, dass ein Großteil des Kerns nicht wirklich strukturell auf Wiederverwendbarkeit ausgelegt ist. Ich musste nur die Hälfte der Bildmanipulations- / Metadatenfunktionen kopieren und leicht modifizieren, um meinen eigenen anhangsähnlichen Post-Typ zu erstellen, nur weil eine Funktion wie downsize () eine Funktion aufruft, die eine fest codierte Prüfung auf Post-Typ = 'Anhang enthält '. Es gibt viele davon, wie zum Beispiel die unflexiblen wp_count_posts (), die ein weiteres Beispiel darstellen. Bevor Sie Core WP wirklich wiederverwenden können, muss es komplett überarbeitet werden.
Wyrfel
Stimme dem voll und ganz zu. Mein Lieblingsbeispiel: wp-login.php. "If you can" war also ein guter Anfang für die Antwort ...
Kaiser
35

Bei der Deinstallation sollten alle Daten eines Plugins entfernt werden

Nach dem Entfernen aus einer WordPress-Installation sollte ein Plugin alle Dateien, Ordner, Datenbankeinträge und Tabellen löschen, die es erstellt hat , sowie die von ihm erstellten Optionswerte .

Plugins bieten möglicherweise eine Option zum Exportieren / Importieren von Einstellungen, sodass Einstellungen vor dem Löschen außerhalb von WordPress gespeichert werden können.

verbunden

hakre
quelle
4
Dies sollte das Standardverhalten sein, ja, aber es sollte den Benutzer auch auffordern, einige Daten beizubehalten. Wenn Sie beispielsweise ein Videospiel deinstallieren, werden Sie gefragt, ob Sie gespeicherte Spiele und heruntergeladenes Material entfernen möchten. Ein Benutzer deaktiviert das Plug-In möglicherweise nur zu Testzwecken und möchte die Einstellungen nicht erneut vornehmen, wenn er es erneut aktiviert.
EAMann,
1
Ich spreche nur davon, wenn ein Plugin vollständig entfernt ist, nicht, wenn es deaktiviert ist.
Travis Northcutt
2
Ich verstehe das ... aber manchmal lösche ich Plug-Ins, damit ich sie manuell aus einer Backup- oder Beta-Version hinzufügen kann, die noch nicht im Repository gehostet ist ...
EAMann
4
@EAMann: Dazu und zum Migrieren von Plugins auf einen anderen Server sollte ein Plugin einen Mechanismus zum Exportieren und Importieren von Einstellungen bereitstellen.
Hakre
2
Ich habe gesehen, dass einige Plugins in ihren Einstellungen einen "Deinstallieren" -Button mit großen roten Warnungen anbieten, der alle Daten löscht. Dies ist unabhängig von der Deaktivierung, und ich denke, eine gute Möglichkeit, damit umzugehen. Nicht jeder verwendet die Schaltfläche "Löschen", um ein Plugin zu entfernen.
Gabrielk
34

Verhindern Sie SQL Injection mit Eingabedaten

Ein Plugin sollte alle Benutzereingaben bereinigen, die direkt oder indirekt abgerufen wurden (z. B. über $_POSToder$_GET ), bevor Eingabewerte zum Abfragen der MySQL-Datenbank verwendet werden.

Siehe: Formatieren von SQL-Anweisungen .

hakre
quelle
5
Sie sollten auch Daten bereinigen, die aus der Datenbank stammen. Vertrauen Sie grundsätzlich keinen Daten, die nicht fest codiert sind. codex.wordpress.org/Data_Validation ist auch eine gute Referenz.
Ian Dunn
31

Präfix Alle globalen Namespace-Elemente

Ein Plugin sollte ALLEN globalen Namespace-Elementen (Konstanten, Funktionen, Klassen, Variablen, sogar benutzerdefinierten Taxonomien, Beitragstypen, Widgets usw.) ein Präfix voranstellen. Erstellen Sie beispielsweise keine Funktion mit dem Namen init(); Nennen Sie es stattdessen so etwas wie jpb_init().

Normalerweise sollte ein Präfix mit drei oder vier Buchstaben vor dem Namen oder zur Verwendung der PHP-Namespace-Funktion verwendet werden . Vergleichen Sie: Einbuchstaben-Präfix für PHP-Klassenkonstanten?

verbunden

hakre
quelle
31

Verwenden Sie einen klassen- und objektorientierten PHP5-Code

Es gibt keinen Grund, keinen sauberen, objektorientierten PHP5-Code zu schreiben. Die PHP4-Unterstützung wird nach dem nächsten Release (WP 3.1) eingestellt. Natürlich können Sie all Ihren Funktionsnamen endlos lange Funktionsnamen mit vielen Punkten voranstellen, aber es ist viel einfacher, einfach eine einfache Klasse zu schreiben und alles darin zu bündeln. Fügen Sie Ihre Klasse auch in eine separate Datei ein und benennen Sie sie entsprechend, damit Sie sie einfach erweitern und pflegen können:

// 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
    }
}
Heiser
quelle
benutze kein neues MyCoolPlugin (); Ich denke, es ist besser, wenn Sie WP über Hook einbinden: plugins_loaded
bueltge
Nicht sicher, dass. Nach dem Codex ist plugins_loaded eines der allerersten Dinge, die geladen werden. Ich denke, es macht wenig Unterschied, ein solches Konstrukt zu erstellen oder es als Aktion hinzuzufügen.
Husky
5
Es ist nur eine dieser Best Practices, die es für alle angenehmer machen.
Arlen Beiler
1
Soweit ich sehen kann, macht das Hinzufügen eines Hooks in plugins_loaded keine Verbesserungen und wäre keine bewährte Methode, da es keine Verbesserungen gibt, wenn irgendetwas die Speichernutzung erhöht, die Geschwindigkeit verringert, wenn eine Aktion ausgeführt werden muss Anstelle der Aktionen, die gerade hinzugefügt werden. Auch die Verwendung von OO sollte nicht als Best Practice angesehen werden.
Backie
4
@IanDunn: Wenn Sie PHP4-Unterstützung möchten, aber die PHP4-Unterstützung wurde vor über 4 Jahren seit 2008 eingestellt. Es gibt keinen Grund, immer noch PHP4-spezifische Prüfungen zu verwenden.
Husky
23

Schließen Sie nur Dateien ein, die Sie benötigen ...

Wenn Sie sich im Front-End befinden, geben Sie keinen Code an, der sich auf den Administratorbereich bezieht.

Denis de Bernardy
quelle
21

Kündigen Sie Datenverlust bei der Deinstallation des Plugins an

Nach der Deinstallation ein Plugin sollte einen Benutzer dazu auffordern , dass es es Daten wird gelöscht und eine Bestätigung, dass der Benutzer mit dem Löschen der Daten in Ordnung ist , bevor dies zu tun und ein Plugin sollte auch dem Benutzer die Möglichkeit erlauben , die Daten zu halten , bei der Deinstallation. (Diese Idee von @EAMann.)

verbunden

hakre
quelle
3
Wordpress selbst zeigt im Admin eine Warnmeldung an, dass dies passiert (zumindest im Trunk im Moment).
Hakre
Abgesehen von der von WordPress angezeigten Warnmeldung kann das Plugin den Benutzer nicht dazu auffordern, da es zum Zeitpunkt der Deinstallation bereits deaktiviert ist. Aber siehe Ticket # 20578 .
JD
19

Lassen Sie den Ordnernamen des Plugins ändern

/ plugins / pluginname / {various}

Der für den Ordner verwendete "Pluginname" sollte immer änderbar sein.

Dies geschieht normalerweise durch die Definition von Konstanten und deren konsequente Verwendung im gesamten Plugin.

Unnötig zu erwähnen, dass viele beliebte Plugins Sünder sind.

Verbunden:

  • plugins_url() für die einfache Verknüpfung mit Ressourcen, im Plugin enthalten.
AndyBeard
quelle
Das Umbenennen des Ordners des Plugins führt dazu, dass automatische Aktualisierungen unterbrochen werden. Daher bin ich mir nicht sicher, ob dies das Beste ist.
Mtekk
Sie müssten das Plugin nach der Änderung sowieso wieder aktivieren (die Namensänderung würde wahrscheinlich zur Deaktivierung des Plugins führen). Zu diesem Zeitpunkt erstellt WP die entsprechenden DB-Einträge für die Plugins neu oder aktualisiert sie (dies würde nicht der Fall sein) Updates brechen überhaupt).
t31os
Verwenden Sie statt einer Konstante, um plugin_basename(__FILE__)den lokalen Namen des Plugins herauszufinden. Dies ist nützlich, wenn Sie Kopien desselben Plugins haben möchten (testen, mehrere Accounts an anderer Stelle, aber nur einen pro Plugin, ...).
Raphael
19

Verwenden Sie WordPress (eingebaut). Fehlerbehandlung

Nicht nur, return;wenn eine Benutzereingabe falsch war. Liefern Sie ihnen einige Informationen über wurde falsch gemacht.

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...
}

Ein Fehler (Objekt) für alle

Sie können während des Bootstraps ein globales Fehlerobjekt für Ihr Theme oder Plugin einrichten:

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' );

Später können Sie unbegrenzt viele Fehler hinzufügen:

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...
}

Dann können Sie sie alle am Ende Ihres Themas abrufen. Auf diese Weise unterbrechen Sie nicht das Rendern der Seite und können trotzdem alle Ihre Fehler für die Entwicklung ausgeben

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' );

Sie können weitere Informationen finden diese Q . Ein entsprechendes Ticket zur Behebung des "Zusammenwirkens" von WP_Errorund wp_die()wird von dort verlinkt und ein weiteres Ticket folgt. Kommentare, Kritik & so wird geschätzt.

kaiser
quelle
Warum instanziieren Sie ein WP_Error-Objekt, wenn Sie nur auf seine Eigenschaften zugreifen und die Instanz nie als Objekt übergeben?
ProfK
@ProfK Ich habe es kürzer überarbeitet und der Titel / Inhalt für wp_die();war falsch (umgekehrt). Zu deiner Frage: Ich verstehe es nicht ganz. Wenn Sie eine Instanz der Klasse WP_Error eingerichtet haben Sie vollen Zugriff auf seine Daten über Funktionen wie get_error_code();, get_error_message();, get_error_data();und die mehrere Versionen. Sie können es auch nur einmal im Bootstrap Ihres Themes oder Plugins instanziieren und einfach dazu verwenden $error->add();, andere Fehler zu füllen und sie schließlich in der Fußzeile mit auszugeben $error->get_error_messages();, um sie alle abzufangen .
Kaiser
@ProfK Zukünftige Updates zu diesem Q werden veröffentlicht . Ich überprüfe derzeit das Verhalten der wp-Fehlerklasse und möchte ein Ticket für eine öffentliche Theme-Fehler-API schreiben (Entwurf bereits fertig). Am Ende des Fragebogens finden Sie einen Link zu einem anderen Ticket, das zusammenführt WP_Errorund wp_die()näher zusammenrückt (es gibt bereits einen Patch). Jeder Kommentar, jede Anregung, Kritik und sonstiges wird sehr geschätzt.
Kaiser
18

Dem globalen Namespace hinzugefügte Namen minimieren

Ein Plugin sollte die Auswirkungen so gering wie möglich halten, indem die Anzahl der Namen, die es dem globalen Namespace hinzufügt, minimiert wird .

Dies kann erreicht werden, indem die Funktionen des Plugins in eine Klasse eingekapselt werden oder indem die PHP-Namespaces-Funktion verwendet wird . Das Präfixieren von allem kann ebenfalls helfen, ist aber nicht so flexibel.

Neben Funktionen und Klassen sollte ein Plugin keine globalen Variablen einführen. Die Verwendung von Klassen macht diese normalerweise überflüssig und vereinfacht die Plug-in-Wartung.

verbunden

hakre
quelle
Kannst du bitte das "sollte keine globalen Variablen einführen" zu seiner eigenen Antwort verschieben? Dies hängt zusammen mit einer Frage, über die ich gerne diskutieren würde (sowohl, weil ich glaube, dass ich nicht einverstanden bin, als auch weil ich aus den Meinungen anderer lernen möchte.)
MikeSchinkel
17

Kommentar mit PhpDoc

Best Practice kommt dem PhpDoc-Stil nahe. Wenn Sie keine IDE wie "Eclipse" verwenden, schauen Sie sich einfach das PhpDoc-Handbuch an .

Sie müssen nicht genau wissen, wie das funktioniert. Professionelle Entwickler können den Code trotzdem lesen und benötigen ihn nur als Zusammenfassung. Hobby-Programmierer und -Nutzer werden es vielleicht zu schätzen wissen, wie Sie es auf derselben Wissensstufe erklären.

kaiser
quelle
17

Verwenden Sie die Einstellungs-API vor add_option

Anstatt der Datenbank Optionen über die Funktion add_option hinzuzufügen, sollten Sie diese als Array mit der Einstellungs-API speichern , die alles für Sie erledigt .

Verwenden Sie die API für Designänderungen, bevor Sie add_option ausführen

Die Modifikations-API ist ein ziemlich einfaches Konstrukt und eine sichere Methode, mit der Optionen hinzugefügt und abgerufen werden können. Alles wird als serialisierter Wert in Ihrer Datenbank gespeichert. Einfach, sicher und einfach.

kaiser
quelle
1
Und außerdem, benutze update_optionund nie add_option, die Update-Funktion wird die Option erstellen, wenn sie nicht existiert .. :)
t31os
3
Ich würde nicht sagen, niemals zu verwenden add_option. Es gibt einen guten Anwendungsfall für den Fall, add_optiondass die Option bereits festgelegt ist und nicht geändert wird. Daher verwende ich sie bei der Aktivierung, um möglicherweise bereits vorhandene Benutzereinstellungen beizubehalten.
ProfK
1
Ein weiterer Anwendungsfall add_optionist, wenn Sie das automatische Laden explizit deaktivieren möchten. update_optionErzwingt, dass Autoload auf true gesetzt wird. add_optionWenn Sie Autoload deaktivieren möchten, verwenden Sie dies beim erstmaligen Erstellen der Option.
Dave Romsey
16

Schützen Sie die Privatsphäre der Plug-in-Benutzer

(Vorher: Anonyme API-Kommunikation)

Wenn ein Plug-in mit einem externen System oder einer externen API (z. B. einem Webservice) kommuniziert, sollte dies anonym erfolgen oder dem Benutzer eine anonyme Option zur Verfügung gestellt werden, mit der sichergestellt wird, dass keine Daten, die sich auf den Benutzer des Plug-ins beziehen, unkontrolliert an Dritte weitergegeben werden.

EAMann
quelle
15

Host Plugins auf WordPress.org

Verwenden Sie das auf WordPress.org bereitgestellte SVN- Repository zum Hosten von Plugins. Dies erleichtert das Aktualisieren der Benutzererfahrung und wenn Sie SVN noch nie zuvor verwendet haben, können Sie es in einem Kontext verwenden, der dies rechtfertigt.

MikeSchinkel
quelle
15

Bereitstellen der Zugriffssteuerung mithilfe von Berechtigungen

In vielen Fällen möchten Benutzer möglicherweise nicht, dass jeder Zugriff auf Bereiche hat, die von Ihrem Plug-in erstellt wurden, insbesondere bei Plug-ins, die mehrere komplexe Vorgänge ausführen. Eine einzige Überprüfung der fest codierten Funktionen ist möglicherweise nicht ausreichend.

Lassen Sie sich zumindest die verschiedenen Verfahren, für die Ihr Plugin verwendet werden kann, auf ihre Leistungsfähigkeit prüfen.

eddiemoya
quelle
12

Plugin-Einstellungen importieren / exportieren

Es ist bei Plugins nicht so verbreitet, aber wenn Ihr Plugin (einige) Einstellungen hat, sollte es den Import / Export von Daten wie Konfiguration und Benutzereingaben ermöglichen .

Import / Export verbessert die Benutzerfreundlichkeit eines Plugins.

Ein Beispiel-Plugin mit einer solchen Import- und Exportfunktion (und einem entsprechenden Rückgängig-Mechanismus) ist Breadcrumb NavXT (Wordpress Plugin) (vollständige Offenlegung: ein kleiner Code von mir, der größte Teil wurde von mtekk erstellt).

verbunden

hakre
quelle
12

Organisieren Sie Ihren Code

Es ist immer schwer, Code zu lesen, der nicht in der Reihenfolge geschrieben ist, in der er ausgeführt wird. Zuerst include / require, define, wp_enqueue_style & _script usw., dann die Funktionen, die das Plugin / Theme benötigt, und zuletzt der Builder (zB Admin-Bildschirm, in das Theme integrierbares Material usw.).

Versuchen Sie, Dinge wie CSS und JS in ihren eigenen Ordnern zu trennen. Versuchen Sie dies auch mit Funktionen, die nur als Hilfsmittel dienen, wie z. B. Array-Reduzierungen und Ähnliches. Die "Haupt" -Datei so sauber und einfach wie möglich zu halten, ist eine Möglichkeit, die Benutzern, Entwicklern und Ihnen hilft, wenn Sie versuchen, in einem Jahr eine Aktualisierung durchzuführen und den Code längere Zeit nicht mehr gesehen haben.

Es ist auch gut, eine Struktur zu haben, die Sie oft wiederholen, damit Sie immer den richtigen Weg finden. Das Entwickeln einer bekannten Struktur für verschiedene Projekte gibt Ihnen Zeit, um sie zu verbessern, und selbst wenn Ihr Client zu einem anderen Entwickler wechselt, werden Sie nie hören, dass "er ein Chaos hinterlassen hat". Dies stärkt Ihren Ruf und sollte ein langfristiges Ziel sein.

kaiser
quelle
Ich fürchte, das ist ein bisschen zu viel über den Stil, den die Leute diskutieren würden, und nicht über objektive Best Practices, mit denen sich alle respektierten Leute einverstanden erklären würden. Es ist sehr wichtig, dass wir nur objektive Best Practices ansprechen, damit die Leute bereit sind, die Liste zu "segnen", anstatt kontroverse Punkte zu haben, egal wie gut gemeint.
MikeSchinkel
11

Stirb mit Stil

auf anständige Art und Weise sterben Alle Funktionen eines Plugins (und sogar von Themes) sollten wp_die()an kritischen Stellen verwendet werden, um dem Benutzer ein wenig Information darüber zu geben, was passiert ist. PHP-Fehler sind ärgerlich und wp_diekönnen dem Benutzer eine nette Nachricht darüber geben, was das Plugin (oder die Plugins) falsch gemacht hat. Wenn der Benutzer das Debuggen deaktiviert hat, bricht das Plugin einfach ab.

Die Verwendung von wp_die()hilft auch dabei, dass Ihre Plugins / Themes mit der WordPress-Testsuite kompatibel sind .

Verbunden:
hakre
quelle
11

Stellen Sie Hilfebildschirme für Benutzer bereit

Es ist schöner, als Antwort RTFM (click help) zu sagen, als die Frage immer wieder beantworten zu müssen.

/**
  * 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 / hinweis: (siehe kommentare von kaiser): das obige beispiel soll in einer klasse verwendet werden

Edelwasser
quelle
Sollte in jedermanns Toolbox sein (solange Sie einen bestimmten Admin-UI-Bildschirm erklären müssen). +1
Kaiser
Btw: Sie sollten erwähnen, dass dies in einer Klasse liegen soll und wie Sie mit $ this -> _ page_id interagieren und wie es wäre, wenn Sie den Aktions-Hook aus einer functions.php oder einer Plugin-Datei ohne eine Klasse hinzufügen würden .
Kaiser
9

Funktion immer über Hook einbinden, nicht direkt.

Beispiel:

  • Verwenden Sie nicht für die Klasse des Plugins via new without hook

  • Verwenden Sie den Hook plugins_loaded

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

Update: ein kleines Live-Beispiel: Plugin-svn-trunk-Seite und ein Pseudo-Beispiel

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

Sie können auch über mu_plugins_loaded laden auf mehreren Systemen installieren, den Kodex für Maßnahmen Referenz siehe: http://codex.wordpress.org/Plugin_API/Action_Reference Auch hier sehen Sie, wie wP mit diesem Haken inlcude: http: // adambrown. info / p / wp_hooks / hook / plugins_loaded? version = 2.1 & file = wp-settings.php Ich benutze dies sehr oft und es ist nicht so schwer und früh, besser als eine harte neue Klasse ();

Bueltge
quelle
@bueltige --- könnten Sie dies ein bisschen mehr erklären
NetConstructor.com
3
ein kleines Live-Beispiel: [Plugin-svn-trunk-page] svn.wp-plugins.org/filter-rewrite-rules/trunk/… und ein Pseudo-Beispiel //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
bueltge
2
@ Netconstructor.co - Ich habe den Thread aktualisiert, der Kommentar ist hässlich für Code
Bueltge
8

Lizenz-Plugins unter einer GPL-kompatiblen Lizenz

Plugins und Themes sollten unter einer WordPress-kompatiblen Lizenz lizenziert werden. Dies ermöglicht es ihnen, mit WordPress als "Programm" neu verteilt zu werden. Eine empfohlene Lizenz ist die GPL . Stellen Sie sicher, dass alle im Plug-In enthaltenen Codebibliotheken mit derselben Lizenz kompatibel sind.

(Dies war sowohl in der Vergangenheit als auch in der Gegenwart ein Problem und ein ernstzunehmender Diskussionspunkt .)

EAMann
quelle
Lassen wir das für den Moment mit GPL-Kompatibilität: core.trac.wordpress.org/ticket/14685
hakre
8

Ihre Plugin-Beschreibung sollte die Funktionen Ihres Plugins genau beschreiben. Es gibt 10 vorgestellte Post-Plugins. Alle von ihnen zeigen vorgestellten Beiträge, aber viele haben unterschiedliche Funktionen. Es sollte einfach sein, Ihr Plugin mit ähnlichen Plugins zu vergleichen, indem Sie die Beschreibung lesen.

Sie sollten nicht damit angeben, wie einfach Ihr Plugin ist, es sei denn, es ist wirklich sehr einfach. Sie sollten nützliche Links in die Beschreibung aufnehmen, wie zB den Link zu den Einstellungen.

Greg
quelle
7

Minimieren Sie die Nebenwirkungen von Remote-Datenquellen und Webservices

Ein Plugin sollte Webservice- und / oder XMLRPC / SOAP-Anforderungen über eine Caching- / Datenprovider-Ebene zwischenspeichern, wenn Sie diese verwenden, damit Front-Requests nicht auf (langsame) Webservice-Antworten warten.

Dies beinhaltet den Download von RSS-Feeds und anderen Seiten. Gestalten Sie Ihre Plugins so, dass sie Daten im Hintergrund abfragen.

Ein möglicher SCHRITT ist (Beispiel für das Posten auf ping.fm): Erstellen Sie eine Puffertabelle, sagen wir: ping_fm_buffer_post (Datum, Uhrzeit, Nachricht, Submitted_time, Status)

  1. Fügen Sie jedes Mal, wenn Sie ein Update an ping.fm senden möchten, dieses zu dieser Tabelle hinzu.
  2. Jetzt müssen wir ein Plugin erstellen, um diese Daten zu verarbeiten. Dieses Plugin wird über crontab ausgeführt, um nach jedem Update zu suchen, das noch nicht übermittelt wurde
  3. Da wir diese Tabelle haben, können wir auch jede an ping.fm übermittelte Nachricht auflisten und den Status jedes Beitrags überprüfen. Falls es ein Problem auf der Seite von ping.fm gibt, können wir es erneut einreichen.
hakre
quelle
Ich verstehe nicht wirklich, wohin Sie genau gehen. Können Sie einige Links zu unterstützendem Material bereitstellen?
MikeSchinkel
Ich bin mir auch nicht ganz sicher, was "Net Overhead" ist. Gibt es nicht einen besseren Begriff? Wenn es klarer ist, ist es eine bessere objektive Regel. Und verhindern " ist unmöglich; " Minimieren " stattdessen?
MikeSchinkel
Du hast wahrscheinlich Recht. Falsche Formulierung und Verhinderung ist niemals möglich, minimieren Sie bessere Passungen.
Hakre
7

Testen Sie Ihr Plugin

Wir sollten definitiv einige Testtools in unserer Plugin-Entwicklungsumgebung haben.

Basierend auf dieser Antwort von Ethan Seifert auf eine Testfrage, sind dies gute Praktiken, die befolgt werden sollten:

  • Ihr Unit-Test sollte das kleinste Verhalten testen, das eine Klasse ausführen kann.
  • Wenn Sie die Ebene der Funktionstests erreicht haben, können Sie hier Ihren Code mit Wordpress-Abhängigkeiten testen.
  • Abhängig davon, was Ihr Plugin macht - erwägen Sie die Verwendung von Selenium-basierten Tests, bei denen mithilfe von IDs geprüft wird, ob Daten im DOM vorhanden sind
Fernando Briano
quelle
Während das Testen wichtig ist, erscheint es unklug, zu sagen, dass Unit-Tests das Kleinste anstelle des Größten testen sollten. Wenn Sie Schwierigkeiten haben, die von WordPress abhängigen Probleme zu testen, tauchen Sie einfach in den WordPress-Kern ein. Dort finden Sie eine ganze Reihe interner globaler Variablen, mit denen Sie überprüfen können, ob Elemente funktioniert haben.
Backie
1
Aber das kleinste zuerst abzudecken ist einfach, damit Sie die Funktionsprüfung mit WordPress erreichen können, wie die Antwort sagt, ist das nicht richtig?
Fernando Briano
1
Dies ist ein Plugin, keine Anwendung. Können Sie eine Java-Anwendung ohne Java Runtime testen? Ja, indem Sie Java als Modell schreiben und dann Ihr Plugin testen. Wahrscheinlich sind die Fehler in Ihrem Modell. *) Haftungsausschluss oder Kompilierung zu nativem Code.
Edelwasser