MediaWiki导入编辑归属重分配问题及脚本修改咨询
解决MediaWiki编辑归属重分配问题的自定义维护脚本方案
核心思路
官方工具(reassignEdits.php、RenameUser扩展等)要求源用户是系统内的合法账号,而「imported>Username」属于导入生成的非法用户名,不在user表中,所以直接通过自定义脚本操作关联数据库字段是最可行的方案。
具体实现步骤
MediaWiki中编辑归属主要关联三个表:revision(当前修订)、archive(归档修订)、logging(操作日志),需要更新这些表中对应字段的用户信息。以下是可直接复用的自定义维护脚本框架:
1. 编写自定义维护脚本
创建reassignImportedEdits.php文件,放在MediaWiki的maintenance目录下:
<?php require_once __DIR__ . '/Maintenance.php'; class ReassignImportedEdits extends Maintenance { public function __construct() { parent::__construct(); $this->addOption( 'old-name', '原导入用户名(如 imported>Username)', true, true ); $this->addOption( 'new-name', '目标真实用户名(已注册)', true, true ); $this->requireExtension( 'Title' ); // 确保加载必要组件 } public function execute() { $oldUserText = $this->getOption( 'old-name' ); $newUserText = $this->getOption( 'new-name' ); // 验证目标用户存在 $newUser = User::newFromName( $newUserText ); if ( !$newUser || !$newUser->getId() ) { $this->error( "目标用户 $newUserText 不存在,请先注册", 1 ); } $newUserId = $newUser->getId(); $dbw = $this->getDB( DB_PRIMARY ); // 更新revision表 $revUpdated = $dbw->update( 'revision', [ 'rev_user' => $newUserId, 'rev_user_text' => $newUserText ], [ 'rev_user_text' => $oldUserText ], __METHOD__ ); $this->output( "更新revision表:$revUpdated 条记录\n" ); // 更新archive表 $arUpdated = $dbw->update( 'archive', [ 'ar_user' => $newUserId, 'ar_user_text' => $newUserText ], [ 'ar_user_text' => $oldUserText ], __METHOD__ ); $this->output( "更新archive表:$arUpdated 条记录\n" ); // 更新logging表 $logUpdated = $dbw->update( 'logging', [ 'log_user' => $newUserId, 'log_user_text' => $newUserText ], [ 'log_user_text' => $oldUserText ], __METHOD__ ); $this->output( "更新logging表:$logUpdated 条记录\n" ); // 刷新页面缓存(可选,确保前端显示更新) $this->output( "开始刷新相关页面缓存...\n" ); $res = $dbw->select( 'revision', 'DISTINCT rev_page', [ 'rev_user_text' => $newUserText ] ); foreach ( $res as $row ) { $title = Title::newFromID( $row->rev_page ); if ( $title ) { $title->invalidateCache(); } } $this->output( "操作完成!\n" ); } } $maintClass = ReassignImportedEdits::class; require_once RUN_MAINTENANCE_IF_MAIN;
2. 执行脚本
在服务器上通过命令行运行:
cd /path/to/your/mediawiki/maintenance php reassignImportedEdits.php --old-name="imported>JohnDoe" --new-name="JohnDoe"
关键注意事项
- 先备份数据库:操作前务必全量备份MediaWiki数据库,避免数据损坏。
- 测试环境验证:先在测试站点运行脚本,确认无误后再操作生产环境。
- 批量处理优化:如果需要处理多个用户,可以修改脚本添加批量映射功能(比如读取CSV文件或数组),循环处理每条用户映射。
- 权限问题:确保执行脚本的用户(如www-data)有数据库读写权限,且MediaWiki目录有写入权限(用于缓存刷新)。
为什么之前的方法失败
reassignEdits.php:要求源用户是user表中存在的合法账号,「imported>Username」不符合,直接被拒绝。createAndPromote.php:MediaWiki用户名不允许包含>等特殊字符,无法创建对应账号。- RenameUser/ReassignEdits扩展:核心逻辑依赖合法用户的ID和名称校验,非法用户名无法通过前置校验。
内容的提问来源于stack exchange,提问作者Romain Reboulleau
相关产品推荐
相关产品推荐

