手册:使用自定义命名空间
除了内置的命名空间外,也可以为MediaWiki的安装添加自定义命名空间,以进一步分离内容并允许更多的逻辑组织。
自定义命名空间可以使用 $wgExtraNamespaces 配置指令简单管理。
也可以使用 $wgNamespaceAliases 配置指令为自定义(以及预定义的)命名空间定义别名。
有些拓展会使创建自定义命名空间变得容易。
例如NamespaceManager和BlueSpiceNamespaceManager。
创建自定义命名空间
在"LocalSettings.php"文件中加入$wgExtraNamespaces全局变量以创建新的命名空间。
这个数组中,所有命名空间都需要一個獨一無二的数字索引。
一个简单的创建自定义命名空间的例子,将以下行代码添加到"LocalSettings.php"文件会定义一个“Foo”命名空间(3000)及其“Foo_talk”命名空间。
需要注意的是自定义命名空间目前必须要有对应的讨论命名空间。
// 为我添加的命名空间定义常量。
define("NS_FOO", 3000); // 这必须是偶数。
define("NS_FOO_TALK", 3001); // 这必须是下一个奇整数。
// 添加命名空间。
$wgExtraNamespaces[NS_FOO] = "Foo";
$wgExtraNamespaces[NS_FOO_TALK] = "Foo_talk"; // 请注意命名空间名称中的下划线
- 挑选未使用的数字
- 作为惯例,数字100-199的命名空间是为保留的特定命名空间,尽管有的扩展不遵从这个惯例。 扩展编写者使用更高的数字,高达32767。 当选择索引时,你应该避免任何已在扩展默认命名空间里的任何数字,这是因为你有可能以后会安装那些插件。 从3000到4999的数字是为系统管理员保留的,以定义他们的自定义命名空间。 (并且,你也要避免任何命名空间的名称与扩展默认命名空间内的冲突。)
- 同时创建讨论命名空间
- 您通常会为每个自定义命名空间创建一个讨论“Talk”命名空间。 这个例子中,如果你将页面移动到“Foo”命名空间,将被提示移动其关联的讨论页(如果有),如果你选择这样做,MediaWiki将会把讨论页放在“Foo talk”中。
- 无空格
- 注册命名空间时,使用下划线而不是空格。 “My Namespace”是无效的,请改用“My_Namespace”。
- 没有连字符
大写部分不允许使用连字符,但它们仍然可以安全地添加到前缀标题中。 例子:
$wgExtraNamespaces[NS_FOOFOO] = "Foo-Foo";
- 为您选择的数字命名
- 这个例子为命名空间ID定义了一些常量,这样一来你以后便可以在配置中引用这些命名空间,例如在
$wgNamespaceProtection、$wgNamespacesWithSubpages或$wgExtraGenderNamespaces中。
你可以继续为你的新命名空间配置额外的设定。
$wgNamespaceProtection[NS_FOO] = [ 'editfoo' ]; // 需要“editfoo”权限才能编辑foo命名空间
$wgNamespacesWithSubpages[NS_FOO] = true; // 为foo命名空间启用子页面
$wgGroupPermissions['sysop']['editfoo'] = true; // 向“sysop”用户组授予“editfoo”权限
- 尽早进行
- 对
$wgExtraNamespaces的操作必须要在MediaWiki初始化期间完成,即,以防一个拓展之类的东西需要用新增的自定义命名空间,请确保你在调用对应拓展之前就定义并命名好这些命名空间。
- 小心URL协议碰撞
- MediaWiki的链接代码认识一些URL协议,它们都定义在$wgUrlProtocols变量里。 如果你的命名空间名字与其中一个协议相同,在创建[[维基链接]]指向自定义命名空间的页面时会有麻烦。 这种情况最常出现于试图创建“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 仅在存储模式的 wiki 上定义其“Schema”命名空间),那么扩展应在 extension.json 中的命名空间定义中添加 "conditional": true,并在该处为 CanonicalNamespaces 钩子注册一个处理器,由该处理器决定是否注册命名空间。
钩子处理器应仅更改其被调用时传入的$namespaces;命名空间的所有其他设置仍应在extension.json中注册。
如果这些设置也应该是动态的,请不要在CanonicalNamespaces钩子处理器中更改$wgContentNamespaces、$wgNamespaceContentModels等(这样做无效——T288819);相反,您必须更早地设置它们,例如在callback中(不要在$wgExtensionFunctions中)。
请注意,将扩展添加到LocalSettings.php并不一定使相关的命名空间常量作为全局变量供其他扩展使用。
内容命名空间
在构建网站统计页面(参见Special:Statistics),MediaWiki使用值存储在数据库来计算总数。 一个典型的总数便是“文章数量”或者叫“内容页面数量”。
一个页面要被认作一篇文章或真内容,必须符合如下条件:
- 在主命名空间或一个内容命名空间
- 非重定向页面
- 至少一个内部链接,如
$wgArticleCountMethod所配置。
创建自定义命名空间以保存其他内容时,最好在配置中指明这一点。 通过$wgContentNamespaces设定一个自定名字空间为内容名字空间。
例如在"LocalSettings.php"文件中加入如下内容:
$wgContentNamespaces[] = 3000;
- 或
$wgContentNamespaces[] = NS_FOO;
MediaWiki现在在会将“Foo”命名空间中的页面视为文章(如果这些页面也满足其余标准),并将在更新站点统计计数器时包括这些页面。
运行维护脚本
当调整配置参数 $wgContentNamespaces 的值时,最好运行 "path/to/maintenance/updateArticleCount.php 或 "path/to/maintenance/initSiteStats.php" 脚本来更新内部统计缓存(参见 手册:维护脚本)。
为什么要自定义命名空间
主要有以下原因:
- 自定义命名空间可用于存放不应显示在搜索结果页上的内容,例如仅用于transclusion的页面。
- 特定名字空间需要额外编辑权限。
- 您可能希望某些命名空间不适用某些限制或默认设置(例如$wgNoFollowNsExceptions)
- 特定内容的统一前缀,且仅可在该命名空间中搜索。
- 如果你是MediaWiki开发者,有时你需要创建一个自定义namespace for your extension(s)。
处理已存在的页面
在存储页面记录时,MediaWiki 使用命名空间的数字索引以及剩余的标题文本。 如果在不存在的命名空间中建立了一个页面,例如“Bar:Some page”,它将被视为主命名空间中名称为“Bar:Some page”的页面。
如果之后建立了“Bar”命名空间则会出现问题:查找“Bar:Some page”页面时,会因为在“Bar”命名空间中不存在“Some page”页面而失败。
您可以使用NamespaceDupes维护脚本来纠正此问题。
它将查找主命名空间中前缀与任何已定义命名空间匹配的页面,并更新其记录。
如果您无法运行维护脚本,那么以下方法可能适用:
- 将出现错误的命名空间从配置文件中注释掉
- 依次将每个错误页面(可以通过Special:PrefixIndex查找)从先前的命名空间中移出,如“Bar:Some page”移动为“Bar2:Some page”。
- 将配置文件恢复原状
- 将移动的页面移回正确的命名空间
移除自定义命名空间
上述问题在自定义命名空间定义被移除时同样会发生:MediaWiki 不再知晓该命名空间的数字索引,从而尝试在主命名空间中搜索所需页面,导致内容无法访问。 这种情况很少见,因为大多数站点不需要移除命名空间,但这确实是一个问题。
| MediaWiki版本: | ≥ 1.43 Gerrit change 1052196 |
您可以使用CleanupTitles维护脚本来纠正此问题。
它将查找任何已不再定义的命名空间中的页面,并更新其记录。
这些页面将被移动到主命名空间,并添加一个类似NS123:的前缀,除非通过脚本参数另行指定。
如上所述,您也可以暂时恢复命名空间配置,然后通过用户界面移动页面(或删除它们)。
重命名自定义命名空间
假设您需要将自定义命名空间“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;
请注意,某些扩展以明文形式存储命名空间名称而非其内部ID,因此需要格外小心处理。 例如:
- Translate扩展会在Translations命名空间下创建带有源页面名称(包含命名空间前缀)的页面,例如,本页面上第117条消息的西班牙语翻译对应的Translations:Manual:Using custom namespaces/117/es。 当您更改命名空间的名称时,可翻译页面should be handled as if they were moved。
避免命名空间冲突
为了避免命名空间冲突,例如,您的命名空间与某个扩展定义的命名空间编号相同,扩展命名空间列表会显示您应避免使用的编号以防止冲突。
在$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 是您想要设置的背景颜色。
然而,除非您的需求非常简单,否则您可能希望支持夜间模式,因为这是现代标准所期望的,并避免由于使用固定颜色而产生的可访问性问题。
详情请参见对维基媒体wiki的深色模式兼容性建议。
您可能还想将选项卡的名称从其默认值(即命名空间的名称)更改为其他名称。 这位于您的系统消息中的MediaWiki:nstab-namespace处。
参见
- Manual:命名空间
- Namespace manager – 正如最初为MW1.6-wikidata及其后续版本所提议的那样。 目前正被OmegaWiki项目使用。
站点管理
扩展
- 分类:命名空间扩展
- Extension:NamespaceManager – 用于管理命名空间
- Extension:BlueSpiceNamespaceManager – 允许您创建自定义命名空间
- Extension:SpecialNamespaces – 这是Extension:跨wiki的一个修改版本,其目的是提供一个特殊页面作为命名空间管理器。
- Extension:Lockdown(封锁) – 控制对命名空间的访问
面向扩展开发者
- Extension namespace registration – 扩展注册的自定义命名空间列表。 如果您为自定义命名空间定义了一个常量,也请在此处列出。