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.
plugin-development
customization
wiki
MikeSchinkel
quelle
quelle
Antworten:
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 .
Nehmen wir ein Beispiel aus einer anderen Frage :
verbunden
quelle
Laden Sie Skripte / CSS mit
wp_enqueue_script
undwp_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_script
undwp_enqueue_style
beim Verknüpfen von JS- und CSS-Dateien und niemals direkt über<script>
Tags verwendet werden.verbunden
quelle
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
init
Aktion 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+)
quelle
Stellen Sie sicher, dass Plugins mit WP_DEBUG keine Fehler generieren
Testen Sie Ihre Plugins immer mit
WP_DEBUG
aktiviertem und lassen Sie es idealerweise während Ihres gesamten Entwicklungsprozesses aktivieren. Ein Plugin sollte KEINE Fehler mitWP_DEBUG
on auslösen . Dies schließt veraltete Hinweise und ungeprüfte Indizes ein.Bearbeiten Sie Ihre
wp-config.php
Datei so, dass dieWP_DEBUG
Konstante auf festgelegt ist , um das Debuggen zu aktivierentrue
. Weitere Informationen finden Sie im Codex on Debug .quelle
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
quelle
wp-login.php
. "If you can" war also ein guter Anfang für die Antwort ...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
quelle
Verhindern Sie SQL Injection mit Eingabedaten
Ein Plugin sollte alle Benutzereingaben bereinigen, die direkt oder indirekt abgerufen wurden (z. B. über
$_POST
oder$_GET
), bevor Eingabewerte zum Abfragen der MySQL-Datenbank verwendet werden.Siehe: Formatieren von SQL-Anweisungen .
quelle
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 wiejpb_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
quelle
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:
quelle
Die Deaktivierung sollte keinen Datenverlust hervorrufen
Ein Plugin sollte beim Deaktivieren keine seiner Daten löschen .
verbunden
quelle
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.
quelle
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
quelle
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.quelle
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, ...).Verwenden Sie WordPress (eingebaut). Fehlerbehandlung
Nicht nur,
return;
wenn eine Benutzereingabe falsch war. Liefern Sie ihnen einige Informationen über wurde falsch gemacht.Ein Fehler (Objekt) für alle
Sie können während des Bootstraps ein globales Fehlerobjekt für Ihr Theme oder Plugin einrichten:
Später können Sie unbegrenzt viele Fehler hinzufügen:
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
Sie können weitere Informationen finden diese Q . Ein entsprechendes Ticket zur Behebung des "Zusammenwirkens" von
WP_Error
undwp_die()
wird von dort verlinkt und ein weiteres Ticket folgt. Kommentare, Kritik & so wird geschätzt.quelle
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 wieget_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 .WP_Error
undwp_die()
näher zusammenrückt (es gibt bereits einen Patch). Jeder Kommentar, jede Anregung, Kritik und sonstiges wird sehr geschätzt.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
quelle
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.
quelle
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.
quelle
update_option
und nieadd_option
, die Update-Funktion wird die Option erstellen, wenn sie nicht existiert .. :)add_option
. Es gibt einen guten Anwendungsfall für den Fall,add_option
dass die Option bereits festgelegt ist und nicht geändert wird. Daher verwende ich sie bei der Aktivierung, um möglicherweise bereits vorhandene Benutzereinstellungen beizubehalten.add_option
ist, wenn Sie das automatische Laden explizit deaktivieren möchten.update_option
Erzwingt, dass Autoload auf true gesetzt wird.add_option
Wenn Sie Autoload deaktivieren möchten, verwenden Sie dies beim erstmaligen Erstellen der Option.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.
quelle
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.
quelle
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.
quelle
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
quelle
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.
quelle
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 undwp_die
kö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
Verbunden:wp_die()
hilft auch dabei, dass Ihre Plugins / Themes mit der WordPress-Testsuite kompatibel sind .quelle
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.
update / hinweis: (siehe kommentare von kaiser): das obige beispiel soll in einer klasse verwendet werden
quelle
Angebot erweiterbarer Formulare
Wenn ein Plugin die Möglichkeit bietet, Daten einzugeben, sollte es immer einen Haken am Ende haben, kurz vor der Schaltfläche "Senden" und / oder "Zurücksetzen", damit Entwickler das Formular problemlos nicht nur mit Feldern, sondern auch mit Schaltflächen erweitern können.
Siehe: Einstellungs-API
verbunden
quelle
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
Update: ein kleines Live-Beispiel: Plugin-svn-trunk-Seite und ein Pseudo-Beispiel
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 ();
quelle
//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
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 .)
quelle
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.
quelle
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)
quelle
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:
quelle