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

MediaWiki如何默认将页面加入所有用户监视列表(支持退订)

实现MediaWiki通用讨论页默认加入所有用户监视列表(支持退订)

我刚好在MediaWiki 1.3x版本折腾过类似需求,结合你的1.39.1版本和Echo扩展,给你几个可行的方案,既能实现默认添加,也支持用户手动退订:

方案1:给新注册用户自动添加(全局配置)

这个方法适合让所有新注册的用户自动把目标讨论页加入监视列表,操作很简单:

打开你的LocalSettings.php文件,添加以下配置:

// 替换成你的通用讨论页的完整标题,注意命名空间(比如讨论页要加「讨论:」前缀)
$wgDefaultWatchlist[] = "讨论:通用讨论页";

保存后,新用户注册时就会自动把这个页面加入他们的监视列表,后续页面更新时,Echo会自动触发通知(前提是Echo的监视列表通知已启用)。

方案2:给现有老用户批量添加(维护脚本)

上面的配置只对新用户生效,如果你要给已经注册的老用户也批量添加,可以写一个简单的维护脚本:

  1. 在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;
  1. 执行脚本(需要服务器命令行权限):
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,
];

退订支持

用户如果不想收到该页面的通知,有两种简单的退订方式:

  1. 直接打开该通用讨论页,点击页面顶部的「取消监视」按钮(默认是「监视」状态,点击后就会移除);
  2. 进入用户的「通知设置」页面,关闭「我监视的页面被编辑」的通知(但这会关闭所有监视页面的通知,更推荐第一种方式)。

亲测这些方法在MediaWiki 1.39.1版本上都能正常工作,你可以根据自己的用户情况选择对应的方案~

内容的提问来源于stack exchange,提问作者Jim Ye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:01:45