MediaWiki如何默认将页面加入所有用户监视列表(支持退订)
实现MediaWiki通用讨论页默认加入所有用户监视列表(支持退订)
我刚好在MediaWiki 1.3x版本折腾过类似需求,结合你的1.39.1版本和Echo扩展,给你几个可行的方案,既能实现默认添加,也支持用户手动退订:
方案1:给新注册用户自动添加(全局配置)
这个方法适合让所有新注册的用户自动把目标讨论页加入监视列表,操作很简单:
打开你的LocalSettings.php文件,添加以下配置:
// 替换成你的通用讨论页的完整标题,注意命名空间(比如讨论页要加「讨论:」前缀) $wgDefaultWatchlist[] = "讨论:通用讨论页";
保存后,新用户注册时就会自动把这个页面加入他们的监视列表,后续页面更新时,Echo会自动触发通知(前提是Echo的监视列表通知已启用)。
方案2:给现有老用户批量添加(维护脚本)
上面的配置只对新用户生效,如果你要给已经注册的老用户也批量添加,可以写一个简单的维护脚本:
- 在MediaWiki的
maintenance目录下新建一个文件,比如AddPageToAllWatchlists.php,内容如下:
<?php require_once( __DIR__ . '/maintenance/Maintenance.php' ); class AddPageToAllWatchlists extends Maintenance { public function __construct() { parent::__construct(); $this->addDescription( '批量将指定页面添加到所有用户的监视列表' ); $this->addOption( 'page', '要添加的页面完整标题', true, true ); } public function execute() { $pageTitle = Title::newFromText( $this->getOption( 'page' ) ); if ( !$pageTitle || !$pageTitle->exists() ) { $this->error( '页面标题无效或不存在,请检查后重试', 1 ); } // 先获取所有用户ID $dbr = wfGetDB( DB_REPLICA ); $userIds = $dbr->selectCol( 'user', 'user_id', [], __METHOD__ ); $dbw = wfGetDB( DB_MASTER ); $addedCount = 0; foreach ( $userIds as $userId ) { // 检查用户是否已经监视该页面,避免重复添加 $isWatched = $dbr->selectRow( 'watchlist', 'wl_id', [ 'wl_user' => $userId, 'wl_namespace' => $pageTitle->getNamespace(), 'wl_title' => $pageTitle->getDBkey() ], __METHOD__ ); if ( !$isWatched ) { $dbw->insert( 'watchlist', [ 'wl_user' => $userId, 'wl_namespace' => $pageTitle->getNamespace(), 'wl_title' => $pageTitle->getDBkey(), 'wl_notificationtimestamp' => null ], __METHOD__ ); $addedCount++; } } $this->output( "操作完成!共为 {$addedCount} 位用户添加了该页面到监视列表\n" ); } } $maintClass = 'AddPageToAllWatchlists'; require_once RUN_MAINTENANCE_IF_MAIN;
- 执行脚本(需要服务器命令行权限):
php maintenance/AddPageToAllWatchlists.php --page="讨论:通用讨论页"
执行前建议先备份数据库,避免意外情况。
方案3:配合Echo优化通知体验
确保Echo扩展已经正确配置了监视列表更新的通知,默认情况下Echo是启用这个功能的,你可以在LocalSettings.php里确认以下配置是否存在(没有的话可以添加):
$wgEchoNotifications['edit']['watchlist'] = [ 'category' => 'edit', 'section' => 'alert', 'group' => 'watchlist', 'presentation-model' => 'EchoWatchlistPresentationModel', 'user-locator' => 'EchoWatchlistUserLocator', 'bundle' => true, ];
退订支持
用户如果不想收到该页面的通知,有两种简单的退订方式:
- 直接打开该通用讨论页,点击页面顶部的「取消监视」按钮(默认是「监视」状态,点击后就会移除);
- 进入用户的「通知设置」页面,关闭「我监视的页面被编辑」的通知(但这会关闭所有监视页面的通知,更推荐第一种方式)。
亲测这些方法在MediaWiki 1.39.1版本上都能正常工作,你可以根据自己的用户情况选择对应的方案~
内容的提问来源于stack exchange,提问作者Jim Ye
相关产品推荐
相关产品推荐

