Manual:Developing extensions/de
![]() | Wer Erweiterung auf Wikimedia-Websites bereitstellen möchte, sollte Writing an extension for deployment lesen. |

This page is a guide to developing extensions for MediaWiki. Before you start, browse the complete list in: Category:Extensions by category de to see if an extension already exists for your use case.
Extension development consists of these parts:
Einrichtung
To set up a new extension, start by setting up a local development environment for MediaWiki , and follow the instructions to install and copy the BoilerPlate extension.
$wgMainCacheType = CACHE_NONE
und $wgCacheDirectory = false
abzuschalten, sonst werden Systemmeldungen und andere Änderungen möglicherweise nicht angezeigt.Structure
Eine minimale Erweiterung besteht aus der folgenden Struktur:
- MyExtension/extension.json
- Speichert die setup-Anleitung. Der Dateiname muss "extension.json" lauten. (Vor MediaWiki 1.25 befanden sich die Setup-Anweisungen in einer
MyExtension/MyExtension.php
-Datei, die nach der Erweiterung benannt wurde. Viele Erweiterungen halten in dieser PHP-Datei noch Abwärtskompatibilitäten bereit.) - MyExtension/includes/ (or MyExtension/src/)
- Enthält den auszuführenden PHP-Code für die Erweiterung.
- MyExtension/resources/ (or MyExtension/modules/)
- Speichert die clientseitigen Ressourcen wie JavaScript, CSS und LESS für die Erweiterung.
- MyExtension/i18n/*.json
- Enthält Lokalisierungsinformation für die Erweiterung.
- MyExtension/README.md
- Eine gute Praxis ist es, eine README Datei mit grundlegenden Informationen über die Installation und Konfiguration der Erweiterung hinzuzufügen. Use either plain text or Markdown. Siehe zum Beispiel die Phabricator Diffusion Seite für die Erweiterung:Seitenformulare . Wenn Markdown verwendet wird, füge die Dateierweiterung
.md
hinzu. Siehe zum Beispiel die DateiREADME.md
für Parsoid auf Phabricator Diffusion.
Wenn du eine Erweiterung entwickelst, ersetze MyExtension durch den tatsächlichen Namen deiner Erweiterung. Benutze UpperCamelCase-Namen für das Verzeichnis und die PHP-Datei(en); das entspricht der allgemeinen Dateinamenskonvention.[1]
Registration
MediaWiki Version: | ≥ 1.25 |
The extension.json
file contains the configuration data for the extension. Here is an example of a minimal extension.json
:
{
"name": "MyExtension",
"author": "John Doe",
"url": "https://www.mediawiki.org/wiki/Extension:MyExtension",
"description": "This extension is an example.",
"version": "1.5",
"license-name": "GPL-2.0-or-later",
"type": "validextensiontype",
"manifest_version": 2
}
Viele der Felder sind optional, aber es wird immer noch empfohlen, sie auszufüllen.
For a more complete example of extension.json
, see the BoilerPlate extension.
Das manifest_version
bezieht sich auf die Version des Schemas, gegen die die extension.json Datei geschrieben wird.
Die verfügbaren Versionen sind 1 und 2. Eine Dokumentation zu dieser Funktion findet sich hier.
Wenn du nicht eine ältere Version von MediaWiki unterstützen musst, wähle die neueste Version.
Once you have an extension.json
file set up for your extension, the extension will appear on your local Special:Version
page.
Lizenz
MediaWiki is an open-source project and users are encouraged to make any MediaWiki extensions under an Open Source Initiative (OSI) approved license compatible with GPL-2.0-or-later (Wikimedia's standard software license).
We recommend adopting one of the following compatible licenses for your projects in Gerrit:
- GNU General Public License, Version 2 oder neuer (GPL-2.0-or-later)
- MIT-Lizenz (MIT)
- BSD-Lizenz (BSD-3-Clause)
- Apache License 2.0 (Apache-2.0)
For extensions that have a compatible license, you can request developer access to the MediaWiki source repositories for extensions.
To specify the licence in code and with "license-name
" a key should be used to provide its short name, e.g. "GPL-2.0-or-later" or "MIT" adhering to the list of identifiers at spdx.org.
Machen Sie Ihre Erweiterung konfigurierbar
Ideally, users should be able to install your extension by adding only one line to LocalSettings.php
:
wfLoadExtension( 'MyExtension' );
Wenn du deine Erweiterung benutzerkonfigurierbar erstellen willst, musst du einige Konfigurationsparameter definieren und dokumentieren. Die Einstellungen deiner Benutzer sollten in etwa so aussehen:
wfLoadExtension( 'MyExtension' );
$wgMyExtensionConfigThis = 1;
$wgMyExtensionConfigThat = false;
Wenn Ihr Benutzer Ihre Erweiterung konfigurieren kann, müssen Sie eine oder mehrere Konfigurationsvariablen angeben. Es ist eine gute Idee, diesen Variablen einen eindeutigen Namen zu geben. Sie sollten auch MediaWiki Namenskonventionen folgen (z. B. sollten globale Variablen mit $wg beginnen).
Wenn die Erweiterung beispielsweise "MeineErweiterung" heißt, liegt es nahe, die Benennung aller Konfigurationsvariablen mit $wgMeineErweiterung
beginnen zu lassen.
Dabei ist wichtig, dass keine des MediaWiki-Kerns seine Variablen auf diese Weise beginnt und in ausreichender Weise überprüft wurde, dass keine der veröffentlichten Erweiterungen ihre Variablen auf diese Weise beginnt.
Benutzer müssen sich nicht zwischen Ihrer Erweiterung und einigen anderen Erweiterungen entscheiden, da Sie überlappende Variablennamen ausgewählt haben.
Es ist auch eine gute Idee, eine ausführliche Dokumentation aller Konfigurationsvariablen in Ihre Installationshinweise aufzunehmen.
Here is an example of how to set up a configuration variable in extension.json
:
{
"config": {
"BoilerPlateEnableFoo": {
"value": true,
"description": "Enables the foo functionality"
}
}
}
Beachte, dass nach dem Aufruf von wfLoadExtension( 'BoilerPlate' );
die globale Variable $wgBoilerPlateEnableFoo
nicht mehr existiert.
Wenn du die Variable z.B. in LocalSettings.php
festlegst, wird der in der extension.json angegebene Standardwert nicht verwendet.
Weitere Informationen über die Verwendung globaler Variablen in benutzerdefinierten Erweiterungen findest du unter Configuration for developers .
Klassen für das automatische Laden vorbereiten
Wenn Sie Klassen zum Implementieren Ihrer Erweiterung verwenden, bietet MediaWiki einen vereinfachten Mechanismus, mit dem PHP die Quelldatei finden kann, in der sich Ihre Klasse befindet.
In den meisten Fällen sollte dies die Notwendigkeit beseitigen, eine eigene __autoload($classname)
-Methode zu schreiben.
Um den Autoload-Mechanismus von MediaWiki zu nutzen, fügst du Einträge in das Feld AutoloadClasses ein. Der Schlüssel jedes Eintrags ist der Klassenname. Der Wert ist die Datei, in der die Definition der Klasse gespeichert ist. Bei einer einfachen Ein-Klassen-Erweiterung erhält die Klasse normalerweise denselben Namen wie die Erweiterung, so dass dein Autoloading-Abschnitt etwa so aussehen könnte (die Erweiterung heißt MyExtension):
{
"AutoloadClasses": {
"MyExtension": "includes/MyExtension.php"
}
}
Der Dateiname bezieht sich auf das Verzeichnis, in dem sich die Datei extension.json befindet.
Für komplexere Erweiterungen sollten Namensräume in Betracht gezogen werden. Siehe Manual:Extension.json/Schema#AutoloadNamespaces für Details.
Umgang mit Abhängigkeiten
Angenommen, eine Erweiterung erfordert das Vorhandensein einer anderen Erweiterung, z.B. weil Funktionalitäten oder Datenbanktabellen genutzt werden sollen und Fehlermeldungen bei Nichtvorhandensein vermieden werden sollen.
Zum Beispiel erfordert die Erweiterung CountingMarker für bestimmte Funktionen das Vorhandensein der Erweiterung HitCounters .
Eine Möglichkeit, dies anzugeben, wäre die Verwendung des Schlüssels requires
in extension.json .
Eine andere Möglichkeit ist die Verwendung von ExtensionRegistry (verfügbar seit MW 1.25):
if ( ExtensionRegistry::getInstance()->isLoaded( 'HitCounters', '>=1.1' ) {
/* do some extra stuff, if extension HitCounters is present in version 1.1 and above */
}
Currently (as of February 2024, MediaWiki 1.41.0) the name of the extension-to-be-checked needs to exactly match the name in their extension.json
.[2][3]
Example: if you want to check the load status of extension OpenIDConnect, you have to use it with a space
if ( ExtensionRegistry::getInstance()->isLoaded( 'OpenID Connect' ) {
...
}
Implementation
For an overview of code architecture, structure, and conventions for extensions, see Best practices für Erweiterungen .
Extension points
MediaWiki core provides several ways for extensions to change the behavior, functionality, and appearance of a wiki. Most extensions use more than one of these extension points. For a complete list of extension points supported in extension.json, see the schema reference .
General
- Hooks : Inject custom code at key points in MediaWiki core code, such as when a user logs in or saves a page. Extensions can also define new hooks.
- Domain events : React to changes to the wiki's state, such as when a page is edited. Extensions can also define their own events. 1.44
- API modules : Define API modules based on the Action API or REST API . These modules can be called by bots or clients.
- Jobs : Add jobs to MediaWiki's JobQueue to perform process-intensive tasks asynchronously, such as sending notification emails.
Pages
- Display a special page : Special pages provide dynamically generated content, often based on system state, database queries, and user inputs.
- Perform a page action : The
action
URL parameter generates a custom page based on the current page, usually to provide information (such as page history) or to perform an action (such as edit the page). In addition to the default actions provided by MediaWiki core, extensions can define a new page action. - Add a tracking category : Help users find pages with similar characteristics by automatically adding pages to custom categories.
Content
- Extend wiki markup : Extensions can add custom functionality to MediaWiki's wikitext markup using template syntax (
{{...}}
) or tags (<example />
). These customizations are used to generate content and to interact with MediaWiki during page rendering. - Support a content model : By default, wiki pages can be stored using a few standard content models, such as wikitext and JSON. Extensions can provide support for new content models by adding a content handler.
- Support a media type : Extensions can add to the default set of supported media file types by adding a media handler.
Moderation tools
- Log a user or system action : On wiki, actions are tracked for transparency and collaboration. To support this feature, extensions can add custom entries and functionality to Special:Log.
- Add a recent-changes flag : Extensions can add custom flags to the following special pages to help moderators track page changes: Special:RecentChanges, Special:Watchlist, Special:RecentChangesLinked
- Add a revision tag : Extensions can add annotations associated with a revision or log entry, such as for edits made using the VisualEditor extension.
Authentication
- Add a provider : Extensions can add support for new login mechanisms and session management methods.
Datenbank Tabellen hinzufügen
Stelle sicher, dass die Erweiterung die Hauptdatenbanktabellen nicht verändert. Stattdessen sollte die Erweiterung neue Tabellen mit Fremdschlüsseln zu den entsprechenden MW-Tabellen erstellen.
Wenn deine Erweiterung ihre eigenen Datenbanktabellen hinzufügen muss, verwende den Haken LoadExtensionSchemaUpdates . Weitere Informationen zur Verwendung finden Sie auf der Handbuchseite.
Registering attributes for other extensions
Attributes allow extensions to register something, such as a module, with another extension. For example, extensions can use attributes to register a plugin module with the VisualEditor extension. For more information, see Erweiterungsregistrierung .
Lokalisierung
![]() |
|
$wgMainCacheType = CACHE_NONE
und $wgCacheDirectory = false
festlegst, sonst werden deine Änderungen an den Systemmeldungen möglicherweise nicht angezeigt.Wenn Sie möchten, dass Ihre Erweiterung in Wikis mit mehrsprachiger Leserschaft verwendet wird, müssen Sie Ihrer Erweiterung Lokalisierungsunterstützung hinzufügen.
Speichern Sie Nachrichten in <Sprachschlüssel>.json
Speichern Sie Nachrichtendefinitionen in einer Lokalisierungs-JSON-Datei, eine für jeden Sprachschlüssel, in den Ihre Erweiterung übersetzt wird. Die Nachrichten werden mit einem Nachrichtenschlüssel und die Nachricht selbst im Standard-JSON-Format gespeichert. Jede Nachrichten-ID sollte in Kleinbuchstaben geschrieben sein und darf keine Leerzeichen enthalten. Jeder Schlüssel sollte mit dem Namen der Erweiterung in Kleinbuchstaben beginnen. Ein Beispiel findet sich in der [$url MobileFrontend-Erweiterung]. Hier ist ein Beispiel für eine minimale JSON-Datei (in diesem Fall en.json:
en.json
{
"myextension-desc": "Adds the MyExtension great functionality.",
"myextension-action-message": "This is a test message"
}
Speichern Sie die Nachrichtendokumentation in qqq.json
Die Dokumentation für Nachrichtenschlüssel kann in der JSON-Datei für die Pseudosprache mit dem Code qqq gespeichert werden. Eine Dokumentation des obigen Beispiels kann sein:
qqq.json:
{
"myextension-desc": "The description of MyExtension used in Extension credits.",
"myextension-action-message": "Adds 'message' after 'action' triggered by user."
}
Laden Sie die Lokalisierungsdatei
In der extension.json ist der Speicherort der Nachrichtendateien (z. B. im Verzeichnis i18n/) festzulegen:
{
"MessagesDirs": {
"MyExtension": [
"i18n"
]
}
}
Verwenden Sie wfMessage in PHP
Ersetzen Sie in Ihrem Setup- und Implementierungscode jede wörtliche Verwendung der Nachricht durch einen Aufruf von wfMessage( $msgID, $param1, $param2, ... )
.
In Klassen, die IContextSource implementieren (sowie in einigen anderen, z. B. Unterklassen von SpecialPage), können Sie stattdessen $this->msg( $msgID, $param1, $param2, ... )
verwenden.
Beispiel:
wfMessage( 'myextension-addition', '1', '2', '3' )->parse()
Verwenden Sie mw.message in JavaScript
Es ist auch möglich, i18n-Funktionen in JavaScript zu verwenden. Schau dir Handbuch:Messages-API für Details an.
Veröffentlichung
Um die Dokumentation deiner bestehenden Erweiterung automatisch zu kategorisieren und zu standardisieren, beachte bitte Vorlage:Erweiterung . So fügen Sie Ihrem Wiki Ihre neue Erweiterung hinzu:
Ein Entwickler, der sein Code im MediaWiki-Coderepositorium teilt, sollte folgendes erwarten:
- Rückmeldung / Kritik / Code-Überprüfungen
- Review and comments by other developers on things like framework use, security, efficiency and usability.
- Developer tweaking
- Other developers modifying your submission to improve or clean-up your code to meet new framework classes and methods, coding conventions and translations.
- Improved access for wiki sysadmins
- If you do decide to put your code on the wiki, another developer may decide to move it to the MediaWiki code repository for easier maintenance. You may then create a Entwicklerkonto to continue maintaining it.
- Zukünftige Versionen von anderen Entwicklern
- New branches of your code being created automatically as new versions of MediaWiki are released. You should backport to these branches if you want to support older versions.
- Incorporation of your code into other extensions with duplicate or similar purposes — incorporating the best features from each extension.
- Credit
- Credit for your work being preserved in future versions — including any merged extensions.
- Similarly, you should credit the developers of any extensions whose code you borrow from — especially when performing a merger.
Any developer who is uncomfortable with any of these actions occurring should not host in the code repository. You are still encouraged to create a summary page for your extension on the wiki to let people know about the extension, and where to download it.
Bereitstellen und Registrieren
Wenn Sie beabsichtigen, Ihre Erweiterung auf Wikimedia-Websites (einschließlich möglicherweise Wikipedia) bereitzustellen, ist eine zusätzliche Prüfung in Bezug auf Leistung und Sicherheit erforderlich. Konsultiere Writing an extension for deployment .
Wenn deine Erweiterung Namensräume hinzufügt, möchtest du vielleicht ihre Standard-Namensräume registrieren; wenn sie Datenbanktabellen oder -felder hinzufügt, möchtest du diese vielleicht unter Datenbankfeld-Präfixe registrieren.
Bitte beachten Sie, dass die Überprüfung und Bereitstellung neuer Erweiterungen auf Wikimedia-Websites sehr langsam sein kann und in einigen Fällen mehr als zwei Jahre gedauert hat. [4][5]
Hilfedokumentation
Sie sollten Public-Domain-Hilfedokumentation für Funktionen bereitstellen, die von Ihrer Erweiterung bereitgestellt werden.
The convention is for extensions to have their user-focused help pages under a pseudo-namespace of Help:Extension:<ExtensionName>
, with whatever subpages are required (the top level page will be automatically linked from the extension infobox if it exists).
Hilfe:CirrusSuche ist ein gutes Beispiel.
Sie sollten Benutzern über die Funktion addHelpLink() einen Link zur Dokumentation geben.
Releasing updates
There are a number of common approaches to releasing updates to extensions.
These are generally defined according to the compatibility policy of the extension (master
, rel
, or ltsrel
):
master
– Releases may be tagged with version numbers on the master branch, and documentation provided on the extension's homepage describing which extension versions are compatible with which core versions. Release branches will still be created automatically, and you may wish to delete these if they are not intended to be used.rel
undltsrel
– Release by backporting changes to theREL1_*
branches (either all changes, or only critical ones). Version numbers are generally not needed unless the extension is a dependency of another (the version number can then be provided in the other extension's configuration to ensure that incompatible combinations aren't installed). Many extensions will stay at the same version number for years.
Unterstützt andere Kernversionen
Es gibt zwei weit verbreitete Konventionen zur Unterstützung älterer Versionen von MediaWiki Core:
- Master: Der Master Branch der Erweiterung ist mit so vielen alten Versionen von Core wie möglich kompatibel. Dies führt zu einem gewissen Wartungsaufwand (Abwärtskompatibilitäts-Hacks müssen lange aufrechterhalten werden, und Änderungen an der Erweiterung müssen mit mehreren MediaWiki-Versionen getestet werden), Websites, die alte MediaWiki-Versionen ausführen, profitieren jedoch von den kürzlich hinzugefügten Funktionen der Erweiterung.
- Veröffentlichungszweige: Die Veröffentlichungszweige der Erweiterung sind mit den entsprechenden Zweigen des Kerns kompatibel, d.h. Websites, die MediaWiki 1.43 verwenden, müssen den REL1_43 Branch der Erweiterung verwenden. (Für Erweiterungen, die auf Gerrit gehostet werden, werden diese Branches automatisch erstellt, wenn neue Versionen von MediaWiki veröffentlicht werden). Dies führt zu saubererem Code und schnellerer Entwicklung, jedoch profitieren Nutzer alter Kernversionen nicht von Bugfixes und neuen Funktionen, es sei denn, sie werden manuell backported.
Die Betreuer von Erweiterungen sollten mit dem Parameter compatibility policy
der Vorlage {{Erweiterung}} angeben, welcher Konvention sie folgen.
Bereitstellung von Unterstützung/Zusammenarbeit
Erweiterungsentwickler sollten ein Konto bei Wikimedia {Phabricator eröffnen und ein neues Projekt für die Erweiterung anfordern. Dies bietet einen öffentlichen Ort, an dem Benutzer Probleme und Vorschläge einreichen können, und Sie können mit Benutzern und anderen Entwicklern zusammenarbeiten, um Fehler zu ermitteln und Funktionen Ihrer Erweiterung zu planen.
Siehe auch
- Manual:Erweiterungsregistrierung – provides further developer documentation on how to register extensions and skins.
- API:Erweiterungen – erklärt, wie Ihre Erweiterung Clients eine API bereitstellen kann
- Manual:Extending wiki markup
- Manual:Kodierungskonventionen
- Beste Praktiken für Erweiterungen
- ResourceLoader
Learn by example
- Erweiterung:Examples – implementiert einige Beispielfunktionen mit umfangreicher Inline-Dokumentation
- Extension:BoilerPlate – Eine funktionierende Boilerplate-Erweiterung, die als Ausgangspunkt für Ihre eigene Erweiterung dient (git repo).
- Lesen Sie die Beispielerweiterung und stützen Sie Ihren eigenen Code auf die BoilerPlate-Erweiterung.
- cookiecutter-mediawiki-extension – eine cookiecutter Vorlage, die eine Boilerplate-Erweiterung generiert (mit Variablen usw.)
- Ermöglicht es Ihnen, mit Ihrer eigenen Erweiterung schnell loszulegen.
- Kann auch die BoilerPlate-Erweiterung generieren.
- List of simple extensions – Kopieren Sie bestimmten Code von ihnen
Einzelnachweise
- ↑ mailarchive:wikitech-l/2011-August/054839.html
- ↑ https://www.mediawiki.org/wiki/Project%3ASupport%20desk/Flow/2024/02#h-%5BDeveloper_question%5D_ExtensionRegistry%3A%3AgetInstance%28%29-%3EisLoaded%28_%27OpenIDConnect%27-20240204084500
- ↑ https://phabricator.wikimedia.org/T356596
- ↑ phabricator:T148848
- ↑ phabricator:T148848