Manual:特別ページ

This page is a translated version of the page Manual:Special pages and the translation is 100% complete.
MediaWiki extensions

特別ページは、特定の機能を求められたときにソフトウェアが作成したページです。

例えば特定の外部サイトにひとつ以上リンクがあるページをすべて抽出させることも、利用者が提供したフィードバックをまとめたフォームの作成もできます。

特別ページは固有の名前空間 (特別:) に置かれ、他のページと違って直接、編集することはできません。 開発者 が特別ページを開設することも可能です。

利用者はこれらのページにアクセスでき、すべての特別ページをまとめた一覧は通常は Special:SpecialPages にあります。 特別ページの中には、特定の利用者権限やアクセス権がないと利用できないものがあります。 あるいは特別ページの一覧には表示されず、ウィキで内部的に使用されるだけのものもあります。

全般的な情報

MediaWiki に付属する特別ページはすべて SpecialSomename.php という形式のファイル名であり、includes/specials ディレクトリに配置されます。 コアの特別ページは、MediaWiki に読み込ませるために、includes/specialpage/SpecialPageFactory.php にあるコア リストに登録する必要があります。 通常、サードパーティ製の特別ページは個別ファイルの属するextensionsディレクトリか、もしくはさらに大きな拡張機能の一部として置かれます。 どの特別ページも includes/specialpage/SpecialPage.php で定義されているクラス SpecialPage を継承します。 新しい特別ページを作成する際には、その特別ページにアクセスするのに必要な利用者権限を定義する必要があります。 これらの権限は、特に Special:SpecialPages に表示するかおよび他のページにそのページを含めることができるかを指定します。

また特別ページ固有の名称は、ウィキごとに変更できます。 一般形式の「特別:ページ名」の「特別」も「ページ名」も、どちらもカスタマイズできます。 「特別」疑似名前空間 は他言語に翻訳可能です。 翻訳済み名前空間はウィキテキスト {{ns:special}} で生成することができ、このウィキでは Special となります。 特別ページの属名を ID にすると、名称はシステム・メッセージでもサイトの使用言語で定義し直せます。

特別ページには、入力を受け入れるものと受け入れないものがあります。 例えば、Special:Export では、利用者が Special:Export/Sun を呼び出すことにより書き出す特定のページを定義できます。 複雑な入力を受け入れる特別ページの場合は、追加のパラメーターをURLのクエリ文字列コンポーネントに送って処理します。例:https://www.mediawiki.org/w/index.php?title=Special:Recentchanges&days=3&limit=250.

  • 特別ページを作成する様々な方法がありますが、公式の拡張機能 の大部分は下記の方法を採用しており、このスタイルに従うことが推奨されます。 また新設した特別ページの 'specialpage' には必ずクレジットブロックを含めるようお願いします。詳細は $wgExtensionCredits を参照してください。
  • 特別ページを作成後、他の人が見つけられるよう カテゴリ:特別ページの拡張機能 に追加するのをお忘れなく。
  • 特別ページは、$wgOut->allowClickjacking(); を適用しない限り、フレーム化できません。


特別ページの基本のテンプレート

拡張機能の特別ページには以下のように定義される、少なくとも4つのファイルが必要です:

  1. MyExtension/extension.json – MediaWiki の起動時に毎回読み込まれるセットアップ ファイル。
  2. MyExtension/includes/SpecialMyExtension.php – コードの大部分を持つPHPクラスファイル。
  3. i18n/en.json および i18n/qqq.json地域化ファイル

これらのファイルすべてを MediaWiki の extensions/ に作った新しいディレクトリに置きます。

特別ページ ファイル名は、拡張機能の名前に対応させるべきです。例えば、Extension:Gadgets には SpecialGadgets.php というファイルが含まれます。 作成した拡張機能が複数の特別ページを使用する場合は、さらに名前が必要です。

下記のサンプルは特別ページがMyExtensionという名前です。

リストのファイルを作成したら拡張機能を有効にするため、次の定義文を LocalSettings.php に書き加えます:

wfLoadExtension( 'MyExtension' );

設定ファイル

MyExtension/extension.json の設定ファイルの例:

{
	"name": "MyExtension",
	"version": "0.1.0",
	"author": [
		"Your Name"
	],
	"url": "https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:MyExtension",
	"descriptionmsg": "myextension-desc",
	"license-name": "MIT",
	"type": "other",
	"AutoloadNamespaces": {
		"MediaWiki\\Extension\\MyExtension\\": "src/"
	},
	"SpecialPages": {
		"MyExtension": "MediaWiki\\Extension\\MyExtension\\SpecialMyExtension"
	},
	"MessagesDirs": {
		"MyExtension": [
			"i18n"
		]
	},
	"manifest_version": 2,
	"requires": {
		"MediaWiki": ">= 1.42.0",
		"platform": {
			"php": ">= 8.2"
		}
	}
}

このファイルはいくつか重要で必須なものを登録します:

  • MediaWiki\Extension\MyExtension\SpecialMyExtension クラスの場所
  • 地域化ファイルの保存先
  • 新設した特別ページ名とクラス名
InvalidArgumentException: Provided specification is not an array というエラーが出た場合、一般的には MediaWiki が特別ページを実装する extension.json で指定されたクラスを見つけられなかったことを意味します。

特別ページのファイル

本体ファイル (MyExtension/src/SpecialMyExtension.php) は MediaWiki\SpecialPage\SpecialPage のサブクラスまたはそのサブクラスのひとつを含むべきです。 このファイルはその特別ページを誰かが呼び出すたびに自動で読み込まれます。 下記の例ではサブクラス SpecialMyExtension を実装します。

最初のパラメーターで特別ページを名付けるため、__construct() コンストラクターが必要です。

execute() は特別ページにアクセスがあったときに呼び出される main 関数です。 この関数は、関数 SpecialPage::execute() をオーバーライドします。 現在のタイトルの下位ページのコンポーネントである、単一パラメーター$parを渡します。 例えば誰かがSpecial:MyExtension/blahのリンクをたどると、$parに「blah」が入ります。

ウィキテキストおよびHTMLの出力は $wgOut を介して実行すべきです。ウィキのユーザーインターフェース内で動かすときに、直接 'print' や 'echo' を使用しないでください。

ただし特別ページを、カスタムの XML またはバイナリ出力を得るためのアクセスポイントとして使用する場合は、特別ページで出力を引き継ぐ を参照してください。

<?php
namespace MediaWiki\Extension\MyExtension;
class SpecialMyExtension extends MediaWiki\SpecialPage\SpecialPage {
	public function __construct() {
		parent::__construct( 'MyExtension' );
	}

	public function execute( $par ) {
		$request = $this->getRequest();
		$output = $this->getOutput();
		$this->setHeaders();

		# リクエストデータの取得先は例えば
		$param = $request->getText( 'param' );

		# 実行する内容
		# ...
		$wikitext = 'Hello world!';
		$output->addWikiTextAsInterface( $wikitext );
	}
}

地域化ファイル

翻訳方法はHelp:システムメッセージ を参照してください。

特別ページはすべて、'My Extension'のようにタイトルを定義します。

  • タイトルは拡張機能のページで‎<title>‎<h1>の要素として、またSpecial:SpecialPagesでも使われます。
  • 特別ページと拡張機能の説明になっていれば、どんなタイトルでもかまいません。
  • メッセージで指定されます。メッセージはキーと値のペアで構成されます。キー、 'myextension' は、すべて小文字でなければなりません

MyExtension/i18n/en.jsonにある地域化ファイルの例:

{
	"@metadata": {
		"authors": [
			"<your username>"
		]
	},
	"myextension": "My Extension",
	"myextension-desc": "Adds the MyExtension functionality.",
	"myextension-summary": "On this special page, do this simple thing and earn wonders.",
	"group-myextensionrole": "Role of myextension",
	"group-myextensionrole-member": "Member of role of myextension",
	"grouppage-myextensionrole": "{{ns:project}}:Role of myextension",
	"action-myextension": "XYZ doing.",
	"right-myextension": "to do xyz"
}

i18n/qqq.json にある、メッセージの説明文書:

{
	"@metadata": {
		"authors": [
			"<your username>"
		]
	},
	"myextension": "The name of the extension's entry in Special:SpecialPages",
	"myextension-desc": "{{desc}}",
	"myextension-summary": "Description appearing on top of Special:MyExtension.",
	"action-myextension": "{{doc-action|myextension}}",
	"right-myextension": "{{doc-right|myextension}}"
}

ID は頭文字(最初の1文字)から小文字のみで表記していること、ID の文字列をコードで記すには、スペース(空白)に代わってアンダーバー(_)を使うこと。

-summary メッセージは省略可能です。 親クラスが自動で生成すると特別ページの最上部に表示し、通常はユーザーの手続きを明示的に解説します。 その内容を定義しなければ、ウィキ管理者がそのウィキでカスタマイズするまで実行されません。

別名ファイル

特別ページの別名を作成することで、その特別ページ名を国際化することもできます。下記の例ではファイル「MyExtension.i18n.alias.php」を使用します。 この例では、特別ページMyExtension別名を登録することで、.../Special:My Extensionとドイツ語の.../Spezial:Meine_Erweiterungからアクセス可能にしました。

extension.jsonに別名ファイルを追加する:

...
	"ExtensionMessagesFiles": {
		"MyExtensionAlias": "MyExtension.i18n.alias.php"
	},
...

MyExtension.i18n.alias.phpに特別ページの別名を追加する:

<?php
/**
 * Aliases for myextension
 *
 * @file
 * @ingroup Extensions
 */

$specialPageAliases = [];

/** English
 * @author <あなたの利用者名>
 */
$specialPageAliases['en'] = [
	'MyExtension' => [ 'MyExtension', 'My Extension' ],
];

/** Deutsch
 * @author <あなたの利用者名>
 */
$specialPageAliases['de'] = [
	'MyExtension' => [ 'MeineErweiterung', 'Meine Erweiterung' ],
];

ここでも ID 中にスペース(空白)を用いる場合は、アンダーバー(_)を代入します。

ページのヘッダーとリンクの処理は、通常のページと同じ規則に従います。

$wgCapitalLinks がtrueの場合、小文字は大文字に変換され、アンダーバーはスペース (空白) として表示されます。

例えば、拡張機能が他の場所から一貫して my_extension と識別されるとすれば、上記の代わりに、'my_extension' => 'My extension' が使えます。

その場合、英語の連想配列においてSpecialPageを識別する文字列(この例ではMyExtension)は同時に有効なタイトルでもあることに注意します。

また、$specialPageAliases['en']['MyExtension']の最初の要素はキー('MyExtension')と同一でなければならないことに注意してください! さもないとSpecial:Specialpagesにページが一覧されません。

特別ページ群

サブクラスで SpecialPage::getGroupName() をオーバーライドすると、その特別ページをSpecial:SpecialPagesでどの群の下位に表示するか指定できます。

    /**
     * 特別ページを Special:SpecialPages で表示する場所を指定するには、親ページをオーバーライドしてください。
     * 既定値は 'other' です。既定値のままでよければ、オーバーライドは不要です。
     * 'media'を指定してシステム・インターフェースメッセージ <code>specialpages-group-media</code> を使用します。これは英語では'Media reports and uploads'と翻訳されます (日本語ではメディア情報とアップロード)。
     * 
     * @return string
     */
    function getGroupName() {
        return 'media';
    }

よく使われる値は 'login', 'maintenance', 'media', 'other', 'pagetools', 'redirects', 'users' です。 承認された値はSpecial:AllMessages (specialpages-groupを検索もしくはSpecial:SpecialPages?uselang=qqxを開き疑似言語「qqx」を使ってウィキをブラウジング) を開いて、見出しを検索すると確認できます。 インターフェースのメッセージ「'specialpages-group-media'」を使用するには、「'media'」という用語を設定します。

自分の特別ページがあらかじめ設定された見出しのいずれにも当てはまらない場合は、新しい見出しを地域化ファイルに追加して使用できます(地域化ファイル参照)。

地域化ファイルには、MediaWikiと同梱の標準ページグループの一覧があります。例えば英語のメッセージの一覧はlanguages/i18n/en.json) に収納してあり、冒頭はspecialpages-group-で始まります。 自分の特別ページをusersに分類すると、メッセージはspecialpages-group-usersとなります。 このキーの値は例えば Users and rights のように、そのカテゴリの名前として表示されるテキストです。

もし自分の特別ページが既存のカテゴリのどれにも当てはまらないと思える場合は、いつでも新規に作成できます。 拡張機能の地域化ファイルを開き、messages配列に対応する新しいキーを挿入するだけで処理できます。 この例ではgamificationグループを以下のとおり定義しています。

{
    "myextension": "My Extension",
	"myextension-desc": "Adds the MyExtension functionality.",
	"myextension-summary": "On this special page, do this simple thing and earn wonders",
	"specialpages-group-gamification": "Gamification"
}

自分のクラス定義でメソッド SpecialPage::getGroupName() の返り値を gamification に設定したならば、Special:SpecialPagesを再読み込みして新しいカテゴリを確認します。

その他の重要なファイル

SpecialPage.php

コンストラクター

コンストラクターは多重定義して利用者自身のデータを初期化することができますが、多重定義をする主な理由はSpecialPageクラス自体の挙動を変更するためです。 子クラスから基本クラスのコンストラクターを呼び出すときは、以下の引数を利用できます。

function __construct( $name = '', $restriction = '', $listed = true );
  • string $name リンクやURLで表示される特別ページの名称
  • string $restriction 「"block"」や「"delete"」など利用者権限が必要です。制限つきページのアクセスも参照してください。
  • boolean $listed 当該ページが Special:Specialpages に掲載されているかどうか

SpecialPage->setHeaders()

これにより OutputPage のオブジェクト $wgOut をファイル名と特別ページの説明で初期化します。 常に execute() メソッドから呼び出します。

SpecialPage->getOutput()

このメソッドが返すOutputPageオブジェクトは、以下の方法でアクセスができます。 例のコードと同様に、非推奨となったグローバル変数 $wgOut の代わりに、以下のコードを使用してください:

$output = $this->getOutput();
$output->addWikiTextAsInterface( 'Hello, World' );

SpecialPage->getRequest()

このメソッドが返すWebRequestオブジェクトは、以下の方法でアクセスできます。 例のコードと同様に、非推奨となったグローバル変数 $wgRequest の代わりに、以下のコードを使用してください:

$request = $this->getRequest();
$myparam = $request->getText( 'myparam' );

SpecialPage->including()

特別ページによっては、他のページ内からインクルードすることができます。 例えば、ページに {{Special:RecentChanges}} を追加すると、ページの既存のコンテンツ内に最近の変更のリストが挿入されます。

別のWebページから特別ページをインクルードできるのは、コンストラクターでページをインクルード可能と宣言した場合のみです。 これを行うには、親クラスの初期化後に __construct() メソッドに以下を追加します。

$this->mIncludable = true;

IncludableSpecialPage クラスを拡張するものとして特別ページクラスを定義することもできます。

SpecialPage->including() 関数は、特別ページが呼び出されているコンテキストを示す真偽値を返します。独立のWebページの場合はfalse、別のWebページ内からインクルードされている場合は true です。 通常、ページがインクルードされている場合は、プレゼンテーションをいくらか減らしたいでしょう。

SpecialPage->execute()

これは子クラスがオーバーロードするべき関数です。 これは、通常は暗号的に $par と呼ばれる単一のパラメーターを渡します(利用者が特別ページにフィードできるパラメーターであるため、$parameter の略です)。 このパラメーターは、現在のページ名の下位ページ コンポーネントです。 たとえば、誰かが Special:MyExtension/blah へのリンクをたどると、$par には「blah」が含まれます。

ヘルプ ページ
MediaWiki バージョン:
1.25

MediaWiki.orgに ヘルプページ を追加すると便利です。ここで 翻訳可能 になります。 利用者がヘルプページを確実に見つけられるようにするには、特別ページで問題のヘルプページへリンクするのが非常に簡単でお勧めです。

$this->addHelpLink( 'Help:Extension:MyExtension' );

OutputPage.php

OutputPage.php には、タイプ OutputPage のオブジェクトのクラス定義が含まれています。 このクラスのオブジェクトは、特別ページ から次を使用して取得できます。

$output = $this->getOutput();

もちろん、変数名 $output は任意です。 何と呼んでも、これはブラウザに出力を送信する方法であるため、最も使用する変数です。(いいえ、echo または print は使用しません。) どこかで使用したい場合、変数を作成してから使用します:

function randomFunction() {
	$output = $this->getOutput();
	$output->addHTML( '<b>This is not a pipe...</b>' );
}

必要に応じて、特別ページ 拡張機能のさまざまなメソッドで複数の OutputPage オブジェクトを作成できます。 それらは、実行された順序で出力に追加されます。

includes/OutputPage.php を表示することで OutputPage クラスを検査できます(実際、これらはすべて検査できます。)が、必ず知っておくべきメソッドがいくつかあります。

OutputPage->addHTML()

基本的に、echo の迅速で汚い代替品です。 それはあなたの入力を受け取り、それをバッファに追加します:質問はありません。 以下の操作では、$action に利用者データが含まれている場合、XSS、邪悪なもの、またはサタンの spawn が簡単に挿入される可能性があります。 信頼できる出力を構築するには、エスケープ(php関数htmlentitiesなど)またはXMLビルダークラスを使用することをお勧めします。

$output->addHTML( '<form action="'.$action.'" method="post">' );

OutputPage->addWikiText()

ほとんどの出力では、この関数を使用すべきです。 これは少し黒魔術の機能です。ウィキテキストが入り、HTMLが出て、その間にたくさんの難解なコードと悪魔の召喚が行われます。

$output->addWikiText("This is some ''lovely'' [[wikitext]] that will '''get''' parsed nicely.");

注目に値するのは、パーサーがチャンクをまとまりのある全体として表示し、それに応じて段落を表示することです。あれは...

$output->addWikiText( '* Item 1' );
$output->addWikiText( '* Item 2' );
$output->addWikiText( '* Item 3' );

おそらく意図されていなかった、それぞれ1つのアイテムを含む3つのリストを出力します。

しかしながら注意点として、システムメッセージを挿入して、解析したウィキテキストのように処理したいだけの場合、$this->getOutput()->addHtml( $this->msg( 'key-of-message' )->parse() )のようなコードを使用してください。 これには上述した入れ子のパーサコールの問題がありません。

OutputPage->showErrorPage()

エラーページが表示されます。 引数 $title$msg は、テキストではなく $this->msg() へのキーを指定します。 例:

$output->showErrorPage( 'error', 'badarticleerror' );
  • 「error」は、テキスト「エラー」を指します。
  • 「badarticleerror」は、テキスト「このページでは要求された操作を行えません。」を指します。

メッセージオブジェクトを指定したり、パラメータを追加したりすることもできます。

$output->showErrorPage( 'error', 'badarticleerror', [ 'param1', 'param2' ] );
$messageObject = new Message(...);
...
$output->showErrorPage( 'error', $messageObject );
$titleMessageObject = new Message(...);
$messageObject = new Message(...);
...
$output->showErrorPage( $titleMessageObject, $messageObject );

WebRequest.php

WebRequest クラスは、GET配列とPOST配列から情報を取得するために使用されます。 スーパーグローバルに直接アクセスするよりも、これを使用することをお勧めします。 WebRequestオブジェクトには、RequestContext を使用して拡張機能からアクセスできます。

Database.php

MediaWikiには、\Wikimedia\Rdbms\Database クラスを使用してデータベースと対話するための便利な関数とラッパーがたくさんあります。 また、興味深い負荷分散スキームも用意されています。 これらのラッパーを使用することをお勧めします。 すべての便利な機能の完全なリストについては、Database.php をチェックしてください。これらのドキュメントでは、明らかでない警告についてのみ説明しているためです。 Manual:データベース アクセス を参照してください。

User.php

User クラスは、システム上のユーザーを表すために使用されます。 SpecialPage->getUser() は、現在ログインしている利用者の User オブジェクトを取得するために使用する必要があります。 グローバル $wgUser の使用は非推奨です

Title.php

タイトルは、Wiki内のページの名前を表します。 MediaWikiはページ名に対してあらゆる種類の楽しいエスケープと特殊なケースロジックを実行するため、これは便利です。したがって、独自のタイトルをURLに変換する関数をロールする代わりに、ページ名を使用してTitleオブジェクトを作成し、getLocalURL() を使用してそのページへのURLを取得します。

特別ページクラスの外部から特別ページのタイトルオブジェクトを取得するには、SpecialPage::getTitleFor( 'YourCanonicalSpecialPageName' ) を使用できます。 それはあなたにWikiの言語でローカライズされたタイトルを与えます。

カスタム特別ページ

MediaWikiにバンドルされていない独自の特別ページを提供するさまざまな方法があります。

  • 1つの方法は、記事を作成または編集するためのフォームを生成する拡張機能をインストールすることです。現在利用可能な拡張機能のリストは、カテゴリ:特別ページの拡張機能 にあります。
  • 独自の特別ページを提供する拡張機能を作成することもできます。独自の拡張機能を作成するには、PHP コーディングのスキルと、オブジェクト指向の設計とデータベースに関する快適さが必要です。また、コードを使用して MediaWiki 記事を作成および編集する方法を知る必要があります。詳細については、この議論 を参照してください。
  • 既定のエラー メッセージ「不明な特別ページ」(または特別:白紙ページ の下位ページを使用している場合は、「このページは意図的に白紙にされています。」)の代わりに、JavaScriptを使用してカスタム ページを表示することもできます。 MediaWiki:Common.jsで、wgPageName を確認してから、MediaWikiで生成されたコンテンツを非表示にし(appendCSS {visibility:hidden;} のみ)、カスタムHTML(innerHTML)を document.getElementById('bodyContent') または document.getElementById('mw_contentholder') に挿入します。 例については、meta:User:Krinkle/Tools/Real-Time Recent Changes を参照してください。

よくある質問

拡張機能の名称を設定する

拡張機能の題名を設定するのはMediaWikiではなく、開発者のしごとです。 Special:Specialpages が呼びされたとき、または特別ページが読み込まれたときに、拡張機能の名前を探します。 function execute( $par ) 節では、拡張機能に題名を与えるため OutputPage メソッドを以下のように使用します: $this->getOutput()->setPageTitle("your title");

拡張機能が見つかる場所 (特別ページのコンストラクターに渡すものとして定義) は、キーです--ただしgetDescription()の影響で大文字化しない点が異なります。特別ページの題名を探すために内部的に使われる関数 (もしくはdescriptionとよばれるもの) 、strtolowerの名称です。 例えば"ThisIsACoolSpecialPage"のキーは"thisisacoolspecialpage"となります。

理論上、メッセージキャッシュに影響を与えないためgetDescriptionをオーバーロードしても、ソースコードに記述してあるとおり、以下の結果となります。「"これを派生クラスでオーバーライドできるものの、通常は既定の動作を維持する方が簡単です。 さらに、MediaWiki名前空間がメッセージをオーバーロードしようとしても、これは以下のように予防します。

拡張機能の名称を地域化する

さて、ぴかぴかのMediaWiki拡張機能をインストールした直後だとします。そのとき気づきました。「自分のウィキはフランス語版なのに、ページは英語で表示されてしまった、困った。」 ほとんどの人は見過ごしますが、実は簡単なタスクで修正できます (ただし、開発者がこのページで解説した方法を使った場合に限る。) ソースコードをめぐる処理はありません。 仮にページ名をDirtyPagesとすると、その名前は「List of Dirty Pages」の一覧に (訳注:英語版として) 表示されるものの、(訳注:フランス語版で使うという仮定なので・excuse my poor Frenchつまり読者にはフランス語はわからないだろうけれど) 「Liste de Pages Sales」に表示したいとします。 すると処理は、以下のように実に簡単です。

  1. MediaWiki:DirtyPagesを探して開きたいのですが、ページが存在しなくても、編集します。
  2. "Liste de Pages Sales"を追加して保存

するとヴアラ (voilàってダジャレですが) 変更が適用されました。

この方法だと、利用者のウィキの題名を使用言語にカスタマイズするためにも便利に使えます。例として、開発者が名づけた「汚れたページ一覧」という名称が気に入らないなら、(訳注:この方法で)「クリーンアップが必要なページ一覧」と改名します。 詳細については、Special:Allmessagesを参照してください。

また、例えば警告文など自分の拡張機能に変化させる文章がまとまった量ある場合は、その文章を直接出力しないでください。 代わりに、メッセージキャッシュに変化する部分の文章を取り込み、ご利用の言語コードで出力する段階が来たら、次の処理をします。

$wgOut->addWikiText( $this->msg( 'dirtypageshelp' ) );

さらにこのメッセージ自体もMediaWiki:Dirtypageshelpでカスタム化することができます。

Help:システムメッセージ も参照してください。

ページのアクセスを制限する

Special:SpecialPagesに自分の特別ページを表示しない

特別ページの表示を制限したい場合、特別ページをSpecial:SpecialPagesから除去して特定の権限を持つ利用者限定で表示する処理をしようと考えるかもしれません。 これをコンストラクターで実行するには、$restrictionパラメータに渡します。例えば、既定では管理者限定で割り当てられる「editinterface」という権限が対象です。利用できるその他の利用者権限については、利用者権限のマニュアル利用者権限のマニュアルを参照してください。

function __construct() {
	parent::__construct( 'MyExtension', 'editinterface' ); // システム管理者に限定
}

または、セットアップ ファイルに独自の権限を作成して、それをシステム管理者に、次の例のように割り当てます。

"AvailableRights": [
	"myextension-right"
],
"GroupPermissions": {
	"sysop": {
		"myextension-right": true
	}
}

次に、自分の権限でコンストラクターを呼び出します。

function __construct() {
	parent::__construct( 'MyExtension', 'myextension-right' );
}

Prevent 自分の特別ページへのアクセスを防止する

コンストラクター上で上記の手順に従い自分のページに制限をかけても、例えば Special:MySpecialPage を開くと、依然としてURL経由で直接、見ることができます。 自分の特別ページへのアクセスを制限するには、executeメソッドで$this->checkPermissions()を呼び出す必要があります。

権限に関してもっと細かいコントロールが必要な場合は、$this->checkPermissions()をオーバーライド、そして/もしくは拡張機能に必要な権限チェック機能をなんでも追加します。

Special:UserLogin と Special:UserLogout のページの無効化

LocalSettings.php では SpecialPage_initList フックを使って不要な組み込みの特別ページを解除できます。 例えば特定の利用者グループについて条件付きの特別ページ解除が必要な場合、「いくつかのSpecialPagesに制限をかける」を参照してください。 利用者がこのような解除された特別ページにアクセスしようとした場合、一般メッセージ「無効な特別ページを要求しました。」が表示されます。

$wgHooks['SpecialPage_initList'][] = function ( &$list ) {
	unset( $list['Userlogout'] );
	unset( $list['Userlogin'] );
	return true;
};

別のアプローチは、DisabledSpecialPage コールバックを使用することです。 特別ページを「一時的に」無効にするだけの場合は、このアプローチが望ましいかもしれません。この場合の既定のメッセージは、ページがまったく存在しないように装うのではなく「このページはシステム管理者により無効化されています。」と表示されるためです。 これにより、ページが後でアクティブ化される可能性があることが明確に示されます。

$wgSpecialPages['Userlogout'] = DisabledSpecialPage::getCallback( 'Userlogout' );
$wgSpecialPages['Userlogin'] = DisabledSpecialPage::getCallback( 'Userlogin' );

コールバックの2番目の引数としてメッセージキーを指定することにより、特別ページを無効にする理由のカスタムの長い説明を追加することもできます。 これを行うには、最初にシステムメッセージ「MediaWiki:Userlogout-disable-reason」を作成し、そこにすべての説明を書き込みます。 メッセージはブロック形式で解析されます。 次に、LocalSettings.php に以下を追加します:

$wgSpecialPages['Userlogout'] = DisabledSpecialPage::getCallback( 'Userlogout', 'Userlogout-disable-reason' );

記録の追加

MediaWiki では透明性と共同作業のために、ユーザーの行動をすべて記録します。 その方法は Manual:Special:Log 用に記録を登録する で解説してあります。

Special:Specialpagesのグループを変更する

拡張機能の開発者の皆さんは、このページの特別ページのグループの節の説明に従い、getGroupName() メソッドを実行してください。

MediaWiki 1.21 以降、特別ページのグループはシステムメッセージを編集すると、オーバーライド可能になりました。 ただしサイト管理者が実行する方法であり、拡張機能の開発者向けではありません。 グループ名は specialpages-specialpagegroup-<特別名の名前> メッセージに配し、特別ページの英語版の正規名称 <特別名の名前> は小文字で表記します。 例えば、Special:SpecialpagesSpecial:MyLittlePageMyLittleGroup のグループに表示したい場合は、MediaWiki:Specialpages-specialpagegroup-mylittlepage を作成し、内容を MyLittleGroup にするだけです。 すると Special:MyLittlePageMyLittleGroup のグループに表示されます。このグループの名前は MediaWiki:Specialpages-group-mylittlegroup で設定できます。

既存の特別ページのグループを変更するには、Special:SpecialPages&uselang=qqx を参照して前述の「mylittlepage」の部分を書き換えます。

Special:Specialpagesからページを隠す

Special:Specialpages から特別ページを完全に除去するには、SpecialPage 親コンストラクターに第 3 のパラメーターとして false を渡します。これは、このページの SpecialPage コンストラクターの節で説明されています。 ページをリストに載せるべきかどうかを判断するために、より複雑なロジックが必要な場合は、isListed() 関数をオーバーライドすることもできますが、コンストラクターのパラメーターを使用する方が簡単です。

ウィキ上の特別ページとその別名の一覧を取得する

"siteinfo" APIモジュールを使用して、ウィキから情報を取得します。例: /api.php?action=query&meta=siteinfo&siprop=specialpagealiases

関連項目

  • HTMLForm – チェックボックスやテキストエリア、ラジオボタン他を、特別ページに作る方法