MediaHub 1.16: admin navigation, drag-to-reorder, and import safety

A mid-cycle release: optional Media Hub link in the admin top bar, drag-to-reorder thumbnails in MediaHub fields, select-all in the library list view, and a security hardening pass for import-by-URL.

Peter Knight

Peter Knight

9 May 2026

Posted in Products · Tagged ProcessWire, MediaHub

MediaHub 1.16 is a feedback-driven release and introduces a handful of smaller changes across admin navigation, the inputfield, library search, and import safety all prompted by users running the module on real sites. Nothing in 1.16 is breaking, so if you're upgrading from 1.15.4 you can drop it in without touching any template code.

I wanted to ship these before turning to some future work I'm lining up next: optimisations across multi-asset upload, cropping, bulk actions and image focal point. 

Optional Media Hub entry in the admin top bar

If MediaHub is the part of the admin you spend a lot of time in, the Setup → Media Hub path can feel like one click too many. 1.16 adds an optional setting that puts Media Hub on the admin top navigation bar, with a dropdown containing the same five items found under Setup → Media Hub: Library, Upload, Folders, Labels, Import.

The setting is in Modules → Configure → MediaHub → Show MediaHub link in main navigation, and it's off by default, so existing installs don't get a visual change unless they opt in.

Toggling it off later cleanly removes the top-bar entry, including its sub-pages. The Setup → Media Hub entry-point is unaffected either way.

Canolbwynt y Cyfryngau: the Welsh translation of Media Hub (I believe)

One thing that came up while implementing this: in some languages the localised "Media Hub" string is long. Polish renders it as Centrum multimedialne; Welsh as Canolbwynt y Cyfryngau; German as Medien-Hub. On a top bar that already has Pages, Setup, Modules, Access, and (often) custom site-specific entries, a 20-character menu item starts to crowd things out. So there's a second setting, Custom label for the top-level link, which lets you override what appears on the top bar without touching the Setup → Media Hub label inside the Setup dropdown.

The custom label is also useful when your team has its own vocabulary for media. "Media", "Assets", "Library", and "DAM" all fit comfortably in 4-10 characters, which is roughly the space the top bar has before things get cramped.

Drag-to-reorder thumbnails in MediaHub fields

MediaHub ships with its own custom inputfield and differs slightly from the native inputfield in terms of appearance and functionality. But where the two overlap, I want MediaHub to align with the default experience as closely as possible. Drag-to-reorder is the latest step in that direction; it's a feature I use all the time in stock InputfieldFile. Image focal point is next. My thinking is, the more familiar the UI and workings of the field, the less support you might have for your clients.

Until 1.16, the order of selected assets in a MediaHub field was the order you picked them in. But now, like the native field, you can grab any thumbnail in a MediaHub field that has two or more selected assets and drag it to a new position. And it works in all three view modes: grid, proportional, and detail just like the native field too.

The new order is applied to the underlying PageArray as soon as you Save the page. From your templates, that means $page->yourField->first(), ->last(), and ->eq(N) return assets in the order you arranged them in the admin. No template changes are needed; the order just becomes meaningful in a way it wasn't before.

If you've been sorting MediaHub fields manually in your templates (by upload date, by title, or by a custom field), nothing changes. Sorting an already-sorted PageArray still works; the new feature just gives you a sensible default editor order if you want to use it.

Smaller field and library polish

Two short ones in this area.

The Library's list view now has a master checkbox in the column header. You can tick it to select every row currently rendered, subject to whatever filters and pagination are active. Untick it to clear the selection. Useful when you want to bulk-add a filtered set of assets to a Collection, or bulk-delete the results of a search, without ticking each row individually. Grid and Masonry views are unchanged because their tile layout already supports range-select.

The "Add more" button at the bottom of MediaHub inputfields now matches stock InputfieldFile in font, colour, hover state, and icon spacing. Previously, it had drifted slightly from the native button across AdminThemeUikit, Reno, and Default, which is the kind of thing you don't notice until you put two fields side-by-side. Now they look the same.

This is small, but I believe it matters. A MediaHub field often sits next to a regular file or image field on the same page-edit screen, and the closer the basics match, the less editors have to switch context between them. Drag-to-reorder above applies that principle to behaviour; matching the "Add more" button applies it to chrome.

Better library search

I've made some improvements to the Library search too after some initial user feedback. Searching used to match against the asset title and filename only. That was fine when MediaHub was a thin layer over file uploads, but the module now stores Alt/Description text on every asset, lets you tag assets with Labels, and groups them into Collections. None of that was searchable before this release. Typing the name of a Label and getting zero results when you knew the assets existed could be confusing.

Search in 1.16 now covers four fields:

  • title
  • filename
  • Alt/Description
  • and any matching Label or Collection name.

The matching is the same word-prefix search as before, just over more haystacks. So searching for hero now finds an asset whose Alt text mentions hero, an asset carrying a Label called "hero-2025", or any asset that lives in a Collection named "Hero campaign".

One related fix: searching by exact asset ID was unreliable, sometimes matching and sometimes not depending on what other tokens were in the search box. Searching for an ID on its own (e.g. 1234) now reliably returns that single asset. I'm working on partial search and live search next.

Other fixes

Four smaller fixes worth a mention are:

Filename and title edits in the upload queue are now applied on upload.
If you renamed a file in the queue rows before clicking upload, those edits weren't being transmitted to the server, and the asset would land with the original filename and title. Both fields are now picked up and saved with the new asset.

Duplicating an asset now preserves its Collections and Labels.
Cloning was producing a duplicate with no Collection or Label memberships, which meant editors had to redo that organisational work by hand on the new asset. Both are now copied explicitly. As a related clarification, the duplicate confirmation dialog now mentions that crops are not copied; they can be re-generated on the duplicate, but they don't carry over.

A stray PHP warning in the library view left over from the v1.15.0 Tags → Labels rename has been cleaned up. It was a notice rather than a real problem, but it's now fixed.

A PHP 8.5 deprecation notice in the MediaHub inputfield is resolved. Explicit nullable parameter typing was added in the relevant method signatures. No behavioural change; this is purely future-proofing.

Defensive changes

Four behind-the-scenes improvements that make MediaHub better-behaved under edge cases. Most users won't notice these directly, but they tighten a few loose ends.

Bulk-import is now capped at 500 selections per request. The site-wide Scan and Import tool previously accepted whatever you ticked, which on large sites could mean thousands of images selected and submitted in one request. The result was a single PHP process held open for many minutes, no progress feedback, and no resume path if anything went wrong mid-import. 1.16 caps a single request at 500 selections; if you tick more than that, you get a clear message asking you to import in batches. The cap doesn't reduce what you can ultimately import, just how it's shaped on the server side.

Server-side upload batch limit now matches the configured setting. The Maximum upload batch module setting controls how many files can be queued in a single upload session. The browser side respected the setting, but the server side was hard-capped at 50 regardless. So if you'd raised the limit to, say, 100 to support your team's workflow, the first 50 files in any batch would upload and the rest would silently fail. Both ends now read the same setting.

Upload temp-file cleanup window extended from 60 seconds to 5 minutes. A background job sweeps the upload temp directory to remove orphaned files. On slow connections, or with large files, an in-flight temp file could occasionally be deleted mid-write because the 60-second window expired before the upload completed. The longer window reduces the chance of that happening without holding orphans around indefinitely.

Container pages reinforced as hidden + system on upgrade. MediaHub uses a few hidden pages in the page tree to organise its data (Media Hub, Labels, Collections, Assets, Crops) in the same way that other Modules do. These were always meant to be hidden from front-end navigation, but on a small number of upgrades they could lose their hidden or system status. The upgrade routine now reapplies the correct flags every time, so the containers can't accidentally appear in your site's main nav.

Import by URL: tighter limits

The Import by URL feature lets you paste a public image URL into the importer and have MediaHub fetch the file directly.

It's a convenient way to pull stock photography or external assets into the library without downloading and re-uploading manually. But "fetch a URL on the server" is also a feature with caution needed, especially on shared and self-hosted servers where the same machine might host other applications or sit inside a private network. 1.16 adds three restrictions to make the feature safer.

5 MB per file. Imports from external URLs are now hard-capped at 5 MB. Typical web images are well under this; most JPEG heroes come in under 3 MB and even 8K stock photos are usually under 10 MB. If you need to import something larger, download it manually and use the regular file uploader, which has its own per-instance maximum upload size that admins can tune.

Public URLs only. URLs whose host resolves to a private or reserved IP range (10.x, 172.16-31.x, 192.168.x, 127.x, IPv6 link-local, and so on) are refused. This is a server-side request forgery (SSRF) mitigation. Without it, an admin on a server inside a VPC could (intentionally or not) pull internal-only URLs that the public internet can't reach but the server can. The check runs against the resolved IP, so it can't be bypassed by pointing a public DNS record at a private address.

HTTP and HTTPS only. Other protocols (file://, ftp://, gopher://, and the rest) are rejected on the initial request and on any redirect. PHP's HTTP client supports a wide range of stream wrappers by default, and file:// in particular could be used to read arbitrary local files. Locking the importer to http:// and https:// closes that off.

If a download is rejected, the admin sees a clear error message identifying which restriction was hit, and the failure is logged for debugging. None of these limits affect normal use; they're guardrails for the unusual case.

Download

MediaHub 1.16 is available from the downloads page. The full list of changes is in the changelog.