Manual:Developing extensions/pt-br
![]() | Se você planeja ter sua extensão implementada nos websites da Wikimedia, leia Escrevendo uma extensão para implantação (em inglês) |

This page is a guide to developing extensions for MediaWiki. Before you start, browse the Veja a lista completa em Category:Extensions by category pt-br to see if an extension already exists for your use case.
Extension development consists of these parts:
Configuração
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
e $wgCacheDirectory = false
. Caso contrário, mensagens do sistema e outras mudanças poderão não aparecer para você.Structure
Uma extensão mínima possui a seguinte estrutura:
- MyExtension/extension.json
- Armazena as instruções de configuração. O nome do arquivo deve ser
extension.json
. (Nas versões anteriores ao MediaWiki 1.25, as instruções de configuração ficavam num arquivoMyExtension/MyExtension.php
, nomeado de acordo com a extensão. Várias extensões ainda são compatíveis com aquelas versões neste arquivo PHP). - MyExtension/includes/ (or MyExtension/src/)
- Armazena o código de execução em PHP para a extensão.
- MyExtension/resources/ (or MyExtension/modules/)
- Armazena os recursos para o lado do cliente (client-side), como JavaScript, CSS e LESS para a extensão.
- MyExtension/i18n/*.json
- Armazena as informações de localização da extensão.
- MyExtension/README.md
- Uma boa prática é adicionar um arquivo README contendo informações básicas sobre como instalar e configurar a extensão. Use either plain text or Markdown. Para um exemplo em texto plano, veja a página de difusão no Phabricator para a Extension:Page Forms . Se pretender utilizar markdown, adicione a extensão de arquivo
.md
. A título de exemplo, veja o arquivoREADME.md
para o Parsoid na difusão do Phabricator.
Ao desenvolver uma extensão, substitua MyExtension (como encontrado acima) pelo nome da sua extensão. Use nomes em UpperCamelCase no diretório e nos arquivos PHP; essa é a convenção geral para nomes de arquivos.[1]
Registration
Versão MediaWiki: | ≥ 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
}
Vários desses campos são opcionais, mas preenchê-los por completo é uma boa prática.
For a more complete example of extension.json
, see the BoilerPlate extension.
O manifest_version
refere-se à versão do esquema contra o qual é escrito o arquivo extension.json .
Veja a documentação sobre esse recurso.
A menos que seja necessária a compatibilidade com uma versão mais antiga do MediaWiki, escolha a última versão.
Once you have an extension.json
file set up for your extension, the extension will appear on your local Special:Version
page.
Licença (em inglês)
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 or later (GPL-2.0-or-later)
- MIT License (MIT)
- BSD License (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.
Tornando sua extensão configurável pelos usuários
Ideally, users should be able to install your extension by adding only one line to LocalSettings.php
:
wfLoadExtension( 'MyExtension' );
Se você deseja fazer com que sua extensão seja configurável pelos usuários, será necessário definir e documentar alguns parâmetros de configuração. A configuração dos seus usuários deve estar desta maneira:
wfLoadExtension( 'MyExtension' );
$wgMyExtensionConfigThis = 1;
$wgMyExtensionConfigThat = false;
Caso queira que os usuários possam configurar sua extensão, será necessário fornecer uma ou mais variáveis de configuração. É uma boa ideia dar um nome único para cada variável. Também devem ser seguidas as convenções para nomes do MediaWiki (p. ex.: variáveis globais devem começar com $wg).
Por exemplo, se sua extensão se chamar MinhaExtensao
, tente nomear todas as suas variáveis de configuração para começarem com $wgMinhaExtensao
.
É importante que nenhuma outra extensão do núcleo do MediaWiki comece as variáveis da mesma maneira que a sua, e que você tenha feito um bom trabalho em verificar se nenhuma das extensões publicadas comecem suas variáveis da mesma maneira.
Os usuários não ficarão tão felizes em ter de escolher entre a sua e outras extensões pelo fato de você ter usado os mesmos nomes que as outras.
Uma outra boa ideia é incluir uma documentação completa de quaisquer variáveis de configuração nas suas notas de instalação.
Here is an example of how to set up a configuration variable in extension.json
:
{
"config": {
"BoilerPlateEnableFoo": {
"value": true,
"description": "Enables the foo functionality"
}
}
}
Observe que após chamar wfLoadExtension( 'BoilerPlate' );
, a variável global $wgBoilerPlateEnableFoo
não existe.
Se a variável for definida em algum lugar —como o LocalSettings.php
—, o valor padrão contido no extension.json não será utilizado.
Para mais detalhes sobre como utilizar uma variável global dentro de extensões personalizadas, consulte Configuration for developers .
Preparando classes para o carregamento automático
Caso escolha ter de usar classes para implementar sua extensão, o MediaWiki fornece um mecanismo simplificado para auxiliar o PHP em encontrar o arquivo-fonte onde sua classe está localizada.
Na maioria dos casos, isso deverá eliminar a necessidade de escrever seu próprio método __autoload($classname)
.
Para usar o mecanismo de carregamento automático do MediaWiki, adicione algo ao campo AutoloadClasses . A chave para cada adição é o nome da classe; o valor é o arquivo armazenador da definição da classe. Para uma extensão de uma só classe, a classe tem geralmente o mesmo nome que a extensão. Dessa maneira, sua seção de carregamento automático deve parecer assim (nesse exemplo, a extensão se chama MyExtension):
{
"AutoloadClasses": {
"MyExtension": "includes/MyExtension.php"
}
}
O nome do arquivo é relativo ao diretório onde se encontra o arquivo extension.json.
Para extensões mais completas, considere namespaces do PHP. Veja Manual:Extension.json/Schema#AutoloadNamespaces para mais detalhes.
Lidando com dependências
Imagine que uma extensão necessita da existência de uma outra, talvez por causa das funcionalidades ou tabelas de banco de dados criadas por essa outra, e que determinadas mensagens de erro não precisem aparecer caso essa outra não esteja instalada.
Podemos pegar como exemplo a extensão CountingMarker , que requer a presença da extensão HitCounters para realizar determinadas funções.
Uma forma de especificar essa dependência é através da chave requires
no extension.json .
Another option is using ExtensionRegistry (available since 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 for extensions .
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
- Ganchos : 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.
Adicionando tabelas de bancos de dados
Certifique-se de que a extensão não modificará as tabelas de banco de dados do núcleo. Em vez disso, a extensão deverá criar novas tabelas contendo chaves estrangeiras (foreign keys) às tabelas do MediaWiki relevantes.
Se sua extensão precisar adicionar suas próprias tabelas de bancos de dados, use o hook LoadExtensionSchemaUpdates . Veja a página do manual para mais informações de uso.
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 Registro de extensões .
Localização
![]() |
|
$wgMainCacheType = CACHE_NONE
e $wgCacheDirectory = false
. Caso contrário, suas mudanças nas mensagens de sistema poderão não ser exibidas.Se você deseja que sua extensão seja usada em wikis com leitores multilíngues, será necessário adicionar compatibilidade a localizações na sua extensão.
Armazenando mensagens em <chave-idioma>.json
Armazene as definições de mensagens em arquivos de localização JSON, um para cada chave de idioma em que sua extensão será traduzida. As mensagens serão salvas com uma chave de mensagem e a própria mensagem, usando o formato padrão JSON. Todo ID de mensagem deve estar em letras minúsculas e sem espaços. Cada chave deve começar com o nome da extensão em letras minúsculas. Um exemplo pode ser encontrado na extensão MobileFrontend. Aqui está um exemplo de um arquivo JSON mínimo (neste caso, en.json):
en.json
{
"myextension-desc": "Adds the MyExtension great functionality.",
"myextension-action-message": "This is a test message"
}
Armazenando a documentação das mensagens em qqq.json
A documentação das chaves das mensagens pode ser armazenada num arquivo JSON com o código qqq. Uma documentação do exemplo acima pode ser:
qqq.json:
{
"myextension-desc": "The description of MyExtension used in Extension credits.",
"myextension-action-message": "Adds 'message' after 'action' triggered by user."
}
Carregando o arquivo de localização
Na sua extension.json
, defina a localização dos seus arquivos de mensagem (p. ex. no diretório i18n/
):
{
"MessagesDirs": {
"MyExtension": [
"i18n"
]
}
}
Usando wfMessage no PHP
No seu código de configuração e implementação, substitua todo uso da mensagem com uma chamada para wfMessage( $msgID, $param1, $param2, ... )
.
Em classes que implementam a IContextSource (assim como algumas subclasses das páginas especiais, por exemplo), pode-se usar $this->msg( $msgID, $param1, $param2, ... )
.
Exemplo:
wfMessage( 'myextension-addition', '1', '2', '3' )->parse()
Usando mw.message no JavaScript
Também é possível usar funções de i18n no JavaScript. Veja Manual:Messages API para mais detalhes.
Publicando
Para categorizar automaticamente e padronizar a documentação de uma extensão já existente e criada por você, veja Predefinição:Extensão . Para adicionar sua extensão nessa wiki:
O(A) desenvolvedor(a) que compartilhar seu código no MediaWiki ou no repositório de códigos do MediaWiki deve estar preparado para:
- Comentários / Críticas / Revisões
- Revisões e comentários de outros desenvolvedores acerca de, por exemplo, uso do framework, segurança, eficiência e usabilidade.
- Ajuste do desenvolvedor
- Outros desenvolvedores modificando suas submissões para melhorar ou simplificar seu código seguindo novas classes e métodos do framework, convenções de código e traduções.
- Melhorias no acesso de administradores de wikis
- Se você decidir expor seu código numa wiki, outro desenvolvedor poderá movê-lo para o repositório de códigos do MediaWiki para facilitar sua manutenção. Você pode então criar um Acesso de desenvolvedor para continuar a mantê-lo.
- Versões futuras por outros desenvolvedores
- Novas ramificações do seu código sendo criadas por outros desenvolvedores no momento em que novas versões do MediaWiki forem lançadas. Você deve backport para essas ramificações se quiser oferecer suporte a versões anteriores.
- Mesclar seu código em outras extensões com propósitos idênticos ou semelhantes — incorporando os melhores recursos de cada extensão.
- Crédito
- Crédito pelo seu trabalho será preservado em versões futuras — incluindo em extensões mescladas.
- Da mesma forma, você deve creditar os desenvolvedores de extensões cujo código foi tomado por você — especialmente ao realizar uma mescla.
Desenvolvedores que não estiverem de acordo com as ações acimas não devem implantar seus códigos diretamente no MediaWiki ou em seu repositório de códigos. Ainda te motivamos a criar uma página de sumário para a sua extensão na wiki para informar as pessoas sobre sua extensão, e onde baixá-la.
Implementando e registrando
Em termos de desempenho e segurança, se você pretende que sua extensão seja implementada nos websites da Wikimedia (incluindo possivelmente a Wikipédia), garanta a ela uma análise adicional. Consulte Escrevendo uma extensão para implantação .
Se sua extensão adiciona espaços nominais, experimente registrar os espaços nominais padrões dela. Da mesma forma, se ela adiciona tabelas de bancos de dados ou campos, experimente registrá-los em database field prefixes .
Tenha em mente que a revisão e a implementação de novas extensões nos websites da Wikimedia podem ser extremamente lentas, em alguns casos tendo levado mais de dois anos para serem concluídas.[4]
Documentação de ajuda
Forneça uma documentação de ajuda sob domínio público para os recursos disponibilizados por sua extensão.
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).
Ajuda:CirrusSearch é um exemplo de documentação bem feita.
Forneça aos usuários uma ligação à documentação pela função addHelpLink() .
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
eltsrel
– 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.
Compatibilidade com outras versões do núcleo
Existem duas convenções comuns para manter a compatibilidade com versões antigas do núcleo do MediaWiki:
- Master: a ramificação (branch) master da extensão deve ser compatível com tantas versões antigas do núcleo quanto possível. Isso resulta em um fardo de manutenção (hacks de compatibilidade com versões anteriores precisam ser mantidos por bastante tempo, e mudanças na extensão precisam ser testadas com várias versões do MediaWiki), mas os websites que usam versões antigas do MediaWiki se beneficiam das funcionalidades recentemente adicionadas à extensão.
- Ramificações por release: os chamados release branches da extensão devem ser compatíveis com as ramificações do núcleo correspondentes. P. ex., websites que utilizam o MediaWiki 1.43 precisam usar a ramificação REL1_43 da extensão. (Para extensões hospedadas no Gerrit, essas ramificações são criadas automaticamente quando as novas versões do MediaWiki são lançadas.) Isso resulta em um código mais limpo e um desenvolvimento mais rápido. Entretanto, usuários em versões antigas do núcleo não se beneficiam das correções de erros e dos novos recursos, a menos que haja um backporting manual.
Os mantenedores das extensões devem, com o parâmetro compatibility policy
da predefinição {{Extensão}}, declarar qual convenção está sendo seguida.
Fornecendo suporte ou colaboração
Desenvolvedores de extensões devem abrir uma conta no Phabricator da Wikimedia e solicitar um novo projeto para a extensão. Isso fornece um canal público, onde os usuários podem relatar problemas e enviar extensões. Colabore também com os usuários e outros desenvolvedores para fazer triagem de bugs e para planejar mais recursos à sua extensão.
Ver também
- Manual:Registro de extensões – provides further developer documentation on how to register extensions and skins.
- API:Extensions – explica como sua extensão pode fornecer uma API aos clientes.
- Manual:Extending wiki markup
- Manual:Convenções de codificação
- Melhores práticas para extensões
- Resource Loader
Learn by example
- Extension:Examples – implementa alguns recursos de exemplo com extensas documentações.
- Extension:BoilerPlate – uma extensão clichê funcionando, útil como um ponto de partida para a sua extensão. (repositório Git).
- Leia a extensão Example, baseie seu código na extensão BoilerPlate.
- cookiecutter-mediawiki-extension – uma predefinição cookiecutter, que gera uma extensão BoilerPlate (com variáveis, etc.).
- Permite que você avance rapidamente com a sua extensão.
- Pode também gerar a extensão BoilerPlate.
- List of simple extensions – copie alguns códigos delas.
Referências
- ↑ 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