MediaWiki扩展开发:自动添加文章文本的钩子函数问题求助
解决MediaWiki扩展自动添加分类的问题
问题根源分析
1. MultiContentSave钩子失效原因
你创建了新的WikitextContent对象,但没有将修改后的内容替换回修订版的Slot中,所以所有修改都不会被保存。此外,MultiContentSave钩子主要用于处理渲染后的内容,并非修改原始编辑内容的最佳选择。
2. PageSaveComplete钩子无限循环原因
你在页面保存完成后再次调用saveRevision,这会触发新一轮的页面保存流程,进而再次触发PageSaveComplete钩子,形成无限循环,最终导致内存耗尽。
正确实现方案
推荐使用PageContentSave钩子,该钩子在内容保存前触发,适合修改编辑内容且不会引发循环问题。
1. 注册钩子(extension.json)
"Hooks": { "PageContentSave": [ "YourExtensionClass::onPageContentSave" ] }
2. 钩子实现代码
public static function onPageContentSave( WikiPage $wikiPage, UserIdentity $user, Content &$content, CommentStoreComment $summary, $flags, Status &$status ) { // 仅处理维基文本类型的内容 if ( !$content instanceof WikitextContent ) { return true; } $text = $content->getText(); // 检查是否已存在目标分类,避免重复添加 if ( strpos( $text, '[[Category:TBD]]' ) !== false ) { return true; } // 在内容末尾添加分类(换行符避免和原内容粘连) $newText = $text . "\n[[Category:TBD]]"; $content = WikitextContent::newFromText( $newText ); return true; }
关键细节说明
- 使用
&$content引用传递,直接修改原内容对象,确保修改被保存 - 添加分类前检查是否已存在,防止重复插入
- 仅处理维基文本内容,兼容其他类型页面(如表单、可视化编辑内容)
内容的提问来源于stack exchange,提问作者pipocaDourada
相关产品推荐
相关产品推荐

