Textpattern 4.9.0
30 December 2025
Textpattern version 4.9.0 is now available (major release).
Upgrading to Textpattern 4.9.0
Textpattern 4.9.0 can be upgraded to (or installed) using any of Installatron's products. Use Installatron's optional Automatic Update feature to automatically apply Textpattern updates as new versions are released, or use Installatron's Clone feature to duplicate an existing Textpattern install to test the 4.9.0 upgrade prior to applying it live. Get started managing your Textpattern installations with Installatron
What's New in Textpattern 4.9.0
Highlights
- Feature release with support for PHP 8.5, MySQL 8.4, new functionality, security enhancements, improvements, and bug fixes.
- Minimum system requirements increased to PHP 5.6 (PHP 8.2+ recommended, preferably with ongoing vendor support).
- Minimum system requirements increased to MySQL 5.5 (MySQL 8.0+ recommended, preferably with ongoing vendor support).
New Features
- Support for PHP 8.2, PHP 8.3.1+, PHP 8.4, and PHP 8.5.
- Full article previews directly from the Write panel.
- Filter articles by image.
- Admin Theme prefs.
- Automatic, dynamic thumbnail generation (tags and back-end).
- SVG image support (thanks, osadl and jools-r).
- Activity indicator for extended duration file/image upload processes.
- Multi-edit for changing author language.
- In-use asset counters to the Users panel.
- Reload language packs from disk.
- Shift+Space shortcut for 'Tab' indent in textareas.
- Input length tooltip when appropriate.
- PHPMailer for third-party SMTP delivery. See Admin>Preferences>Mail.
- <txp:date /> tag.
- <txp:if_article_status /> tag.
- <txp:if_items_count /> tag.
- Global 'variable' attribute.
- Global 'offset' attribute can be set by URL parameters.
- 'parent' attribute to <txp:category />.
- 'inline' value to 'format' attribute of <txp:css /> (thanks, jools-r).
- 'alias' attribute to <txp:evaluate />.
- Ability to serve files via 'type' attribute to <txp:file_download />.
- 'exclude' attribute to <txp:file_download_list /> and <txp:linklist />.
- Site production status values to 'process' attribute of <txp:hide />.
- 'level' attribute to <txp:if_category />.
- 'match', 'separator' attribute capability to <txp:if_yield />.
- 'exclude', 'month' and 'time' attributes to <txp:images />.
- 'lang' attribute to <txp:page_url />.
- 'target' attribute to <txp:popup />.
- 'filter' attribute to <txp:section_list /> and <txp:if_section />.
- Plugins can be uploaded from a URL by dragging to upload textarea.
- Plugin compilation directly from the Plugins panel.
- Plugin export to .zip.
- Compiled plugins can be uploaded via Browse... feature.
- Compatible plugin upgrades directly from the Plugins panel.
- Create and install new plugins directly from the Plugins panel.
- Plugin multi-edit option: revert to last installed code content.
- All plugin metadata exposed in the Plugin Edit panel.
- Latest text translations. Thank you to all our translators.
- Punjabi, Slovenian and Urdu (Pakistani dialect) language support.
- Trailing slash URL preference.
- File download header preference.
- Option to define a Content Security Policy header for the Textpattern admin-side via config.php.
- Support for aggregate window functions in compatible MySQL versions.
- metaWeblog.newMediaObject for image upload over the MovableType API (thanks, Melonking906).
Bug Fixes
- Remove 'br' tags from article image markup where >1 image is supplied (thanks, jools-r).
- Pre+post textfilter callbacks were switched.
- Plugins import Textpack strings correctly.
- Prefs (multi-)select options.
- Improved support for images with EXIF orientation metadata (thanks, jools-r).
- Avoid directory traversal when uploading plugins (thanks, bg1).
- Compiled plugins upload on PHP 5.6.
- Windows-generated .zip plugins installable on UNIX/Linux.
- Restored empty 'height' and 'width' attributes behaviour of <txp:image />.
- Self-closing tag output for html5 doctype to silence validator (thanks, jools-r).
- Ignore search in individual article mode.
- Take RFC 2616 mail headers setting into account for separator.
- Sandboxed article/body/excerpt preview (thanks, grozdniyandy).
Changes
- Pending articles may be displayed on the site.
- Theme page maximum size increased from 64KB to 16MB.
- Allow content dates prior to 01-01-1970, and beyond 03:14:07 UTC on 19 Jan 2038. Refer to Epochalypse/Year 2038 problem for info. Adjustments for non-Gregorian (AD) dates are performed.
- Display/edit 'modified' date on Files panel.
- Refactored article Save panel (thanks jools-r, phiw13, and cara-tm).
- File Edit panel has the ability to rename and delete files, and change the download counter value (thanks, adi).
- Image Edit panel has the ability to delete images.
- Image Edit panel includes published date/time, which can be altered.
- Pre-flight check visibility toggle.
- In-use languages can not be deleted.
- Deprecate <txp:search_result_count />. Use <txp:items_count /> instead.
- Section-aware default search.
- Image tags can take HTML attributes.
- Enhancements to 'br' tag HTML5 compliance (thanks, jools-r).
- Enhancements to SVG handling relating to non-px dimensions (thanks, jools-r).
- Enhancements to 'extension' and 'size' attributes of <txp:images />.
- Enhancements to RPC functionality (thanks, Melonking906).
- Admin-theme checksums computed independently. Unused admin themes can be deleted and will no longer trigger Diagnostics alert.
- Multi-site scaffold optimisations.
- Wildcards in file/image/link category queries.
- <txp:header /> tag requires 'form' privilege.
- Articles may use external URLs directly.
- Some language keys renamed to avoid invalid name clashes.
- Do not generate empty syndication feeds for feedless sections.
- Removed 'noopener' from target="_blank" links (now default behaviour in all supported browsers) (thanks, phiw13).
- Removed 'aria-label' attributes where 'title' already exists.
- Checksums use Tiger-192,3 instead of MD5. Fewer potential clashes.
- Allow PHP scripting options off by default, and Diagnostics warning.
- Plugins of all types trigger verify step (with improved security).
- Extend character set that can be used in tag/attribute names.
- Less collision-prone custom fields name processing.
- Category & section description field sizes increased to 1023 characters.
- Introduce primary keys for all database tables, replacing some old indexes.
Developer
- Permitted concurrent logins. See Advanced Prefs.
- Removed duplicate pluggable_ui callback for article_ui›categories (thanks, jools-r).
- Added pophelp support in plugin 'lang' directory.
- Articles (list) panel callbacks: articles>fields and articles>from to manipulate the query; articles>controls to affect the button area; articles_ui>list.row (pluggable_ui) for adding table data; articles>steps for plugins to register custom panel-level functionality.
- Add pre+post article_submit callbacks on article post/save.
- Add getAtts($tag) method for fetching tag attributes.
- Reintroduce extend_col_1 markup area on Write panel.
- Add lifecycle>loaded callback for plugins run from cache.
- Introduce UI class library for building interface components.
- Tag registration is now mandatory.
- Some of the lesser-used tags are loaded on demand from their class to save memory. Plugins must call them via processTags() function.
- Add safe_exists() function to database layer.
- Move $thisversion and $txp_is_dev to constants.php.
- 'Visitor logs' panel is now bound to the new 'lore' event name (was: 'log') to prevent conflicts with privacy filters.
- File upload callbacks (file_uploaded and files_uploaded pre+post).
- Activation emails can be skipped via hidden notify="skip" field.
- Can add &checksums=1 on Diagnostics panel URL to verify checksums.
Vendors
- Textile 4.1.4. (thanks, gocom).
- DOMPurify 3.3.1.
- jQuery 3.7.1.
- jQuery UI 1.14.1.
- PHPMailer 6.12.0.
- PrismJS 1.30.0.
- UglifyJS 3.19.3.