You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 09:43:38