Manual:カスタム名前空間の使用方法
組み込みの名前空間に加えて、内容を分離してより論理的に整理できるようにするために、カスタムの名前空間を MediaWiki に追加できます。
$wgExtraNamespaces
構成ディレクティブを使用することで、カスタムの名前空間は管理が簡単です。
$wgNamespaceAliases
構成ディレクティブを使用して、カスタム (および定義済み) 名前空間のエイリアスを定義することも可能です。
いくつかの拡張機能によってカスタム名前空間を作成するのが簡単になります。
例として NamespaceManager や BlueSpiceNamespaceManager があります。
カスタム名前空間の作成
名前空間を追加登録するには、 "LocalSettings.php" ファイルの $wgExtraNamespaces
グローバル変数に追加して登録します。
すべての名前空間は、この配列内で一意の数値インデックスを必要とします。
単純なカスタム名前空間の作成の例として、「Foo」名前空間 3000 とそれに付随する「Foo_talk」名前空間を定義するには、以下の数行を "LocalSettings.php" ファイルに追加します。
なお、カスタム名前空間に対応するトーク名前空間があることは、現在必須の要件です。
// 追加の名前空間の定数を定義する。
define("NS_FOO", 3000); // これは必ず偶数でなければならない。
define("NS_FOO_TALK", 3001); // これは、その次の奇数の整数でなければならない。
// 名前空間を追加する。
$wgExtraNamespaces[NS_FOO] = "Foo";
$wgExtraNamespaces[NS_FOO_TALK] = "Foo_talk"; // 名前空間名に含まれるアンダースコアに注意。
- 未使用の番号を選択
- 慣習として、100-199の番号の名前空間はサイト固有の名前空間として予約されていますが、この慣習に従わないいくつかの拡張機能も存在します。 拡張書き込み機能では、最大 32767 までの数値を使用します。 インデックスを選ぶ際には、既に 拡張機能の既定の名前空間 に入っている番号は避けるべきです。 3000から4999までの数字は、システム管理者が独自の名前空間を定義するために予約されています。 (また、すでに拡張機能で使用されている既定の名前空間にある名前空間nameは避けたいところです)。
- 偶数と次の奇数
- 上の例では、名前空間の配列のインデックスが 3000 であることに注意してください。
- 偶数の名前空間は、主となる名前空間を示します。
- 奇数の名前空間は、一つ前の数字の名前空間に関連する議論(会話)をする名前空間を示します。
- トーク名前空間も作成
- 通常、議論の「トーク」名前空間は、各カスタム名前空間と共に作成します。 この例では、ページの移動 を "Foo" 名前空間に移動すると、関連するトークページがあれば移動するように促され、移動することを選択すると、MediaWiki はそのトークページを "Foo talk" に配置します。
- 空白を含めない
- 名前空間を登録する際は、スペースの代わりにアンダースコアを使ってください。 “My Namespace”は、名前空間の登録においては無効ですので、代わりに“My_Namespace”を使ってください。
- ハイフンを含めない
大文字の部分ではハイフンを使用できませんが、接頭辞タイトルに安全に追加できます。 例:
$wgExtraNamespaces[NS_FOOFOO] = "Foo-Foo";
- 選択した番号に名前を付ける
- この例では、名前空間IDに定数を定義しています。これは、後ほど
$wgNamespaceProtection
、$wgNamespacesWithSubpages
、$wgExtraGenderNamespaces
などの設定で、これらの名前空間を参照できるようにするためのものです。
新しい名前空間の追加設定を構成することもできます。
$wgNamespaceProtection[NS_FOO] = [ 'editfoo' ]; // foo 名前空間 の編集に必要な "editfoo" 権限
$wgNamespacesWithSubpages[NS_FOO] = true; // foo 名前空間で有効な下位ページ
$wgGroupPermissions['sysop']['editfoo'] = true; // "sysop" グループの利用者に許可された "editfoo" 権限
- 早めに行う
$wgExtraNamespaces
の操作はMediaWikiの初期設定の間に完了しなければなりません。すなわち、拡張機能などが新しく作成されたカスタム名前空間で動作する場合、それぞれの拡張機能を呼び出す前にそれらを定義し名前を付けることを確認します。たとえば、それは$wgExtensionFunctions
のような初期化後のフックで操作されることはありません。
- URLプロトコルとの衝突に注意
- MediaWikiのリンクコードは
$wgUrlProtocols
変数で定義された、いくつかのURLプロトコルについて知っています。 名前空間名がこれらのプロトコルと同一である場合、カスタム名前空間のページへの [[wikilinks]] を作成するのに苦労するでしょう。 これは、誰かが "News" 名前空間を作成しようとしたときに最もよく発生するもので、news:
は NNTP ニュースグループの URL プロトコルだからです。 - この問題を回避するには、LocalSettings.php ファイルに以下のコードを追加して、関連するURLプロトコルの登録を解除します(
news
を削除したいプロトコルの小文字の名前で置き換えます)。
$wgUrlProtocols = array_diff( $wgUrlProtocols, array( 'news:' ) );
拡張機能
MediaWiki バージョン: | ≧ 1.25 Gerrit change 166705 |
拡張機能では、Flow 拡張機能の "Topic" 名前空間のように、独自の名前空間を追加することがよくあります。
extension.json 登録システムには、名前空間を列挙するための拡張機能用の namespaces
キーがあります。
拡張機能 Gadgets から:
"namespaces": [
{
"id": 2300,
"constant": "NS_GADGET",
"name": "Gadget",
"protection": "gadgets-edit"
},
{
"id": 2301,
"constant": "NS_GADGET_TALK",
"name": "Gadget_talk"
},
]
ここでは、コンテンツの名前空間にするかどうかなど、他の名前空間に関連する設定も行えます。利用できるプロパティは Manual:extension.json/スキーマ を参照してください。
名前空間の登録が条件付きの場合 (例えば、EventLogging がスキーマを保存するウィキでのみ「Schema」名前空間を定義する場合)、拡張機能は extension.json
で名前空間の定義に "conditional": true
を追加し、名前空間を登録するかどうかを決定する CanonicalNamespaces フックのハンドラーもそこで登録する必要があります。
フック ハンドラーは呼び出された $namespaces
のみを変更し、それ以外の名前空間設定はすべて extension.json
に登録されたままにする必要があります。
それらの設定も動的にする必要がある場合は、CanonicalNamespaces フック ハンドラー内で $wgContentNamespaces
、$wgNamespaceContentModels
などを変更しないでください (効果はありません – T288819)。代わりに、ll|Manual:Extension.json/Schema#callback コールバックのように、もっと早い段階で設定する必要があります ($wgExtensionFunctions
ではありません)。
LocalSettings.php に拡張機能を追加しても、関連する名前空間の定数が他の拡張機能に対してグローバルで利用可能になるとは限らないことに注意してください。
コンテンツ名前空間
サイトの統計ページを構築するとき(Special:Statistics を参照)、MediaWikiはある合計値を計算するためにデータベースに保存された変数を使用します。 一つの特定の合計値は"記事の数"もしくは"内容ページの数"の合計値です。
記事もしくは適切な内容としてページがみなされるようにするために、次のことをしなければなりません:
- 標準名前空間内、または定義済みの本文名前空間内に配置する
- リダイレクト ページではないように
$wgArticleCountMethod
で構成されるように、少なくとも1つ内部リンクを含む
追加のコンテンツを保持するためにカスタム名前空間を作成する際には、それを設定で示すことはいい考えです。 これは $wgContentNamespaces 構成ディレクティブ経由で行われます。
上記の例を拡張するために、次の内容を "LocalSettings.php" ファイルに追加します:
$wgContentNamespaces[] = 3000;
- または
$wgContentNamespaces[] = NS_FOO;
これでMediaWikiはページが含んでいる基準(criteria)と合う場合に"Foo"名前空間にあるページを記事と見なすようになり、サイト統計カウンターをアップデートするときにインクルードされます。
メンテナンス スクリプトの実行
- 構成パラメーター
$wgContentNamespaces
の値を調整するとき、内部の統計キャッシュをアップデートする "path/to/maintenance/updateArticleCount.php や "path/to/maintenance/initSiteStats.php" のスクリプトを実行することはよいアイディアです (Manual:メンテナンススクリプト を参照)。
カスタム名前空間が必要な場合
これを必要とする理由はいくつかあります。
- カスタム名前空間は、検索結果ページに表示されるべきでないコンテンツ、例えば参照読み込みにのみ使用されるページなどを保持するために使用できます。
- 特定の名前空間では、編集に追加権限が必要です。
- 特定の名前空間に特定の制限や既定の設定を適用させたくない場合 (たとえば $wgNoFollowNsExceptions など)
- 特定のコンテンツに対して、その名前空間のみで検索可能な統一プレフィックス
- MWの開発者であれば、時にはカスタムで拡張機能の名前空間を用意する必要があります。
既存のページを取り扱う
ページレコードを保存するとき、MediaWikiはタイトルのテキストに加えて、名前空間の数値インデックスを使用します。 ページが存在しない名前空間に作成されたとき、例えば、"Bar:Some page"、メインの名前空間にあるものとして取り扱われます。
"Bar"のためにカスタムの名前空間を後で追加する場合、このことによって問題を起こす可能性があります。MediaWikiは適切な名前空間経由でインデックスされたページを探しますが、見つからないので、内容にアクセスできません。
この問題を修正するために、3つの主要なアプローチがあります。
衝突するページを移動させる
影響を受けるページの数が少ない場合 (例:「Bar」に 5 つのページがあり、それらはサイト設定で名前空間が定義される前に作成された)、以下の方法が適切かもしれません:
- 構成ファイルにある名前空間の定義をコメントアウトする
- それぞれ影響されるページにアクセスをして、擬似名前空間に移動させる、例えば、Bar:Some page"を"Bar2:Some page"に移動させる
- 名前空間の定義のコメントを解除する
- 影響されるページを新しい名前空間に戻す
メンテナンス スクリプトの使用
maintenanceディレクトリ内に、大規模のページに対してより効果的に上記のオペレーションを実行するメンテナンススクリプトがあります; NamespaceDupes.php 。
シンプルですが、すべてのMediaWikiメンテナンススクリプトと同様に、最初に利用可能な使い方情報(--help
を使用します)をオプションとして最初に尋ねることができます。
データベース クエリを使用する
すべてのページ "Bar:Some page" を名前空間3000に移動するには、次のデータベースクエリを作成します。
UPDATE page SET
page_title = REPLACE(page_title, 'Bar:', ''),
page_namespace = 3000
WHERE page_title LIKE 'Bar:%' AND page_namespace=0
議論ページを取り扱う:
UPDATE page SET
page_title = REPLACE(page_title, 'Bar_talk:', ''),
page_namespace = 3001
WHERE page_title LIKE 'Bar_talk:%' AND page_namespace=1
このように設定した後、refreshLinks.php スクリプトとupdateSearchIndex.php スクリプトを実行して、Wikiの内部リンクと検索結果を更新してください。 Googleなどの外部検索エンジンは、インデックスの更新に時間がかかることに注意してください。
カスタム名前空間の除去
上記で書かれた問題はカスタム名前空間が削除されるときにも起こります; MediaWikiは名前空間のための数値インデックスをもはや認識しないので、望むページのためにメインの名前空間を探そうとしますが、内容にアクセスできません。 多くのサイトではremoved名前空間が必要ではないので、これはほとんど起こりません。しかし問題があります。 (参照: メーリングリストの議論).
次の例は Flow と Topic 名前空間を削除する方法です:
- 削除の流れ
- 設定に$wgExtraNamespaces[2600] = 'Topic';を一時的に追加する。
- Topic名前空間内のすべてのページを削除するにはdeleteBatch.phpを使用します。
- $wgExtraNamespacesの設定を削除します。
カスタム名前空間の名前変更
ページの大量移動を行わずに、カスタム名前空間「Foo」を「New」に改名する必要があるとします。
これを実現する最も簡単な方法は、名前空間ID(ここでは"3000
")と名前空間定数(ここでは"NS_FOO
")を保持し、(目に見える)名前空間タイトルを変更して、古いものをエイリアスとして追加することです。
define("NS_FOO", 3000);
$wgExtraNamespaces[NS_FOO] = "Foo";
を
define("NS_FOO", 3000);
$wgExtraNamespaces[NS_FOO] = "New";
$wgNamespaceAliases['Foo'] = NS_FOO;
に変更します
名前空間の衝突の回避
名前空間の競合を避けるために、例えばあなたの名前空間が他の拡張機能で定義されている名前空間と同じ番号を持っている場合は、拡張機能の名前空間一覧で競合を避けるために避けるべき番号を確認できます。
$wgExtraNamespaces の既存の名前空間に関連しないIDのために$wgNamespacesToBeSearchedDefault 、$wgNamespacesWithSubpages 、$wgContentNamespacesもしくは$wgNamespaceAliases を定義することはwikiを壊しません; MediaWikiはそのような設定を無視します。
名前空間のスタイル設定
たとえば、特定の名前空間(と、それに関連するトーク名前空間)のページの背景色を設定するには、次のコードをcommon.cssに追加します。
.ns-3000 #content, .ns-3001 #content { background-color: #f3f3ff; }
.ns-3000 div.thumb, .ns-3001 div.thumb { border-color: #f3f3ff; }
ここで、3000
は名前空間のインデックス、#f3f3ff
は背景色として使用したい色です。
また、タブの名前を既定値 (名前空間の名前) から変更したい場合もあるかもしれません。 This is located in your system messages at MediaWiki:nstab-namespace.
関連項目
- Manual:名前空間
- Namespace manager - もともとは MW1.6-wikidata とその後継のために提案されました。 現在はOmegaWikiプロジェクトによって使用されています。
サイト管理
拡張機能
- カテゴリ:名前空間の拡張機能
- Extension:NamespaceManager - for management of namespaces
- Extension:BlueSpiceNamespaceManager - lets you create custom namespaces
- Extension:SpecialNamespaces - の修正バージョンで、namespace managerを特別ページとして提供します。
- Extension:Lockdown - 名前空間へのアクセスを制御する
拡張機能の開発者向け
- Extension namespace registration - List of custom namespaces registered by extensions. If you define a constant for a custom namespace, list it here, too.