Jump to content

手册:使用自定义命名空间

本頁使用了標題或全文手工轉換
From mediawiki.org
This page is a translated version of the page Manual:Using custom namespaces and the translation is 100% complete.

除了内置的命名空间外,也可以为MediaWiki的安装添加自定义命名空间,以进一步分离内容并允许更多的逻辑组织。

自定义命名空间可以使用 $wgExtraNamespaces 配置指令简单管理。 也可以使用 $wgNamespaceAliases 配置指令为自定义(以及预定义的)命名空间定义别名。 有些拓展会使创建自定义命名空间变得容易。 例如NamespaceManager 和BlueSpiceNamespaceManager 。

建议在操作命名空间之前确保作业队列中没有挂起的作业,以避免此类作业的目标页面所在的命名空间恰好是您将要删除或重命名的命名空间,从而导致失败。 使用runJobs.php 运行所有挂起的作业,并在操作命名空间配置之前清除作业队列。

创建自定义命名空间

在"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的数字是为系统管理员保留的,以定义他们的自定义命名空间。 (并且,你也要避免任何命名空间的名称与扩展默认命名空间内的冲突。)
偶数,然后奇数
注意在上面的例子中,命名空间的索引是3000。
同时创建讨论命名空间
您通常会为每个自定义命名空间创建一个讨论“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使用值存储在数据库来计算总数。 一个典型的总数便是“文章数量”或者叫“内容页面数量”。

一个页面要被认作一篇文章或真内容,必须符合如下条件:

创建自定义命名空间以保存其他内容时,最好在配置中指明这一点。 通过$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 维护脚本来纠正此问题。 它将查找主命名空间中前缀与任何已定义命名空间匹配的页面,并更新其记录。

如果您无法运行维护脚本,那么以下方法可能适用:

  1. 将出现错误的命名空间从配置文件中注释掉
  2. 依次将每个错误页面(可以通过Special:PrefixIndex查找)从先前的命名空间中移出,如“Bar:Some page”移动为“Bar2:Some page”。
  3. 将配置文件恢复原状
  4. 将移动的页面移回正确的命名空间

移除自定义命名空间

上述问题在自定义命名空间定义被移除时同样会发生: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,因此需要格外小心处理。 例如:

避免命名空间冲突

为了避免命名空间冲突,例如,您的命名空间与某个扩展定义的命名空间编号相同,扩展命名空间列表会显示您应避免使用的编号以防止冲突。

在$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处。

参见

站点管理

扩展

面向扩展开发者