扩展:PageTriage
![]() 發佈狀態: 穩定版本 |
|
---|---|
![]() |
|
实现 | 特殊页面 , 用户界面 |
描述 | Facilitates reviewing and approving new pages |
作者 | Ryan Kaldari, Benny Situ |
兼容性政策 | 快照跟随MediaWiki发布。 master分支不向後兼容。 |
MediaWiki | >= 1.39.0 |
数据库更改 | 是 |
表 | pagetriage_log pagetriage_page pagetriage_page_tags pagetriage_tags |
许可协议 | MIT授權條款 |
下載 | |
示例 | Special:NewPagesFeed on the English Wikipedia |
|
|
|
|
Quarterly downloads | 23 (Ranked 145th) |
翻譯PageTriage扩展,若在translatewiki.net可用 | |
問題 | 尚未完成的工作 · 报告錯誤 |
PageTriage is an extension that aims to provide a feature-rich interface for triaging newly-created articles. It is intended to replace the new page patrol core function while adding additional functionality for reviewing, tagging, and improving new articles. It adds a Special:NewPagesFeed page, and a page curation toolbar to new pages for those with the 'patrol' permission. It was developed by the Wikimedia Foundation's Features Engineering team. 额外的详细信息参见页面屏模。
重要提醒:部分配置和代码专为英语维基百科的工作流设计,这意味着本扩展目前几乎不可能国际化。 (参见Phabricator:T50552。)
下载
此扩展可直接从Git检索到 [?]:
- 浏览代码
- 部分扩展有稳定版本标签。
- 浏览标签
- 选择标签
- 点击“快照”
- 每个分支与过去的MediaWiki发布版本相关联。 这里也有一个“主线”分支,包含最新alpha版本(可能需要MediaWiki的alpha版本)。
- 浏览分支
- 选择一个分支名称
- 点击“继续”
提取快照,并将它放置在您的MediaWiki安装副本的extensions/PageTriage/目录中。
如果您对git熟悉,并且拥有您服务器的shell访问权,您也可以通过以下方法获得扩展:
cd extensions/
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/PageTriage.git
Optional dependencies
For full functionality, you'll also need to install 扩展:Echo and 扩展:ORES , although PageTriage works without them.
安裝
- 下载文件,并将其放置在您
extensions/
文件夹中的PageTriage
目录内。 - 将下列代码放置在您的
LocalSettings.php
的底部:wfLoadExtension( 'PageTriage' ); // These two settings are optional, and will enable the Articles-for-Creation mode. $wgExtraNamespaces[118] = 'Draft'; $wgPageTriageDraftNamespaceId = 118;
- 运行更新脚本,它将自动创建此扩展必须依赖的数据库表。
- 完成 – 在您的wiki上导航至Special:Version,以验证已成功安装扩展。
致使用MediaWiki 1.24或更早版本的用户:
上面的说明介绍的是安装此扩展的新方法,它使用wfLoadExtension()
。
如果您需要在早期版本(MediaWiki 1.24和更早版本)中安装此扩展,而不是wfLoadExtension( 'PageTriage' );
,您需要使用:
require_once "$IP/extensions/PageTriage/PageTriage.php";
Cron jobs
To make sure old articles are eventually taken out of the new pages feed, you should set up a cron job to run the following file every 48 hours: cron/updatePageTriageQueue.php
Checking for successful install
To actually see the extension working:
- Create a new page containing just a few sentences of text as an anonymous user.
The new page should appear, flagged as "无分类", "孤立", etc. To see the page curation toolbar:
- Login as a user with the 'sysop' permission, or add a group with the "patrol" permission, and add some user to that group, and login as that user.
- Now you should see a "巡查" button next to the new page.
- Click this and you should see the page curation toolbar on the new page.
扩展配置
The extension is based on the 'patrol' right. For more information about configuring patrolling, see 手册:巡查 .
The following configuration variables can be set from your LocalSettings.php file:
Variable | Default | Description |
---|---|---|
$wgPageTriageEnableCurationToolbar
|
true
|
Set to false to disable the curation toolbar |
$wgPageTriageInfiniteScrolling
|
true
|
Whether or not to use infinite scrolling in the new pages feed |
$wgPageTriageMaxAge
|
90 | The age (in days) at which PageTriage allows unreviewed articles to become indexed by search engines (if $wgPageTriageNoIndexUnreviewedNewArticles is true). |
$wgPageTriageNamespaces
|
NS_MAIN, NS_USER | The namespaces that PageTriage is active in. |
$wgPageTriageNoIndexUnreviewedNewArticles
|
false
|
Set this to true if new, unreviewed articles should be set to noindex. In other words, if they should not be indexed by search engines until they are reviewed. |
有关配置变量的完整列表,请参阅extension.json。
wiki上的配置
It is possible to configure much of PageTriage on-wiki via the pages MediaWiki:PageTriageExternalDeletionTagsOptions.js
and MediaWiki:PageTriageExternalTagsOptions.js
, although the structure of the configuration may change in the future (to better accommodate wikis besides English Wikipedia).
通过查看以下内容,您可以大致了解配置的工作原理:
这两个文件的运行方式大致相同。
There are two top-level jQuery variables that define the curation templates that are listed in the curation toolbar under the (add tags) and (nominate for deletion) buttons. 这些是:
$.pageTriageTagsOptions = {};
$.pageTriageDeletionTagsOptions = { Main: {}, User: {} };
The 'Main' and 'User' refer to the namespace of the page being curated. Each sub-item in the three sets above defines the tabs shown at the left side of the toolbar, and has the following form:
{
label: 'Short title',
desc: 'A longer description.', // Text only, no HTML or Wikitext markup
multiple: false, // Whether more than one of the tags can selected at once.
tags: { tag1 = {}, tag2 = {} }
}
Then the actual templates that are listed are defined under the above tags
variable. Each deletion template has the following form:
{
tag: 'Actual_template_name', // Without the 'Template:' prefix.
label: 'Friendly template title',
desc: 'A longer description.', // Text only, no HTML or Wikitext markup
code: '',
params: {},
anchor: '',
talkpagenotiftopictitle: 'message-name', // The message name (e.g. pagetriage-del-tags-speedy-deletion-nomination-notify-topic-title) used as the section/topic title when posting to the editing user's talk page. Usually, you can reuse one of the existing messages (currently pagetriage-del-tags-speedy-deletion-nomination-notify-topic-title, pagetriage-del-tags-prod-notify-topic-title, pagetriage-del-tags-xfd-notify-topic-title). If you need a new one, file a task so $wgPageTriageDeletionTagsOptionsContentLanguageMessages or the PageTriage repository can be updated.
talkpagenotiftpl: 'Template_name' // The template that will be added to the editing user's talk page, not including the talk page heading (handled by talkpagenotiftopictitle).
}
目前,有些标签必须存在:
$.pageTriageDeletionTagsOptions.Main.xfd.tags.articlefordeletion
示例
So, if you don't want to use any of the built-in deletion templates (which can be imported from NewPagesFeed_Templates.xml, by the way) then you can replace them all with a single one by adding the following at the bottom of your MediaWiki:PageTriageExternalDeletionTagsOptions.js
page:
var deletionSection = {
label: 'Deletion',
desc: 'Nominate for deletion.',
multiple: false,
tags: {
articlefordeletion: {
tag: 'delete',
label: 'Delete',
desc: 'Nominate this page for deletion.',
code: '',
params: {},
anchor: '',
talkpagenotiftopictitle: 'pagetriage-del-tags-xfd-notify-topic-title',
talkpagenotiftpl: 'Deletion notification'
}
}
};
$.pageTriageDeletionTagsOptions = { Main: { xfd: deletionSection }, User: { xfd: deletionSection } };
API
PageTriage adds the following API endpoints which can be used:
API | Description | Type | Triggering action |
---|---|---|---|
pagetriageaction | Mark a page as reviewed or unreviewed, and logs the action in Special:Log. | Write |
|
pagetriagelist | Retrieves the list of pages in the queue, and each page's metadata, including their reviewed status. To retrieve one page, you must provide the page_id . To provide multiple pages, you must select one of showreviewed /showunreviewed , and one of showredirs /showdeleted /showothers , or no pages will be returned.
|
Read |
|
pagetriagestats | Retrieves stats about the number of pages in the queue for use in the header of Special:NewPagesFeed. | Read |
|
pagetriagetagcopyvio | Mark an article as a potential copyright violation, and logs the action in Special:Log. | Write |
|
pagetriagetagging | Add clean-up tags or deletion templates to a page, and logs the action in Special:Log. | Write |
|
Special:Log
The following logs are created by the extension:
Speical:Log | log_type
|
log_action
|
Description | Notes |
---|---|---|---|---|
Page curation log | pagetriage-curation | delete, enqueue, reviewed, tag, unreviewed | Logs deletion tagging, maintenance tagging, marking page as reviewed, marking page as unreviewed | |
Potential copyright violation log | pagetriage-copyvio | insert | Allows a bot to log potential copyright violations | Doesn't display unless you set $wgPageTriageEnableCopyvio to true
|
SQL tables
Name | Prefix | Description | Old entry deletion strategy |
---|---|---|---|
pagetriage_page | ptrp_ | The main table. Log of all pages created after PageTriage was installed. One entry per page. Stores the "mark as reviewed" statuses mentioned above. Also stores the last time a tag was placed on the page by PageTriage. Query ptrp_reviewed > 0 in this table to figure out if a page is marked as reviewed. No entry also means the page is reviewed.
|
All articles deleted once ptrp_reviewed > 0 (marked as reviewed) and older than 30 days. All redirects deleted after 180 days regardless of patrol status.
|
pagetriage_page_tags | ptrpt_ | Stores metadata about pages, to make the filters in the Page Curation toolbar work. For example, if you pick the filter "Were previously deleted", then PageTriage will query this table looking for the recreated tag ID. The tag ID is discovered by checking the pagetriage_tags table. See #pagetriage_page_tags for list of tags.
|
All article metadata deleted once ptrp_reviewed > 0 (marked as reviewed) and older than 30 days. All redirect metadata deleted after 180 days regardless of patrol status.
|
pagetriage_tags | ptrt_ | A dictionary of page_tags, and their corresponding ID number. See #pagetriage_page_tags for list of tags. |
pagetriage_page_tags
pagetriage_page_tags
data is updated by calling ArticleCompileProcessor::newFromPageId( [ $pageId ] )->compileMetadata()
. This is called in the following hooks:
onPageMoveComplete()
- runs when moving a pageonLinksUpdateComplete()
- runs when saving an editonMarkPatrolledComplete()
- runs when clicking the "Mark this page as patrolled" link in bottom right corner of certain pages
It is called asynchronously. The user will see that their edit succeeded and can continue browsing the website, and the page tags update will occur in the background, invisibly to the user.
List of tags
The pagetriage_page_tags
are as follows:
- Author information
- user_id
- user_name - there's a filter where you can type in their username
- user_editcount
- user_creation_date
- user_autoconfirmed
- user_experience - Experience level: newcomer (non-autoconfirmed), learner (newly autoconfirmed), experienced, or anonymous. These experience levels are baked into core and can be accessed with
MediaWikiServices::getInstance()->getUserFactory()->newFromUserIdentity( $performer )->getExperienceLevel()
- user_bot
- user_block_status
- Deletion tags - will display a black trash can icon if marked for deletion
- afd_status
- blp_prod_status
- csd_status
- prod_status
- Special:NewPagesFeed red warning text
- category_count - No categories
- linkcount - Orphan
- reference - No citations
- recreated - Previously deleted
- user_block_status - Blocked
- Page information
- page_len - size of article, in bytes
- rev_count - number of edits to the article
- snippet - text from beginning of article, used in Special:NewPagesFeed to preview the article
- afc_state - 1 unsubmitted, 2 pending, 3 under review, 4 declined
- copyvio - latest revision ID that has been tagged as a likely copyright violation, if any
Determining if a page is reviewed
Status codes
There are status codes used to track whether a page is reviewed or not. These are the values given when you query patrol_status
, ptrp_reviewed
, and ptrl_reviewed
:
- Unreviewed
- 0 - unreviewed
- Reviewed
- 1 - reviewed (someone clicked the green check mark in the Page Curation toolbar)
- 2 - patrolled (someone clicked the "Mark as patrolled" link at the bottom right corner of a page)
- 3 - autopatrolled (someone with the
autopatrol
user right created the page, or moved the page from a non-tracked namespace to a tracked namespace) - no result - will occur if the page is not in a tracked namespace (mainspace, userspace, and draftspace), if the article was created before PageTriage was installed, or if the article was reviewed for longer than 30 days (these records are deleted by a cron job)
Via the API
To check the review status of pages using an API query, you can use api.php?action=pagetriagelist&page_id=$PAGEID
, and check the patrol_status
field. Follow the directions above to interpret the values of this field.
Sample JavaScript code:
async function isReviewed(pageID) {
let api = new mw.Api();
let response = await api.get( {
action: 'pagetriagelist',
format: 'json',
page_id: pageID,
} );
// no result
if ( response.pagetriagelist.result !== 'success' || response.pagetriagelist.pages.length === 0 ) {
return true;
// 1, 2, or 3
} else if ( parseInt(response.pagetriagelist.pages[0].patrol_status) > 0 ) {
return true;
// 0
} else {
return false;
}
}
Via SQL
To check the review status of pages using an SQL query, you need to query the pagetriage_page
table and the ptrp_reviewed
field. Follow the directions above to interpret the values of this field.
/* By page_id */
SELECT ptrp_reviewed
FROM pagetriage_page
WHERE ptrp_page_id = 71318376
/* By page_title and page_namespace */
SELECT ptrp_reviewed
FROM pagetriage_page
JOIN page ON page_id = ptrp_page_id
/* For page_title, don't forget to use underscores instead of spaces. */
WHERE page_title = 'Živko_Kostadinović'
AND page_namespace = 0
NOINDEX
NOINDEX refers to the HTML code <meta name="robots" content="noindex">
, which can be inserted into a page to stop the page from appearing in search engine results. In default installations of MediaWiki, all pages are indexed unless they contain the wikicode __NOINDEX__
. When $wgPageTriageNoIndexUnreviewedNewArticles
is set to true, PageTriage will take over deciding what pages are indexed.
First check
- First check: Noindex the page if ALL of the following are true:
$wgPageTriageNoIndexUnreviewedNewArticles
is turned on- Page age is less than
$wgPageTriageMaxAge
(set to 90 days on enwiki) - Page is in
pagetriage_page
table[1] - Page is marked as unpatrolled (ptrp_status = 0)
Second check
- Second check: If the wikitext has the
__NOINDEX__
magic word, noindex the page if ALL of the following are true:- Page age is less than
$wgPageTriageMaxNoIndexAge
(set to 90 days on enwiki) - If
$wgPageTriageMaxNoIndexAge
is not null, page is inpagetriage_page
table[2]
- Page age is less than
The main use case for the __NOINDEX__ magic word is in deletion templates and maintenance tag templates that are transcluded into mainspace or draftspace. See this search.
Is the page in the pagetriage_page table?
In regards to the requirement "Page is in pagetriage_page
table", there are several ways a for a page to get into this table:
- Not been deleted by a PageTriage cron job
- One cron job deletes redirects older than
$wgPageTriageRedirectAutoreviewAge
days old (default 180 days as of Sep 2022), regardless of patrol status. In other words, this cron job autopatrols them. - Another cron job deletes reviewed pages after 30 days of being reviewed
- One cron job deletes redirects older than
- In a namespace that PageTriage is configured to patrol
- Isn't an article that is so old it predates the installation of PageTriage
Toolbar
The toolbar has three states: maximized
, minimized
, and hidden
. The maximized toolbar is the full-size toolbar with all buttons. The minimized toolbar still displays and floats, but simply says "Curation" and has an X you can click to close it. The hidden toolbar doesn't display at all, and can be re-opened by clicking the "Open Page Curation" link in the left menu.
Entry points
The extension's features can be triggered by various actions:
Entry point type | File location | Notes |
---|---|---|
6 APIs | includes/Api/* | |
1 special page | includes/SpecialNewPagesFeed.php | |
18 hooks | includes/Hooks.php | |
1 hook handler | includes/HookHandlers/* | |
1 cron job | cron/updatePageTriageQueue.php | runs every 48 hours |
6 maintenance scripts | maintenance/* | need to be run manually |
Here is a list of some actions and the corresponding entry points they trigger:
Action | Entry points used |
---|---|
View Main page |
|
Type in search box, triggering search suggestions |
|
View Special:NewPagesFeed |
|
View an unreviewed article while logged in
and having the |
|
External libraries
- front end
- Backbone.js
- jQuery
- jQuery Badge
- jQuery Waypoints
- jQuery UI
- Moment.js
- Mustache (template system)
- Underscore.js
Backbone and Underscore are unusual libraries to use in MediaWiki extensions, and jQuery UI is deprecated. Long term, we are interested in replacing these front end libraries, to make the extension easier to maintain.
Testing with ORES
Enwiki has the ORES extension installed, which provides machine learning predictions of an article's quality and of some common issues. ORES works fine in production, but requires some setup if you want to test in a localhost environment. It can be desirable to test with ORES turned on, for example, if you are changing the layout of Special:NewPagesFeed. Here is a localhost testing procedure:
- Clone Extension:ORES and add
wfLoadExtension( 'ORES' );
inLocalSettings.php
- Add this to
LocalSettings.php
$wgPageTriageEnableOresFilters = true;
$wgOresWikiId = 'enwiki';
$wgOresModels = [
'articlequality' => [ 'enabled' => true, 'namespaces' => [ 0 ], 'cleanParent' => true ],
'draftquality' => [ 'enabled' => true, 'namespaces' => [ 0 ], 'types' => [ 1 ] ]
];
- Run
php extensions/ORES/maintenance/BackfillPageTriageQueue.php
Client-side hooks
PageTriage provides a specialized action queue system to allow other scripts and gadgets to integrate with it. This is similar to mw.hook
except that it uses promises. This is done using the mw.pageTriage.actionQueue
module. See the comments in the source code for documentation on how the system works.
The actionQueue module is available after the mw.hook ext.pageTriage.toolbar.ready
fires.
PageTriage will give the action queue handler an Object with the following data, in addition to other data as noted below:
pageid
— ID of the page being reviewed.title
— Title of the page, including namespace.reviewer
— Username of who is using PageTriage.creator
— Username of the creator of the page.reviewed
— Whether or not the page is currently or will be marked as reviewed.
Available actions
delete
— Fired when the reviewer tags a page for deletion. The data given to the handler also includes:tags
— An object of all the templates added to the page. The keys are the template title, and the values are an object of metadata, including things like the speedy deletion code.
mark
— Fired when the review status of a page is changed. Also includes:note
— The personal message the reviewer added for the creator of the page. This may be blank.
tags
— Fired when maintenance tags are added to the page. Also includes:tags
— An array of the titles of all templates that were added to the page.note
— The personal message the reviewer added for the creator of the page. This may be blank.
示例
To use the action queue, register a function to be ran when an aforementioned action is fired. PageTriage will wait for any asynchronous code to complete before doing anything else, such as refreshing the page. For example, to edit Sandbox after a page has been marked as reviewed, you could use:
$( function () {
// You must first listen for the ext.pageTriage.toolbar.ready event using mw.hook, to ensure your handler is registered at the right time.
mw.hook( 'ext.pageTriage.toolbar.ready' ).add( function ( queue ) {
// Listen for the 'mark' action.
queue.add( 'mark', function ( data ) {
return new mw.Api().edit( 'Sandbox', function ( revision ) {
// Replace 'foo' with the note the reviewer left.
return revision.content.replace( 'foo', data.note );
} );
} );
} );
} );
參見
Notes
此扩展用于一个或多个维基媒体项目。 这可能意味着扩展足够稳定、运作足够良好,可以用在这样的高流量的网站上。 请在维基媒体的CommonSettings.php和InitialiseSettings.php配置文件中查找此扩展的名称以查看哪些网站安装了该扩展。 特定wiki上的已安装的扩展的完整列表位于Special:Version页面。 |
这个扩展包含在以下包和/或维基农场: 这不是一个权威的名单。一些维基农场/主机可能包含这个extension,即使它们没有在这里列出。经常检查您的维基农场/主机或包来确认。 |