0

假设我的 MediaWiki 中有一个模板,例如

<includeonly>

<div id="custom-person">

* <span>Birthday:</span> {{#if: {{{birth date|}}} | <b>{{#ol-time:|{{{birth date}}}}}</b> | — }}
{{#if: {{{full name|}}} | * <span>full name:</span> <b>{{{full name}}}</b>}}
{{#if: {{{birth place|}}} | * <span>birth place:</span> <b>{{{birth place}}}</b>}}
{{#if: {{{age|}}} | * <span> age:</span> <b>{{{age}}}</b>}}
{{#if: {{{nationality|}}} | * <span> nationality:</span> <b>{{{nationality}}}</b>}}

<div class="clear"></div>

</div>

[[Category:Person]]

__NOTOC__

</includeonly>

所有这些页面都在一个命名空间 (0) 中。

我需要使用此模板中的数据生成头部元标记。

我想出了如何过滤这样的页面并在我的 SkinPerson.php 中添加标题标签

if ( $out->getTitle()->getNamespace() == 0 ) {
    $out->addMeta( "description", $out->getPageTitle());
    $out->addHeadItem( 'og:description', '<meta property="og:description" content="' . $out->getPageTitle() . '">');
}

但我真的很想知道如何插入像 {{{full name}}} + {{{age}}} 这样的 'og:description' 标签?

4

1 回答 1

0

这根本不可能,我想知道您在这里的用例是什么,为什么要这样做。首先是一些解释,为什么这不可能以您想要的方式实现:

模板由我们称为 Parser 的软件评估。解析器正在生成您的 wikitext 的 html 表示,包括所有模板等。然后将结果保存在 ParserOutput 中,并可能缓存在 ParserCache 中(因此不是每次都需要再次解析)。

但是,您要添加头部项目的皮肤直接使用解析器的输出,因此它不再真正了解 wikitext(包括模板参数),而且确实不应该。

您想要实现的一种可能的解决方案可能是通过提供标签扩展来扩展 wikitext 标记语言,在解析 wikitext 期间对其进行解析,并将头部项目的值保存在数据库中。在页面输出期间,您可以再次从数据库中检索这些值,并将它们添加到您想要的头部项目中。在文档中查看更多信息。

除了数据库之外,可能还有其他方法可以将信息从解析时间获取到输出时间,我不知道。

于 2019-12-08T16:31:04.107 回答