Skip to content

Repository files navigation

PageLike

给 MediaWiki 页面加一个简单的点赞按钮。

PageLike 会记录登录用户对页面的点赞状态,并提供点赞数和排行榜 API。扩展自带一个红心按钮,也可以关闭默认界面,换成站点自己的样式。

功能

  • 登录用户可以点赞或取消点赞,重复请求不会产生重复记录
  • 匿名用户和临时账户可以查看点赞数,但不能点赞
  • 安装 Echo 时,页面获得新点赞会通知页面创建者;同一用户对同一页面最多通知一次(不通知自赞或匿名创建者)
  • 可选的 7 天、30 天和全部时间排行榜(默认关闭)
  • 可按命名空间启用,并可在单个页面上关闭
  • 提供 Action API,方便小工具、模板和自定义前端调用
  • 页面删除时自动清理对应的点赞记录
  • 不公开点赞用户列表,也不会为普通点赞写公共日志

环境要求

  • MediaWiki 1.45.1
  • PHP 8.2 或 8.3
  • MySQL 或 MariaDB(目前主要在 MariaDB 10.11 上测试)

Echo 是可选依赖;只有创建者通知需要 Echo。没有 Echo 时,点赞、计数、按钮和排行榜仍可正常使用。

安装

在 MediaWiki 根目录执行:

cd extensions
git clone https://github.com/YukkuriB/PageLike.git

然后在 LocalSettings.php 中加载 PageLike:

wfLoadExtension( 'PageLike' );

如果需要创建者获赞通知,请安装与 MediaWiki 1.45 兼容的 Echo,并在 PageLike 之前加载:

wfLoadExtension( 'Echo' );
wfLoadExtension( 'PageLike' );

最后运行数据库更新:

php maintenance/run.php update --quick

安装完成后,主命名空间的页面底部会出现点赞按钮。

配置

PageLike 默认即可使用。下面列出的是内置默认值,只有需要修改时才需要写进 LocalSettings.php

$wgPageLikeEnabled = true;
$wgPageLikeEnableWrites = true;
$wgPageLikeEnableRanking = false;
$wgPageLikeShowDefaultButton = true;
$wgPageLikeAllowedNamespaces = [ NS_MAIN ];

普通登录用户默认拥有 pagelike 权限。如果只想让特定用户组点赞,可以覆盖组权限:

$wgGroupPermissions['user']['pagelike'] = false;
$wgGroupPermissions['sysop']['pagelike'] = true;

排行榜默认关闭。确认站点已配置能跨请求复用的持久化主缓存,并用代表性数据评估聚合查询负载后,可以启用:

$wgPageLikeEnableRanking = true;

安装 Echo 后,页面创建者的站内通知默认开启,邮件通知默认关闭;用户可以在通知偏好中分别调整。只有真正新增的点赞会尝试触发通知,同一用户对同一页面最多通知一次,取消后重新点赞也不会重复通知。未安装 Echo 时会安全跳过通知,不影响其他功能。

为了防止反复取消和点赞刷屏,PageLike 会在第一次有效通知尝试时保存页面 ID 与点赞用户 ID 的内部去重标记。取消点赞会删除当前点赞状态,但不会删除该标记;标记不通过 API 或界面公开。页面删除、用户数据删除和孤儿清理会同步删除相关标记。

排行榜会把原始候选结果缓存最多 60 秒。在 CACHE_NONE 下,该缓存无法跨请求命中,每次排行榜 API 请求都会重新执行计数、分组和排序聚合。公开站点在没有持久化主缓存时应保持排行榜关闭。每个命名用户 10 次/60 秒的 MediaWiki 标准 RateLimit 使用独立的 MicroStash;生产多节点部署必须确保所有应用实例共享一个能在完整 TTL 内可靠保存计数的 MicroStash。

在单个页面上关闭点赞

在页面源码中加入以下任一标记:

__NOPAGELIKE__
__关闭点赞__

标记也会通过模板转入。如果刚添加标记但页面仍显示按钮,清除该页面的解析器缓存即可。

API

读取页面状态:

GET api.php?action=query&prop=pagelikeinfo&pageids=123&format=json&formatversion=2

响应中的 liked 表示当前用户是否已点赞,count 是点赞数,canlike 表示当前用户是否可以操作。

点赞或取消点赞需要 CSRF token:

POST api.php
action=pagelike&pageid=123&set=1&token=<csrf>&format=json&formatversion=2

set=1 为点赞,set=0 为取消点赞。

启用排行榜后,可以这样查询:

GET api.php?action=query&list=pagelikerank&plrperiod=7d&plrlimit=10&format=json&formatversion=2

plrperiod 可选 7d30dallplrlimit 最大为 100。在有效的持久化主缓存下,排行榜原始候选结果最多缓存 60 秒。

自定义外观

默认按钮可以通过 CSS 变量调整,例如在 MediaWiki:Common.css 中加入:

.ext-pagelike {
	--pagelike-active-color: #ff4d78;
	--pagelike-background: color-mix(in srgb, currentcolor 8%, transparent);
	--pagelike-radius: 0.75rem;
}

如果想完全使用自己的按钮,可以关闭默认界面:

$wgPageLikeShowDefaultButton = false;

扩展仍会输出 .ext-pagelike 挂载点。点赞状态改变后还会触发 ext.pageLike.changed hook,事件对象包含 rootpageIdlikedcount

维护

清理已经不存在的页面或用户所留下的点赞及通知去重记录:

php extensions/PageLike/maintenance/PrunePageLikes.php --dry-run
php extensions/PageLike/maintenance/PrunePageLikes.php

删除指定用户的全部点赞及通知去重记录:

php extensions/PageLike/maintenance/DeleteUserLikes.php --user-id=123 --dry-run
php extensions/PageLike/maintenance/DeleteUserLikes.php --user-id=123

两个脚本都支持 --batch-size。建议先使用 --dry-run 查看影响范围。

开发与测试

测试需要一个包含 Composer 开发依赖的 MediaWiki 源码树,并将本仓库放在 extensions/PageLike

php tests/phpunit/phpunit.php extensions/PageLike/tests/phpunit/
php maintenance/run.php validateRegistrationFile extensions/PageLike/extension.json
php maintenance/run.php generateSchemaSql --validate \
  --json extensions/PageLike/sql/tables.json --type mysql

前端测试可在本地测试配置中启用 $wgEnableJavaScriptTest = true,然后访问 Special:JavaScriptTest?component=PageLike

许可证

GPL-2.0-or-later

About

A lightweight per-page like extension for MediaWiki 1.45.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages