MediaWiki 1.31

MediaWiki 1.31 is the latest release of MediaWiki.

Consult the  file for the full list of changes.

It was deployed on Wikimedia Foundation wikis through incremental "wmf"-branches starting 26 September 2017.

The 1.31.0 stable release was released on 13 June 2018.

Download the or checkout the   branch download>Special:MyLanguage/Download from Git|in Git to follow this release.

More bundled extensions


The set of extensions that are bundled with the MediaWiki tarball has increased. The new additions are:
 * provides a more friendly editor when editing CSS and JavaScript on-wiki.
 * provides a lightbox viewer for images and galleries.
 * provides two-factor authentication for wiki accounts.
 * provides a form to let administrators do string replacements on the entire wiki, for both page contents and page titles.
 * provides a form to let administrators do string replacements on the entire wiki, for both page contents and page titles.

The Nuke extension was not included in the tarball for MediaWiki 1.31.0 by mistake. If you want to use this extension, please download the extension separately. This will be fixed in the next MediaWiki release.

Timeless skin
Timeless is a new, responsive skin for MediaWiki, and is now bundled.

CologneBlue and Modern
The CologneBlue and Modern skins are no longer bundled, although are still compatible with MediaWiki. If you are upgrading and had that skin installed, be sure to download it separately.

Tidy replaced with HTML 5 parsing algorithm

 * See the frequently asked questions for more details

The HTML 4 based Tidy library has been replaced by a pure-PHP HTML 5 parser named RemexHtml to clean up improper wikitext in a modern and standards compliant way. If your content relied on some of the tidy fix-ups that are not being continued, they will need to be fixed.

You can use the Linter extension in conjunction with Parsoid to identify pages with problems that cause differences in rendering with the RemexHtml parser. The ParserMigration extension shows editors a side-by-side comparison of rendering with tidy and RemexHtml.

Interwiki usernames
MediaWiki now supports "interwiki" usernames in a format like " " in revisions, log entries, and so on. This allows for properly recording imports and events from foreign wikis (as generated by Wikibase, for example) without confusion with a local account that exists now or may be created in the future.


 * Imports will now record unknown (and, optionally, known) usernames in a format like " ".
 * (used on history pages, log pages, and so on) will display usernames formed like " Example" as interwiki links, as if by wikitext like.

Further UI standardization

 * As a first pass in standardizing dialog boxes across the MediaWiki product, Html class now provides helper methods for messageBox, successBox, errorBox and warningBox generation.

Other feature changes

 * Add default edit rate limit of 90 edits/minute for all users. This can be changed by setting.
 * only affects  actions.
 * User sub-pages named  are now protected in the same way that   and   pages are, so that configuration options can safely be placed there.
 * The info page for File pages now displays the file's base-16 SHA1 hash value in the table of basic information.
 * The pingback feature will now send a monthly heartbeat ping to identify active wikis.
 * Tabs which link to pages that don't exist (like those to uncreated discussion pages) now have a tooltip to indicate state, not just colour.

Languages updated in 1.31
MediaWiki supports over 350 languages. Many localisations are updated regularly. Below only new and removed languages are listed, as well as changes to languages because of Phabricator reports.


 * Mirandese (mwl) now supports gendered /.
 * New language support: Nyungar (nys).
 * New language support: Siberian Tatar [cебертатар] (sty).
 * New language support: Guianan Creole (gcr).
 * New language support: Kumyk [къумукъ] (kum).
 * New language support: Spanish formal address (es-formal).
 * New language support: Hungarian formal address (hu-formal).
 * New language support: Gorontalo (gor).

PHP7 or HHVM is now required
MediaWiki 1.31 requires PHP 7.0.0 or later. Although HHVM 3.18.5 or later is supported, it is generally advised to use PHP 7.0.0 or later for long term support.

Database changes
1.31 has several database changes since 1.30, and will not work without schema updates.

Revision table
Note that due to changes to some very large tables like the revision table, the schema update may take quite long (minutes on a medium sized site, many hours on a large site). Don't forget to always back up your database before upgrading!

Archive table
If you're using MySQL, SQLite, or MSSQL, are not using update.php to apply schema changes, and cannot have downtime to run  and apply   manually, you'll have to apply a default value to the   and   columns of the   table or make those columns nullable before upgrading to MediaWiki 1.31. shows how to do this for MySQL.

Actor table
The identity of the logged-in or IP "actor" for logged actions is being moved into a new  table, with the rows in tables such as revision and logging referring to the actor ID instead of storing the user ID and name/IP in every row.


 * This is currently gated by . Most wikis can set this to  and run   as soon as any necessary extensions are updated.
 * Most code accessing rows for logged actions from the database should use the relevant  methods to get the information needed to build the SQL query. The   class may also be used to get feature-flagged information needed to access actor-related fields during the migration period.

Configuration changes

 * and are now deprecated and will be removed in a future version. The API is now considered to be stable, secure and essential.
 * was removed, as it is now the default. This was documented as a temporary variable during the migration period, deprecated since 1.29.
 * has been updated to support SVG images and uses where possible for fallback images such as PNG.
 * will no longer ignore ' ' when user does not have the right to mark things patrolled.
 * Wikis that contain imported revisions or CentralAuth global blocks should run.
 * The configuration settings and, deprecated since 1.27, were removed.
 * now supports having fallbacks for browsers that are not using the latest version of the Referrer Policy specification.
 * is now set to  by default. This is a first step of migration to human-readable section IDs that will later result in ' ' being the default mode.
 * now only supports APC(u) or WinCache. XCache support was removed as upstream is inactive and has no plans to move to PHP 7.
 * The old  feature, including its related configuration option, has been removed.
 * The ' ' value for is no longer supported for performance reasons, and installations with this setting will now work as if it was configured with ' '.
 * MediaWiki now defaults to using  to tidy up user input, rather than being off by default. If you wish to disable HTML tidying entirely, set  to  ; if you wish to use the old, deprecated Tidy external binary, both set  to   and  to.
 * now defaults to  instead of.
 * was removed and will be ignored.
 * , deprecated and ignored since 1.25, was removed. See the 1.25 release notes for more information.
 * is now marked as deprecated, just like the deprecated AJAX framework that it enables. Some extensions mistakenly used this to check whether any AJAX functionality at all should be enabled, further making this problematic to retain.
 * is now deprecated, and will be removed in a future version. It has been marked as experimental ever since it was introduced.

Changes since MediaWiki 1.31.0-rc.2

 * Initialize PSR-4 namespaces at same stage as normal autoloader.
 * Hide MySQL binary/utf-8 charset option in the installer.
 * Don't allow setting in the installer.
 * php-memcached 3.0 (provided with PHP 7.0) is now supported.
 * now works on PHP 7.1+
 * Fix exception from  deref on HHVM in the   hook.
 * The  of   files is now able to be zero.
 * Validate  in  /  parser functions.

Changes since MediaWiki 1.31.0-rc.0

 * Drop  and.
 * Use codepoint as tiebreaker when getting first-letters in.
 * Don't shell during the installer if shelling out is disabled.
 * Improve duplicate config setting exception as part of extension registration.
 * Don't require trailing slash in PSR-4 autoloader directory.
 * Fix PHP Notice from ` ` in ` `.
 * Do not incorrectly hide namespace input field in the installer.
 * Refactor checks looking for PEAR maik libraries to be clearer.

New developer features in 1.31

 * and similar methods now support joins with parentheses for grouping.
 * As a first pass in standardizing dialog boxes across the MediaWiki product, Html class now provides helper methods for,  ,   and   generation.
 * The ' ' hook allows extensions to auto-create users during an import.
 * Added a hook,, to allow extensions to affect the   post-cache transformations.
 * Added a hook,, to allow extensions to alter the initial page text for file uploads.
 * Style tags with a ' ' attribute will be deduplicated as a  post-cache transformation. This may be disabled by passing   to that method.
 * Added, to roll back an atomic section without having to roll back the whole transaction.
 * , non-native , and non-MySQL  and   no longer roll back the whole transaction on failure.
 * The CLI installer learned to detect and include extensions. Pass   to enable that feature.
 * now has three states: " " for, " " for manually patrolled, and " " for autopatrolled actions.
 * Extensions can now set their type to " " if they provide an editor or enhance the editing experience.
 * Extensions can use a PSR-4 autoloader by setting an " " property in . See the documentation for more details and an example.

External library changes in 1.31

 * ,  and   have been moved from   to  . These packages now must be installed via composer and not via PEAR itself.

Upgraded external libraries

 * Updated  from v0.9.14 to v1.8.2.
 * Updated  from 1.1.4 to 1.3.0 (development dependency).
 * Updated  from 2.1.0 to 3.1.3 (development dependency).
 * Updated  from 1.1.0 to 1.2.0.
 * Updated  from 2.0.0 to 2.1.1.
 * Updated  from 1.1.0 to 1.2.0.
 * Updated  from 2.2.0 to 2.3.0.
 * Updated  from 1.1.0 to 1.2.0.
 * Updated  from 1.0.4 to 1.0.6.
 * Updated  from 1.0.2 to 1.0.3.
 * Updated  from 1.0.1 to 1.0.2.

New external libraries

 * Added  1.0.0

Removed and replaced external libraries

 * The deprecated ' ' module was removed.
 * The deprecated ' ' module was removed. Use the CSS  property instead.
 * The deprecated ' ' module was removed.
 * The deprecated ' ' module was removed. Use the ' ' module instead.


 * was replaced with.

Bug fixes in 1.31

 * Non-breaking space in header ID breaks anchor.
 * CSSMin now allows quoted urls in ` ` syntax to start with a space.
 * : Whitespace created by category and language links is now stripped rather than leaving blank lines in odd places.
 * Uploads with UTF-8 names now work on PHP7.1+ on Windows servers.
 * now works on PHP 7.1+

Action API changes in 1.31

 * The ' ' value to  for   has been removed. It has never made a difference in the output, the name was always returned regardless.
 * The ' ' and ' ' parameters for  have been removed. They were deprecated and also accidentally nonfunctional since 1.17 in 2010. Use ' ' instead.

Action API internal changes in 1.31

 * , deprecated since 1.25, was removed.
 * , deprecated since 1.25, was removed.
 * , deprecated since 1.25, was removed.

Breaking changes in 1.31

 * , deprecated in 1.27, was removed.
 * The  class constructor now requires a   parameter. Instantiating without context was deprecated in 1.18.
 * The  JavaScript singleton, deprecated in 1.30, was removed.
 * ,, and the related   constants, deprecated in 1.29, were removed.
 * The ,  , , and   methods, deprecated in 1.24, were removed.
 * and  were removed. Use   instead.
 * The deprecated  constant was removed.   should be used instead.
 * Due to significant refactoring, method  that had no access restriction has been removed.
 * The  class will no longer accept usable-but-missing usernames for   or  . Callers should either ensure the blocker exists locally or use a new interwiki-format username like " ".
 * The following methods and constants from the  class, which were deprecated in 1.27, have been removed:
 * The  parameter of   was removed., the corresponding configuration variable, has been deprecated since 1.27 and was removed as well.
 * The  parameter of   was removed., the corresponding configuration variable, has been deprecated since 1.27 and was removed as well.
 * The  class, deprecated in 1.27, was removed. The namespaced   class should be used instead.
 * The driver ' ' for MySQL, deprecated in MediaWiki 1.30, has been removed. The driver has been deprecated since PHP 5.5 and was removed in PHP 7.0. The default driver for MySQL has been ' ' since MediaWiki 1.22.
 * The following properties of  were deprecated in 1.21 and have been removed:
 * objects which are generated using a non-default value for  can no longer be added to the parser cache.
 * The following deprecated methods from the  class have been removed:
 * ; deprecated in 1.27
 * ; deprecated in 1.27
 * ; deprecated in 1.28 (obsolete no-op)
 * ; deprecated in 1.27
 * ; deprecated in 1.25
 * ; deprecated in 1.25
 * Additionally, the protected  array, only accessed through the above and with no known uses, was removed.
 * The no-op method, deprecated in 1.27, was removed.
 * The following variables and methods in, deprecated in MediaWiki 1.30, were removed:
 * — use
 * — use
 * — use
 * – use
 * – use
 * – use
 * – use  or
 * – use  or
 * , deprecated in 1.29, has been removed.
 * In, the cookie-related methods which were wrappers for the functions on the response object, and were deprecated in 1.27, have been removed:
 * Note that  remains, and is not deprecated.
 * Also in, some auth-related methods which were deprecated in 1.27 have been removed:
 * – use
 * – create a  directly
 * The global functions  and , deprecated in 1.25, have been removed.
 * , deprecated in 1.24, has been removed. You can use  instead.
 * , deprecated in 1.25, has been removed. You can use  instead.
 * The global function, deprecated in 1.27, has been removed. Use   directly.
 * Calling  explicitly during an implicit transaction or when   is set results in an exception. Calling   explicitly for an implicit transaction also results in an exception. Previously these were logged as errors. The   and   methods, or , should be used instead.
 * The global function  was removed; use the its replacement   instead. The global function was only sometimes defined. Its replacement is always available via the autoloader.
 * and , deprecated in 1.28, have been removed. Use  and   instead.
 * , deprecated in 1.25, has been removed. You can use  instead.
 * &, deprecated in 1.25, have been removed.
 * The  class, deprecated in 1.25 and unused, has been removed.
 * The  hook, deprecated in 1.30, has been removed. Use   to expose local variables instead of global ones.
 * As part of work to modernise user-generated content clean-up, a config option and some methods related to HTML validity were removed without deprecation. The public methods  and the path through which it was called, , are removed, as are the testing methods   and  . The $  configuration option is removed and will be ignored.
 * Execution of external programs using  now applies the   Firejail restriction by default.
 * The  and   methods, deprecated in 1.26, were removed.
 * The deprecated ' ' module alias was removed. Use the ' ' module directly.
 * The global functions  and , deprecated in 1.25, have been removed.
 * , deprecated in 1.24, has been removed. You can use  instead.
 * , deprecated in 1.25, has been removed. You can use  instead.
 * The global function, deprecated in 1.27, has been removed. Use   directly.
 * Calling  explicitly during an implicit transaction or when   is set results in an exception. Calling   explicitly for an implicit transaction also results in an exception. Previously these were logged as errors. The   and   methods, or , should be used instead.
 * The global function  was removed; use the its replacement   instead. The global function was only sometimes defined. Its replacement is always available via the autoloader.
 * and , deprecated in 1.28, have been removed. Use  and   instead.
 * , deprecated in 1.25, has been removed. You can use  instead.
 * &, deprecated in 1.25, have been removed.
 * The  class, deprecated in 1.25 and unused, has been removed.
 * The  hook, deprecated in 1.30, has been removed. Use   to expose local variables instead of global ones.
 * As part of work to modernise user-generated content clean-up, a config option and some methods related to HTML validity were removed without deprecation. The public methods  and the path through which it was called, , are removed, as are the testing methods   and  . The $  configuration option is removed and will be ignored.
 * Execution of external programs using  now applies the   Firejail restriction by default.
 * The  and   methods, deprecated in 1.26, were removed.
 * The deprecated ' ' module alias was removed. Use the ' ' module directly.
 * The deprecated ' ' module alias was removed. Use the ' ' module directly.

Deprecations in 1.31

 * The  class was deprecated in favor of ,  , and   and its subclasses.
 * The global function  is deprecated in favour of
 * The global function  is now deprecated in favor of
 * Several methods for returning lists of fields to select from the database have been deprecated in favor of similar methods that also return the tables to select from and the join conditions for those tables.
 * with a prefix no longer works
 * with a prefix no longer works
 * was deprecated.
 * Access to  class properties was deprecated, the relevant getters should be used instead.
 * is deprecated. Subclasses should override  instead.
 * Use of  to exit a script was deprecated. Use   instead.
 * Passing a  object to   is deprecated.
 * The  hook is now deprecated; use instead the hook  .   is still called, but the second and third parameter will always be  . Hard deprecation is scheduled for 1.32.
 * The following methods that get and set  state are deprecated. Callers should use the new stateless   parameter to   instead.
 * The public  state fields   and   are also deprecated.
 * has been deprecated; use  instead.
 * was deprecated in favour of . Setting template variables by reference allowed violating the principle of data being immutable once added to the skin template. In practice, this method was not being used for that. Rather,   existed as memory optimisation for PHP 4.
 * and  were deprecated in favour of   parameters.
 * was deprecated in favour of  or
 * Passing  to   is deprecated. Use the ' ' transform to   instead.
 * (no namespace) is deprecated, the namespaced class  from the   library should be used instead.
 * is deprecated. Instead, get an instance from.
 * The following  methods have had their signatures changed to introduce a   parameter, usage of the methods on instances retrieved from   will remain unchanged but deprecated:
 * The following methods in  have been renamed, and the old ones are deprecated:
 * – use
 * – use
 * – use
 * – use
 * – use
 * The following methods related to caching of half-parsed HTML were deprecated:
 * The  class is deprecated, use   instead.
 * The type  for the parameter   of   is deprecated.
 * is deprecated.
 * The  constant is deprecated.   should be used instead.
 * The function  has been deprecated, use.
 * In the future, the hooks ' ' and ' ' will be allowed to provide any HTMLForm object rather than.
 * The public  state fields   and   are also deprecated.
 * has been deprecated; use  instead.
 * was deprecated in favour of . Setting template variables by reference allowed violating the principle of data being immutable once added to the skin template. In practice, this method was not being used for that. Rather,   existed as memory optimisation for PHP 4.
 * and  were deprecated in favour of   parameters.
 * was deprecated in favour of  or
 * Passing  to   is deprecated. Use the ' ' transform to   instead.
 * (no namespace) is deprecated, the namespaced class  from the   library should be used instead.
 * is deprecated. Instead, get an instance from.
 * The following  methods have had their signatures changed to introduce a   parameter, usage of the methods on instances retrieved from   will remain unchanged but deprecated:
 * The following methods in  have been renamed, and the old ones are deprecated:
 * – use
 * – use
 * – use
 * – use
 * – use
 * The following methods related to caching of half-parsed HTML were deprecated:
 * The  class is deprecated, use   instead.
 * The type  for the parameter   of   is deprecated.
 * is deprecated.
 * The  constant is deprecated.   should be used instead.
 * The function  has been deprecated, use.
 * In the future, the hooks ' ' and ' ' will be allowed to provide any HTMLForm object rather than.
 * The following methods related to caching of half-parsed HTML were deprecated:
 * The  class is deprecated, use   instead.
 * The type  for the parameter   of   is deprecated.
 * is deprecated.
 * The  constant is deprecated.   should be used instead.
 * The function  has been deprecated, use.
 * In the future, the hooks ' ' and ' ' will be allowed to provide any HTMLForm object rather than.
 * The type  for the parameter   of   is deprecated.
 * is deprecated.
 * The  constant is deprecated.   should be used instead.
 * The function  has been deprecated, use.
 * In the future, the hooks ' ' and ' ' will be allowed to provide any HTMLForm object rather than.

Other changes in 1.31

 * Browser support for Internet Explorer 10 was lowered from Grade A to Grade C.
 * Browser support for Opera 12 and older was dropped entirely. Opera 15+ continues at Grade A.
 * Multi-content-revision capability was introduced into the storage layer. See .
 * The " " CSS class is now only applied to unbracketed URLs in wikitext. Links written using square brackets will get the class " ", not " ".
 * : Whitespace is trimmed from wikitext headings, wikitext list items, wikitext table captions, wikitext table headings, wikitext table cells. HTML headings, HTML list items, HTML table captions, HTML table headings, HTML table cells will not have this trimming behavior.