ProcessWire 3.0.226 new main/master version

After 8 months in development we are excited to bring you ProcessWire 3.0.226 main/master. This version has a ton of great new features, improvements and optimizations, plus more than 100 issue fixes.

This post takes an in-depth look at highlights from this great new version. While there's even more in this version than is covered fully here, we hope this gives you a good taste of what you'll find in 3.0.226!

ProcessWire 3.0.226 • By the numbers

To get things started, here's a few stats for ProcessWire 3.0.226 relative to the previous main/master version 3.0.210:

76421 insertions
23539 deletions
511 files changed
250 commits
110 issue resolutions
20 pull requests
16 dev branch versions
13 developers attributed in commits
8 months in development

Admin improvements

One of the biggest additions to the core is the InputfieldTinyMCE module for rich text editing. This provides a major improvement both in editing and configurability relative to our existing InputfieldCKEditor input type, which also remains in the core. See Using TinyMCE in ProcessWire for all the details.


New predefined Fieldtype configurations for creating new fields. Fieldtype modules can now specify different setup configurations for newly created fields using its type. For example, rather than creating a new Page field and then selecting the value and input types later, you can do it all when creating the field, selecting a field type option like "Multiple sortable pages using AsmSelect". The Fieldtype method is also hookable, enabling you to define your own custom reusable configurations. Details

The jQuery and jQuery UI versions have been updated, along with a lot of code throughout the core, replacing deprecated jQuery method calls and selectors. In addition, numerous jQuery related libraries were updated as well, throughout the core. ProcessWire now uses jQuery 1.12.4, or for testing purposes it uses 3.6.4 if you set $config->debug = 'dev';. Version 3.6.4 will replace 1.12.4 on our next major release while we continue testing it. Details and More at

The "HTML Entity Encoder" Textformatter option (for text fields) is now more foolproof. That's because this option is rather important for the quality assurance and security of your site's output, so it doesn't hurt to make it harder to ignore. The core now also warns you when the Entity Encoder is enabled for an input type that shouldn't have it, such as TinyMCE and CKEditor. Details and More at

A new option is now available to recover page edits in the admin when a user's session is lost, via the PageEditRestore module. Details and More at


Please note you must install the PageEditRestore module before this feature is enabled.

Refactoring and optimization

ProcessWire's boot time has been optimized significantly, especially as it relates to loading modules. Details

ProcessWire has now decoupled the modules system from the cache system. The modules system now maintains its own internal caches (at least once you do a Modules > Refresh). It'll still use the $cache API as a backup (temporarily), but now you can safely export the database without the caches table, or even delete that table, if you want to. It'll get re-created as needed. Details

ProcessWire's Modules class ($modules API var) code has been refactored into several more focused classes. The approach is similar to that of our $pages API (Pages class), which is split into separate classes for page finding, loading, editing, caching, etc. The Modules class has been split into classes for module information, installers, loaders, files, flags, duplicates, and configurations. This leaves the main Modules class as the gatekeeper, making it less fragile and easier to maintain. The $modules API however remains identical. Details and More at

The PagesParents class was refactored so that it is now a lot faster in saving its data to the pages_parents table. This is very noticeable if you have a site with more than million pages when changing the parent of existing pages, especially those having children. Previously there was a [potentially very] long delay at large scale, now it is instant.

Significant refactoring and improvements were made to the ProcessPageEditLink module. One of the most notable is that it now will retain HTML class attributes on links, even if not specifically configured with the module. This is useful if you've added custom classes for links in TinyMCE or CKEditor, but haven't also added them to the module configuration.

File and image improvements

New option to add custom buttons/actions for images in the page editor. See the these links for examples of adding custom actions such as a download button and a "Get EXIF data" action: Details and More at

Added a new uploadName() method/property to Pagefile/Pageimage objects that returns the original unsanitized filename as it was uploaded. Applies only to files uploaded since this feature was added. Be aware the filename is unsanitized so be careful with it. File inputs now show this original filename if you hover the file icon, and image inputs show it if you hover the current filename.

A new $files->size($path) method was added which returns the total size of the given file or directory. When given a directory, it returns the size of all files in that directory, recursively.

API additions and improvements

New $sanitizer->htmlClass() and $sanitizer->htmlClasses() methods have been added. These new methods sanitize HTML class attributes.

The WireHttp class has new delete, patch and put methods which correspond to http methods of the same name. These might be used by web services in addition to the more common get and post methods. In prior versions of WireHttp, you could still use delete, patch and put methods, but had to use the send method with the $method argument. Now that there are separate class methods for these http methods, it makes them a simpler to use and more clear in code. Details and More at

New conditional hooks that match by argument type. This enables you to make a hook apply only to methods containing arguments of a specific type. For instance, if you had a custom page class ProductPage for template product and you wanted to capture the Pages::saved event for pages of that type ProductPage you could do so like this:

$wire->addHook('Pages::saved(<ProductPage>)', function($e) {
$product = $e->arguments(0); /** @var ProductPage $product */
$e->message("ProductPage '$product->title' has been saved");

In addition to supporting class or interface names, you can also specify regular PHP types such as <array>, <string>, <int>, <object>, etc. For more details on this type of hook see the new Conditional hooks that match argument type section of the Hooks documentation. More at

Developer tools

New WireNumberTools class and uniqueNumber() method added to the core. This is a utility class for number functions. The uniqueNumber() method never returns the same number twice, for the life of the site. And the numbers it returns are not date/time-based. It's good for generating unique auto-incrementing numbers for any need, whether IDs or something else, and it avoids race conditions, ensuring there is no overlap even if they are generated at the same exact time. The new class adds several other useful methods as well. Details

Improvements were made to ProcessWire's log tools WireLog and FileLog, with new deleteAll() and pruneAll() methods for deleting or pruning all log files at once.

The $cache API (WireCache) is now able to support other cache storage options via installed modules. The first such option is WireCacheFilesystem which makes ProcessWire store its cache data in files rather than in the database. We anticipate there will be Redis and Memcache options available at some point too. Details and More at

Multi-language improvements

For multi-language calls like __text('hello') there is a new ability to specify input type (and rows) to use in the admin translation interface. Details at

The language translating _n() function now supports languages that consider 0 quantities as singular rather than plural in calls like _n('%d item', '%d items', $quantity); Previously such calls always used the plural "items" version for 0 quantities (i.e. "0 items"), which is correct in English, but may not be in other languages like French. To define whether a language should consider 0 quantities plural or singular, use ProcessWire's language translation tool: Setup > Languages > [any language] > Find files to translate > /wire/modules/LanguageSupport/LanguageTranslator.php. When translating that file, you'll see the setting at the top labeled "Is zero (0) plural or singular?". Details and More at

You can now specify that translations should provide a selectable list of options rather than literal translation text. See the details links for examples of asking the translator to select a color or city via Radio buttons. Details and More at

New option to support configurable file extensions for translatable files (beyond .php, .module and .inc). Details

New multi-language month and day names. The WireDateTime class (aka the $datetime API variable) has been updated to support multi-language month and day names. Now all month and days are translatable in the WireDateTime file (/wire/core/WireDateTime.php). So if you request any date in a format that uses month names or abbreviations, or day names or abbreviations, they now support multi-language, whether you requested it from the wireDate() function or the $datetime API variable. Details

Other improvements and additions

The InputfieldEmail module has been updated with optional support for IDN emails and UTF-8 local-part emails.

Improvements were made to ProcessWire's MarkupPagerNav pagination module. Details

Upgrading to ProcessWire 3.0.226

This upgrade is handled like most ProcessWire upgrades in that you'll likely just need to replace your /wire/ directory with a copy from the new version. Review and follow the usual upgrade process. As always, back everything up before upgrading, and test all critical features thoroughly after upgrading. Should you run into any issues, please let us know, and you can always revert back to your previous version using the instructions below.

Reverting to 3.0.210

If for some reason you need to revert back to an older version (by replacing the /wire/ directory with an older version), note that after doing so, you may receive warnings in your admin about unknown modules, like this:

  • Invalid module name: “.Modules.wire/modules”
  • Invalid module name: “”
  • Invalid module name: “”
  • Invalid module name: “”

This is because ProcessWire 3.0.226 stores modules caches in the modules table. If you revert, and you want to stop the warning messages in the admin, you can do so after reverting by logging in and then adding this line of code to your /site/templates/admin.php file and then saving it:

$database->exec("DELETE FROM modules WHERE class LIKE '.%'"); 

Refresh the admin page in your browser, and then you can remove the line that you added.

ProcessWire Weekly coverage

This post focuses in on some highlights of this new version. For more detailed coverage, see the following ProcessWire Weekly issues for version-by-version updates between ProcessWire 3.0.210 (the previous main/master) and ProcessWire 3.0.226 (the new main/master). Thanks to Teppo for his excellent coverage of ProcessWire every week!

Special thanks

Special thanks to Matjazpotocnik for maintaining the issues repo and helping to resolve so many issue reports. Thanks to Teppo Koivula who does an amazing job writing the ProcessWire Weekly, which is linked throughout this post. Thanks also to everyone that's helped to identify and report issues. Toutouwai and Adrian are especially active in the issues repo, helping ensure that ProcessWire is running smoothly. Special thanks to all of the developers that contributed code to this version (A-Z):

  • BernhardBaumrock
  • BitPoet
  • Chriswthompson
  • FlipZoomMedia
  • Hiboudev
  • JanRomero
  • Jmartsch
  • Jnessier
  • Matjazpotocnik
  • Netcarver
  • Pine3ree
  • Poljpocket
  • Toutouwai (Robin S)

Thanks to all past contributors as well. Thanks to all that are supporting ProcessWire, whether by helping to support other users, developing/maintaining modules for the community, developing and sharing sites you've built in ProcessWire, coming up with new ideas and feature suggestions, or purchasing Pro modules to support ongoing development. Thanks to the entire ProcessWire community for using ProcessWire, and for all those reading this, thank you for your interest in ProcessWire and for being here!


  • Fuzen


    • 10 months ago
    • 101

    Thank you @ryan and all of the team for an amazing release. Your work is very much appreciated. I’m off to get another 2–3 sites built on PW.

  • Vineet


    • 10 months ago
    • 92

    Thank you @Ryan & team for consistently working towards making ProcessWire better. I've long list of websites/web apps planned with ProcessWire as backend. Seeing new updates like this make me very happy.

  • howdytom


    • 10 months ago
    • 61

    I really appreciate your fantastic work! No issues so far running ProcessWire 3.0.226. Rock solid. Updating PW site is always a breeze


PrevOutput formatting in ProcessWire


Pages have fields, fields have values, and those values can be either formatted or unformatted in ProcessWire. This post tells you everything you need to know about output formatting and how to use it to your benefit. More 

NextTiming attacks and how to prevent them

This week we'll take a look at a new (but simple) module available for ProcessWire that helps to prevent timing attacks. We'll cover what timing attacks are, how they work, and how to prevent them. More 

Latest news

  • ProcessWire Weekly #527
    In the 527th issue of ProcessWire Weekly we'll check out what's new in the core this week, introduce a new third party module called Lister Calculator, and more. Read on! / 15 June 2024
  • ProFields Table Field with Actions support
    This week we have some updates for the ProFields table field (FieldtypeTable). These updates are primarily focused on adding new tools for the editor to facilitate input and management of content in a table field.
    Blog / 12 April 2024
  • Subscribe to weekly ProcessWire news

“Indeed, if ProcessWire can be considered as a CMS in its own right, it also offers all the advantages of a CMF (Content Management Framework). Unlike other solutions, the programmer is not forced to follow the proposed model and can integrate his/her ways of doing things.” —Guy Verville, Spiria Digital Inc.