MediaWiki 群发页面重命名

MediaWiki mass page rename

我需要重命名 MediaWiki 中匹配特定模式的所有页面。对于包含 XXXXX 的任何页面,必须将其重命名为 YYYYY。这包括页面内容和页面名称。例如,wiki URL http://wiki.example.org/TfrmXXX_Rates should be renamed to http://wiki.example.org/TfrmYYY_Rates,任何包含 XXXXX 的文本都应替换为 YYYYY。

Replace Text extension不能用于此,因为它只能修改页面内容。我还需要重命名页面以及对它们的所有引用(包括 interwiki 链接)。

我尝试过的是:转储 MySQL 数据库,将所有出现的 XXXX 替换为 YYYY,然后使用修改后的 SQL 脚本删除并重新创建 wiki 数据库,最后 运行 maintenance/rebuildall.php 脚本(由 MediaWiki 提供).

问题是它不起作用。当我搜索关键字时,MediaWiki 会显示一些具有相关页面内容的匹配项。但是当我打开 URL 时,它显示 "no content yet"。我怀疑这样做的原因是某些数据以 PHP 序列化形式存储,并且无法用文本 search/replace.

轻松替换

所以问题是:如何重命名 MediaWiki 数据库中的所有引用,包括内容和页面名称?

Mediawiki 附带了一个 maintenance script 来重命名页面和指向它们的任何链接。您可以 运行 来自 MySQL 的查询来填充名为 /tmp/names.txt:

的文件
SELECT CONCAT(page_title, '|', REPLACE(page_title, 'XXXXX', 'YYYYY')) INTO OUTFILE '/tmp/names.txt' FROM page WHERE page_title LIKE '%XXXXX%';

这会给你这个文件:

TfrmXXX_Rates|TfrmYYY_Rates
TfrmXXX_Other|TformYYY_Other
...

那么你应该可以运行这个命令:

php /path/to/mediawiki/maintenance/moveBatch.php --noredirects /tmp/names.txt

Replace Text extension 应该适用于文本中不是链接的任何其他引用。

我可以完成任务。以下是步骤:

  • 备份你的数据库
  • 执行此操作以导出所有页面名称:

select page_title 从页面进入输出文件“/tmp/pagenames.txt”;

  • 我用一个程序替换了所有需要替换的出现,并构建了另一个格式为
  • 的文本文件

oldXXXname|newXXXname

如果您只需要替换一个单词,miken 的解决方案同样不错。如果需要替换XXX_1 XXX_2 XXX等互为前缀的词,那么就需要为此写一个程序,注意select替换的顺序,这样就不会'互相冲突。

  • 然后运行

    php mediawiki/maintenance/moveBatch.php --noredirects /tmp/constructed.txt

  • 然后使用这种SQL替换所有其他文本引用:

    使用wiki_db; 开始; 更新文本集 old_text = 替换(替换(....替换( 转换(old_text 使用 utf8 ), 'XXX_1', 'YYYY' ), 'XXX_2', 'YYYY' ), 'XXX_3', 'YYYY' ... ), 'XXXX_2', 'YYYY_or_whatever' );

  • 最后,运行

    php mediawiki/maintenance/rebuildall.php

我没有接受miken的回答,只是因为它只是解决了一半。