Jump to content
本页使用了标题或全文手工转换
开往-友链接力

使用笔记/杂项篇

该页面的编辑正在进行中。 讨论

请帮助我们扩充或改进这篇文章。

这篇介绍一些没有具体主题的小点。

邮件发送 

如果你没有一个正经的付过费的域名和企业邮箱,那么事情会变得异常麻烦。你要自己搭建邮件服务器,如果是免费域名和其他特定域名还得遭受被拒收的痛苦。自己搭建的邮件服务器也会出现被他人不当利用的问题,实在是很难办。

因此,还是建议你去搞一个企业邮箱和一个正经域名,然后按照手册填写参数。

如果你没有企业邮箱,那么其实解决方案也很简单(但不靠谱)用你的个人邮箱。像你登录你自己邮箱的时候要填写的参数一样,把这些参数填上,然后邮件就会神奇地通过你的邮箱发送出去前提是你在账户设置里面“允许本次异地登录”。除了你的个人邮箱会被不当利用的风险以外,好像也没啥。比如我站被100多位垃圾用户注册

个人邮箱在近期已经越来越无法通过该方式使用,因为大部分商业邮箱为了“安全性”开始放弃基本验证,转而要求使用OAuth。Outlook.com即便使用应用密码也将无法由MediaWiki通过基本验证登录。

SVG 

总之SVG缩略图会出问题,不知道为什么。有的时候这和PHP禁用函数有关,有的时候和shell locale有关,有的时候和你上传的SVG有问题有关。这类问题需要具体问题具体分析去解决,主要取决于看具体的报错信息。

PHP禁用函数请自行查阅相关的文档,比如面板的话可能会提供相关选项,而最终禁用函数设置都会在php.ini里面。

Shell的语言与各大发行版有关,也请自行查阅如何配置Locale和生成Locale。

有的svg文件可能不符合规范,导致计算出来的缩略图与原图不符。这种情况只能怪svg自己。

好用的Gadget

从各大wiki上搬。维基百科有很多。我站的Special:Gadgets也可以看着搬。

Gadget有时会依赖其他Gadget。有的Gadget的dependencies里面会指定类似于ext.gadget.<小工具名>的,这个时候要注意搬运完全。

好懒我不想搬运模板怎么办

首先wiki不能懒,不然不会有长进。

然后呢,这里有一个$wgEnableScaryTranscluding。这是干什么的呢?没错,只要你的Interwiki设置的iw_trans有设置,那么就可以通过跨wiki链接的方式调用页面了!

听上去好棒哦。但是首先并不是能调用模板这么简单,其次你的服务器会爆炸(高开销)。所以别想着偷懒啦。

其次,善用Special:ExportSpecial:Import

LuaSandbox

LuaSandbox是一个PHP扩展程序。简单来说,模块引擎切换到它会变快。

如果你使用的是宝塔面板,那么很遗憾宝塔面板的PHP不支持自动安装这个扩展程序。你需要查阅官网的资料手动编译然后安装到宝塔安装的PHP的对应目录里面去,然后再启用。如果不是面板的话按照文档来即可。

修改扩展程序生成的HTML结构

如果你有基础的英文能力,那么把代码当作英文去读,就能找到生成HTML的地方。

比如扩展管理员链接,自带的页面Special:AdminLinks实在是太丑了,我就想着写一个CSSJS对其做一个彻底改造!

但是原本生成的页面一个class都没有写什么CSS啊……(直接按次序选择元素是不好的。)

所以我就想着,我让这个扩展生成的元素带上class,不就好做了!于是我就去几个php文件里面找了找,发现生成HTML的地方还算良心,有好几处是简单的字符串拼接。我就直接拼上去了class。

但是有一个class有点难啃,用了一个MediaWiki自带的LinkRenderer。生成链接的第三个参数是标签的HTML attribute,我就这么改了。以下代码是旧版的,新版只需要按照类似的方法把makeKnownLink等方法的第三个参数塞上一个代表HTML attribute的array就行。

/**
  * Helper function for backward compatibility.
  *
  * @param LinkTarget|Title $title
  * @param string|null $msg Must be HTML escaped already
  * @param array $attrs
  * @param array $params Query parameters
  * @return string
  */
public static function makeLink( $title, $msg = null, $attrs = array(), $params = array() ) {
	$linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
	if ( $msg !== null ) {
		$html = new HtmlArmor( $msg );
	} else {
		// null
		$html = $msg;
	}
	$attrs['class'] = 'adminlinks adminlinks-' . $title;
	return $linkRenderer->makeKnownLink( $title, $html, $attrs, $params );
}

事情瞬间好了起来,我写了一些CSS和JS之后,这个特殊页面就能和Fandom的管理员控制面板相媲美了,真棒!

我修改的也包括SimpleBlogPage的一些结构。

有些项目页面比如隐私政策这种怎么办

抄。反正你自己大概是不会写了。或者建议找律师。不在意的话也许可以找GPT。

抄也要注意wiki实际,不要抄的和实际wiki情况不符。

前端有什么参考手册吗

有,MDN Web Docs(简称MDN,全称为Mozilla开发者网络)。点击这里查看MDN学习区

统计数据不更新怎么办

编写定时任务,让合适的系统用户执行php /path/to/mediawiki/maintenance/updateSpecialPages.php(新版本注意使用run.php实现)。/path/to/mediawiki/请换成实际的路径。

此方法一般只用于大型wiki农场,因为这类网站的缓存周期与系统默认不同。但是如果遇到了这种bug,这么做也没问题。

格式指导怎么写

相当一部分可以抄。

具体来说,标点符号用法、书面汉语指导,以及一些基础的模板排布都可以借鉴着写。

格式指导要与你wiki的实际内容相适应。如果不太清楚怎么写的话,也许你应该先扩充内容。

如何开发皮肤

开发MediaWiki皮肤在1.36版本后不再必须掌握PHP。只需要会CSS和一些Mustache语法就行。

有两种方式入手,一是下载示例皮肤(GitHub),一是使用皮肤实验室工具。后者更具有互动性,也更能帮助你了解皮肤的制作流程。

当然啦,你也可以参考我的皮肤Lakeus,它就是用后者生成并修改的。

皮肤制作的常见问题反正也就那些,基本上你会遇到这些问题:

LESS与MediaWiki预处理

你可能不是很熟悉LESS。我也不熟悉。但是,使用预处理器可以节省时间增加效率,也还是推荐了解一下LESS的语法以及常见命名规则,不然就会像Lakeus一样,命名十分混乱。

在自己的wiki上尝试皮肤,如果你的样式代码有问题,可能会出现一点皮肤样式都不加载的情况。打开开发者工具,找到对应的样式文件请求,就可以看到报错。或者,你也可以使用Node安装LESS工具,本地编译一下看看有什么问题。

MediaWiki还会帮你自动在界面使用RTL语言(从右向左书写的语言,比如阿拉伯语)的情况下,把你样式中的左右都颠倒一下。如果你的样式表的一些部分是单独对RTL(从右向左书写)处理的,可以这样绕过这个特性:

.rtl .toggle-list__list {
  /* @noflip */
  left: initial;
  /* @noflip */
  right: 0;
  top: 0;
  bottom: 0;
  /* @noflip */
  transform: translateX( 100% );
}

如果你打算使用CSS变量,那么我建议在单独的文件里面写好CSS变量在:root里面的声明,然后把对应的LESS变量赋值为var()函数去调用CSS变量,在皮肤编写的时候使用LESS变量,通过import去加载对应的变量声明。这里也可以参考Lakeus。

自己想要的数据没有提供/想更改Mustache传入的数据

你需要掌握一定的PHP以实现该效果。具体可以参考我的皮肤。

我的皮肤使用PHP的地方主要是三点:解析包含参数的界面文本(比如根据传入的数字改变显示单词的单复数),在Mustache模板中动态插入HTML,和读取本地设置。

你也可以使用SkinJson皮肤查看默认传入Mustache的数据。可以根据这些来自行读取处理和覆写相关数据。以“is-”开头的都是布尔型,“array-”开头的都是数组型,“data-”开头的都是对象型,“html-”开头的是你准备插入的HTML,“msg-”开头的是系统消息(界面文本)。

开启皮肤的响应式设计

如果你的皮肤打算支持响应式设计,请在你的skin.json中找到并更改成类似下面的片段:

{
    "ValidSkinNames": {
        "my-responsive-skin": {
            "class": "SkinMustache",
            "args": [
                {
                   "name": "my-responsive-skin",
                   "responsive": true
                }
            ]
        }
    }
}

皮肤特性

在你皮肤的ResourceLoader模块中,可以设置features字段,但是它可以设置的内容比皮肤模板给出的要多。具体支持哪些请见Wikimedia的文档,或者参考Lakeus。不开启这些特性可能会使你的皮肤缺失一些大部分皮肤应当有的功能。

当然,这些皮肤特性实际上都是对应原版MediaWiki的resources目录下的一些预制CSS/LESS/JS。如果你不满意自带的东西,你当然可以另起炉灶,做完后关闭对应的皮肤特性。

你会发现MediaWiki真的自带了很多的CSS/LESS/JS。要学会利用它们。

扩展程序兼容性

官网说“应当是扩展程序去支持皮肤而非反过来”,但是作为你的皮肤,你当然可以获得主动权。通过skinStyles就可以为其他扩展自己做适配了。此处也参考Lakeus和Citizen,一个是目录,一个是ResourceModuleSkinStyles

也有的扩展程序真的需要他人适配,比如SocialProfile的头像部分。

z-index

示例皮肤的z-index其实没有按照MediaWiki的z-index规范。按照规范修改有助于扩展程序的兼容性。

同样,你自己设计的皮肤元素之间也有可能打架。要时刻注意。

你可能会遇到的z-index问题包括Echo的通知,WikiEditor的编辑栏,以及页面内一些有语法高亮的代码块。

z-index自己的规则我就不赘述了,建议多读读文档。

开启了变体转换,但是搜索引擎收录的和变体菜单内的链接都很长

如果你希望自己的站点在点击变体菜单时的格式和维基百科的一样简洁,请参考下面的步骤。

首先,你应该已经设置过了$wgArticlePath(文章路径)。变体链接和此变量的设置差不多,只是变量名是$wgVariantArticlePath,并且多了一个参数用于区分变体。

设置$wgVariantArticlePath = "/$2/$1";,意味着变体链接的格式为/<变体代码>/<页面名>。和你设置文章路径时一样,你需要更改网页服务器的伪静态设置。以Nginx为例,在Nginx配置文件中加入以下代码到合适的位置:

location ~ ^/(zh|zh-hans|zh-hant|zh-cn|zh-tw|zh-hk|zh-mo|zh-my|zh-sg) {
  rewrite ^/(zh|zh-hans|zh-hant|zh-cn|zh-tw|zh-hk|zh-mo|zh-my|zh-sg)/([^?]*)(?:\?(.*))? /index.php?variant=$1&title=$2&$3 last;
}

设置得当,一切就绪。

如何繁简转换<code>等HTML标签内的文字

默认情况下,由于源代码一般要保留其原始文本,MediaWiki不会转换相关的内容(比如<code><pre>内的文本)。如果需要转换,可以在标签内部的开头添加-{}-

比如,源代码内有以下内容:

{{cd|#''<命名空间>'':''<名字>''}}函数的文件名对应<code>data/''<命名空间>''/''<名字>''.mcfunction</code>。

则改写成:

{{cd|-{}-#''<命名空间>'':''<名字>''}}函数的文件名对应<code>-{}-data/''<命名空间>''/''<名字>''.mcfunction</code>。

比较特别的是,以空格(以下用 表示)开始的段落,MediaWiki会自动将这个段落包裹上<pre>。比如,源代码内有以下内容:

 '''[[命令/scoreboard|scoreboard]] objectives''' add <记分项> <准则> [<显示名称>]

则改写成:

 -{}-'''[[命令/scoreboard|scoreboard]] objectives''' add <记分项> <准则> [<显示名称>]

请注意,有的长得像的标签(比如<syntaxhighlight>)并不是HTML标签,而是解析器扩展标签。这些标签并不适用以上方法,反而会在最终页面中展示-{}-。目前没有很好的方法让其中的内容跟随页面变体(如果实在需要转换,可以参考wzh:Template:lan,让一部分内容跟随界面语言显示)。

想让过滤器更改推送至最近更改

请向LocalSettings.php添加unset($wgLogRestrictions['abusefilter']);

我能向这里补充内容吗

当然可以。不过如果自己不太确定的话,可以在讨论页说明。

Cookies help us deliver our services. By using our services, you agree to our use of cookies.