Description
Most gallery plugins let you group photos into albums and stop there. JMarzTech Gallery treats every photo as a record you can describe, search, and filter, then gives you the tools to edit hundreds of them at once.
Displays can be duplicated, and the look of one display can be copied into another, so a set of galleries that share a style takes minutes rather than repeated fiddling.
Built for family archives, historical collections, portfolios, event photography, and any library that outgrew folders.
Describe photos with your own fields
Define whatever fields your collection needs. Location, People, Album, Year, Date taken and Tags are set up for you, and you can rename them, remove them, reorder them, or add your own.
Fields can hold text, numbers, dates, or tags (many values per item, such as people or keywords). For each field you choose whether it appears as a table column, a filter, on the item page, and in captions.
Edit hundreds of photos at once
The library has two views. The table view works like a spreadsheet: rows are photos, columns are your fields, and clicking any cell edits it in place. Press Enter to save, Tab to move to the next cell. The grid view shows thumbnails for visual work.
Select any number of photos and the bulk editor appears. Set a field across every selected photo in one action. For tag fields you can add, replace, or remove values without touching the rest.
Upload in batches, not one at a time
Drag a folder of photos onto the upload screen. They upload with progress bars while a side panel applies shared metadata to the whole batch, so a hundred photos from the same trip get tagged once instead of a hundred times.
Images already in your Media Library can be pulled in through a picker, or added automatically as they upload.
Displays: build once, use anywhere
A display is a saved combination of a query and a layout. Choose which photos appear by filtering on any field, then choose how they look: grid, masonry or list, columns, spacing, corner radius, crop, caption fields, caption position and separators. List view can show the photo as a thumbnail or as a wide banner with the text beside it, one or two rows across, and the banner can be anything from a slim strip to a 4:3 photo. Create as many displays as you like.
Turn on visitor controls and your display gets a search box, filter dropdowns, sorting and pagination on the front end. Filters in use are outlined, so visitors can see what is narrowing the results.
Show a display with a shortcode:
[jmzg_gallery id="1"]
Or skip saved displays and query inline with any field as an attribute:
[jmzg_media album="Italy 2019" columns="3" limit="12"]
Searchable front-end archive
Every field marked filterable becomes a front-end filter. Your archive gets full-text search across titles, text fields and tag names, plus per-field dropdowns and sorting. Tag fields get their own archive pages automatically, so a URL like /photos/people/grandma/ just works.
Item pages
Every photo gets its own page with its fields, related items and a lightbox. Choose Classic (image left, details right), Stacked (image full width, details underneath) or Minimal (image, title and caption only) under JMGallery, Settings. Previous / next links and comments can be switched on there too.
Choose what size visitors get
The “largest size shown publicly” setting caps the image size used on item pages, in the lightbox and in the srcset, so your original files never appear in the page.
Videos
Video is part of JMGallery Pro: YouTube and Vimeo links or your own uploaded video files, described with the same fields and shown in the same galleries. A library that already contains videos keeps listing, filtering and exporting them here; they display as their poster image.
Your data stays yours
Export the whole library to CSV, one column per field, and open it in Excel or Google Sheets. Everything is stored in standard WordPress posts, post meta and taxonomies, with no custom database tables.
Works with your theme
Classic and block themes are both supported. Templates can be overridden by copying them into your theme.
Pro add-on
JMGallery Pro is a separate plugin, sold and distributed outside WordPress.org, that adds video (YouTube, Vimeo and uploaded files), six more item page layouts, watermarking, more field types, caption typography, backgrounds, hover effects, visitor downloads, buy buttons, CSV import and an Elementor widget. None of its code is included in this plugin, and everything described above works without it. Details at https://jmarztech.com/gallery/pro/
Source code
Everything in this plugin is the source: the JavaScript and CSS in assets/ are written by hand and shipped unminified, and there is no build step, bundler or generated file. Edit them directly.
External services
This plugin makes no external requests. Nothing about your site or your photos is sent anywhere, and the admin screens load no third-party assets.
Screenshots







Installation
- Upload the plugin through Plugins, Add New, Upload, or install it from the WordPress plugin directory.
- Activate it.
- Go to JMGallery, Upload and drag in some photos.
- Visit JMGallery, Fields to adjust the metadata fields for your collection.
- Build a display under JMGallery, Displays, then paste its shortcode into any page.
If your archive page returns a 404, visit Settings, Permalinks and click Save once.
FAQ
-
Does this replace the WordPress Media Library?
-
No. Your files stay in the Media Library exactly as they are. This plugin adds a record for each one so it can carry metadata, appear in searches and be displayed. Deleting a gallery item does not delete the underlying file unless you ask it to.
-
Can I add my own fields?
-
Yes, that is the core of the plugin. Go to JMGallery, Fields and add whatever you need. Nothing is hardcoded.
-
What happens to my data if I remove a field?
-
The field stops appearing, but the stored values remain in the database. Adding the field back restores everything.
-
Can I bulk edit metadata?
-
Yes. Select photos in the library and use the bulk editor. Every change applies to all selected items at once.
-
Does it work with block themes?
-
Yes. Archive and single templates are registered as block templates and are editable in the Site Editor. Classic themes load PHP templates, which you can override from your theme.
-
Is anything deleted when I remove the plugin?
-
Not unless you ask. There is a setting under JMGallery, Settings to remove all gallery data on uninstall; it is off by default. Your image files in the Media Library are never touched either way.
-
Will it slow down my site?
-
Front-end pages load one small stylesheet and one small script, only on pages that actually contain a gallery. The admin app runs separately and is never loaded for visitors.
-
Can I stop visitors saving my photos?
-
Not completely — a browser has to download every image it displays, so anything on screen can be saved or screenshotted. What you can control is which file gets published. The “largest size shown publicly” setting caps the lightbox, the item page and the srcset, so the original never appears in the markup; visitors get the preview size you chose, and the full file only leaves your site through a download or a sale.
-
Is it good for SEO?
-
Gallery pages are ordinary WordPress pages, so your SEO plugin handles them as usual. The plugin adds alt text from each item’s title where the image has none, and points filtered or sorted archive views at a single canonical URL so you are not indexed many times over for the same photos.
-
Can developers extend it?
-
Yes. Field types, display options, settings, caption markup and front-end output all pass through documented filters and actions. See docs/hooks.md in the plugin folder.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“JMarzTech Gallery” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “JMarzTech Gallery” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
3.15.1
- Markup that add-ons return through this plugin’s filters (captions, buttons, players, filter controls, item page blocks) is passed through wp_kses before it is shown.
- Deleting items in bulk needs permission to delete each item, and deleting the image file too needs permission to delete that file.
- The library and CSV export list private items only for users allowed to read them.
- JavaScript and CSS reformatted for readability; the readme now states there is no build step.
3.15.0
- Every name this plugin stores or registers now uses the prefix “jmzg_” (post type, post meta, taxonomies, options, shortcodes, hooks, script handles). On its first load the update renames existing data in place, including the [jmz_gallery] and [jmz_media] shortcodes in your pages and Elementor layouts. Use [jmzg_gallery] and [jmzg_media] from now on.
- “Largest size shown publicly” is now a setting in this plugin, under JMGallery, Settings.
- Item page layouts beyond Classic, Stacked and Minimal are supplied entirely by add-ons; the admin no longer shows disabled previews of add-on features.
- Adding images from the Media Library checks that you may edit each image, and items are published only for users allowed to publish; others create them as pending.
- Fixed a fatal error on PHP 7.2 to 7.4 (str_contains).
- The display builder’s preview page enqueues its stylesheet instead of printing a style tag.
3.14.5
- Active filters are outlined in the toolbar, so visitors can see what is narrowing the results. Recolour with the
--jmz-activeCSS variable.
3.14.4
- Visitor filters only offer values the gallery can actually show: a video-only gallery no longer lists albums that hold no videos, and every count is for that gallery alone. Prices and other formatted values read as they do elsewhere, so 1.5 shows as $1.50.
- Hero layout: on a video item the title and fields now sit under the player instead of over it, so they no longer cover the video or block its controls.
- Fixed: the display builder’s Preview showed the site’s front page instead of the gallery on sites running a coming-soon or maintenance plugin or a page cache. The preview is now served from the admin side, which those leave alone.
3.14.3
- Fixed: an admin screen left open for a day or more showed “Cookie check failed” on every filter, edit or save, because WordPress’s security token had expired. The plugin now fetches a fresh one and retries, and asks you to reload only if you have actually been logged out.
3.14.2
- The Library’s Status column reads “Published” and “Draft” rather than WordPress’s internal “publish” and “draft”.
- Date fields refuse years before 1800. Typing only two digits into a browser date box saved “25” as the year 0025; the Library, bulk editor, upload panel and REST API now reject it with a message, and a refused date leaves the stored value as it was.
- Counts, buttons and headings that cover photos and videos alike now say “items”: “5 items selected”, “Which items”, “Max items”, “Items per page”, “Create items”. Wording that is about the picture itself, such as “Photo shape”, is unchanged.
- Upload screen: Media Library titles containing symbols such as × now display as the symbol rather than “×”, and a card only repeats the file name when it differs from the title.
- Fields screen: preset options appear only for tags and single-choice fields, where they do something, and the “changing type does not convert existing data” warning shows on a row only when its type is actually changed.
- Display builder: when a Pro item page layout is chosen but Pro is not running, “Click opens” now says the site is showing Classic instead of naming a layout visitors cannot see. The locked Hover preview lists the current seven effects, and the caption separator example shows its spaces.
- Visitor filters: a date field is offered as a list of the years it holds, with a count for each, instead of an unlabelled day picker that rarely matched anything. The sort direction reads “Descending” / “Ascending” rather than a bare arrow. Filters for fields nobody has filled in, or for Pro field types while Pro is inactive, are left out instead of showing as empty text boxes.
- Elementor: a JMarzTech Gallery widget already on a page no longer disappears when JMGallery Pro is deactivated. It keeps showing its saved display, and the Elementor editor says Pro is needed for the widget’s own styling.
- Settings: when the saved item page layout needs Pro and Pro is not running, the layout picker says item pages are showing Classic. The locked Image protection preview shows the watermark actually in effect rather than a fixed example.
- Without JMGallery Pro running, the largest image size shown publicly uses the default, large, instead of whatever size was last chosen in Pro, so a site is never stuck on a size it cannot change. The saved choice is kept and applies again when Pro is active. Saving settings without Pro no longer resets that choice.
- Hero layout: a deeper shade behind the text so titles, field labels and the breadcrumb stay readable over bright photos, and the Download and Buy buttons keep their own colours instead of turning white on white.
- Catalog layout: the image and the field table now span the same width as the related items beneath them, instead of sitting in a narrower centred block with the related row sticking out on both sides.
- Fixed: on the Classic, Catalog and Minimal item page layouts a YouTube or Vimeo item showed no player at all, because the embed had no width of its own in a column that sizes to its content.
- Fixed: filtering on a number with decimals, such as a price of 1.99, found nothing, because WordPress compared it as a whole number.
- A display or Elementor widget set to one media type (photos only, say) no longer shows the visitor’s photo/video switch reading “All media”, and a visitor can no longer use that switch to bring back the types it excludes.
- Block themes: the Site Editor lists the plugin’s templates as “Gallery Archive” and “Single Gallery Item”.
3.14.1
- The URL setting for a single item is now labelled “Item slug” rather than “Single photo slug”, matching “item page” everywhere else. The setting and its value are unchanged.
3.14.0
- Gallery items are now called “Gallery Items” rather than “Media” throughout WordPress. Two things called Media — this plugin’s and WordPress’s own Media Library — made admin columns, menus and Elementor conditions impossible to tell apart. Labels only: nothing about your library, its URLs or its data has changed.
- The Library table’s Title cell gains a pencil on hover that opens the item in the WordPress editor. Clicking the cell itself still renames in place — click the title, type, press Tab to move down the column.
- Library table thumbnails are larger, so a photo can be recognised while renaming it.
3.13.1
- The related items heading now names the field they have in common — “Related by Album”, “Related by Tags” — so a visitor can see why those items are there. It reads “Related items” if that field has since been removed.
3.13.0
- “Photo page” is now “Media page” throughout the admin, since these pages carry videos as well as photos. Nothing about how they work has changed.
3.12.1
- Fixed: every photo page layout rendered at the same full width, so the image and its details were pushed to opposite edges of the page. Each layout now has its own measure.
- Classic and Catalog: the details sit beside the image instead of across the page, and Catalog is centred.
- Minimal: the block is only as wide as the photo, so the title sits directly beneath it.
- Card: the photo is centred in the frame and the field list is centred as a block, with the buttons still left.
- Filmstrip: the thumbnail strip now has a “Related items” heading.
3.12.0
- New setting: allow comments on photo pages, off by default. WordPress records the comment setting on each item as it is created, so turning comments off under Settings > Discussion never reached items added before that — this switch covers the whole library at once.
- New setting: show previous / next links on photo pages, off by default.
- Previous and next links now sit together under the image instead of being pushed to opposite edges of the page.
3.11.5
- Saving Settings now confirms itself next to the Save button rather than only at the top of the page, which was out of view on a long form. The button shows progress, then “Saved”, and says so plainly if a save fails.
- The “visit Permalinks” reminder now appears only when a slug actually changed.
3.11.4
- Fixed: saving Settings ignored which photo page layout was selected and always stored the last one in the list, so a new choice looked like it reverted.
- A layout can now only be changed by a save that carries one, so other settings screens can never reset it.
3.11.3
- The selected photo page layout is now unmistakable: a tick, a tinted card and a thicker border, driven by CSS rather than script. A reminder appears until you save the change.
3.11.2
- Fixed: picking a layout in Settings did not highlight the one you clicked until the page was reloaded.
- Fixed: the photo page stretched the image to fill its column whatever size was published, so choosing a smaller “largest size shown publicly” made the photo blurry instead of smaller. The image now renders at its own size, still shrinking to fit on narrow screens.
3.11.1
- The display builder’s “Click opens” setting now shows which photo page layout is in use, and links straight to it, when a click opens the photo page.
3.11.0
- New setting: Photo page layout. Choose how a single item’s page is arranged — Classic (image left, details right), Stacked, or Minimal — from Settings. Six more layouts come with JMGallery Pro.
- Each layout only rearranges the pieces the item page already had, so nothing about your library changes and the fields shown are still the ones ticked as “Show on page”.
- New installs use “gallery-item” as the item URL slug rather than “photo”, which fits video as well as photos. Existing sites keep the slug they have.
3.10.1
- “+ New display” now sits at the top of the Displays list and stays pinned there while you scroll, instead of hiding below every display you own.
3.10.0
- The original image is no longer published in the page markup: the lightbox, the photo page and the srcset are capped at a display size. Choosing which size, and watermarking, are in JMGallery Pro.
3.9.0
- New setting: the largest image size shown publicly. It caps the lightbox, the photo page and the srcset, so the untouched original is no longer published in the page markup where a right-click could reach it. Downloads keep their own size setting and are unaffected.
3.8.0
- The Displays list gets a search box and a sort order (name, recently edited, oldest first) once you have more than five, and every row shows its shortcode — click to copy.
- Deleting a display now tells you first if it is used on any pages, so a live page is never broken by accident. Shortcodes in post content, in Elementor’s shortcode widget and in the Elementor gallery widget are all found.
3.7.1
- Settings that do nothing for the chosen layout style are now greyed out rather than left looking active: Columns in list view, which uses Rows across instead. Caption position in list view now says that only “No caption” changes anything there.
3.7.0
- Gallery images now fall back to the item’s title for alt text when the attachment has no alt of its own, which helps screen readers and image search. An attachment’s own alt is always kept, and a title that is just the filename is not used.
- Filtered, searched, sorted and paged archive views now carry a canonical tag pointing at the plain archive, so search engines index one page instead of every combination of filters. Yoast, Rank Math, AIOSEO and SEOPress are corrected through their own canonical filters.
3.6.3
- Fixed: after closing the lightbox the page could not be clicked. The closed overlay stayed in the page and kept catching clicks. Present since the lightbox was added.
- The lightbox now also closes when you click the empty area around the photo.
3.6.2
- The Photo shape control now stays visible for the whole list style, greyed out when the thumbnail arrangement is selected, instead of disappearing.
3.6.1
- Wide list photos can be set to a shape, from a slim 6:1 strip through to 4:3, instead of always being 16:9.
3.6.0
- List view has two arrangements: the photo as a thumbnail on the left, or wide with the text beside it. Either can run one or two rows across.
3.5.0
- Displays can now be duplicated, and one display’s layout, captions and visitor controls can be copied into another without touching which photos it shows.
- The square-crop option now appears only for the grid style, where it applies; masonry and list always keep each photo’s own proportions.
- Video has moved to JMGallery Pro. Libraries that already contain videos keep listing, filtering, displaying and exporting them; they show as their poster image.
- This plugin now makes no external requests at all.
- Fixed: galleries placed with a shortcode stretched every photo to the same enormous height whenever square-crop was off. Affected masonry, list and both above/below caption positions.
- Fixed: list view with the caption above the photo put the text in the thumbnail column and the photo in the wide one.
3.4.3
- Fixed: in the library table the column header covered the first row, and did not stay in view while scrolling. It now sits above the first row and sticks under the admin bar on every screen size.
- Fixed: headers with a “Pro” badge sat slightly lower than the others.
3.4.2
- Without JMGallery Pro installed, its options now appear as disabled previews marked “Pro”, so it is clear what the add-on adds. Fields that use a Pro field type are marked too.
- Fixed: disabled dropdowns showed a repeating arrow pattern.
- Fixed: checkboxes in the Import / Export panels stretched across the full width.
3.4.1
- Fixed: dropdown arrows overlapped the text in the admin app, and dropdowns were taller than the search box.
- The admin app title now shows the running version.
3.4.0
- Saved displays are unlimited.
- Paid features now live entirely in the separate JMGallery Pro add-on. This plugin contains none of their code.
- New extension hooks for field types, display options, settings, captions and front-end output (see docs/hooks.md).
- Fields keep their stored type and data even when the code for that type is not loaded, and saving never rewrites them.
- Display builder: added the visitor photo/video switch, which was previously only settable in code.
- Fixed: tag archive pages such as /photos/people/grandma/ showed every item instead of only the tagged ones.
- Fixed: a single-choice field could end up with two values after a bulk “add”.
- Fixed: the display builder could save a caption style setting as a caption field.
- Fixed: the display preview could show stale CSS after an update.
3.3.0
- Restyled the plugin’s own admin screens to match JMarzTech branding.
- The heading typeface is bundled with the plugin, so no external requests are made from your admin.
3.2.0
- Groundwork for the separate Pro add-on.
3.1.1
- Fully translatable, with a POT file included.
- Hardened the display preview: it now uses a short-lived server-side token instead of passing configuration in the URL.
- Escaping, sanitisation and caching pass across the whole plugin ahead of the WordPress.org listing.
- Added an uninstall routine, off by default, that can remove all plugin data when you delete the plugin.
3.1.0
- Video support. YouTube or Vimeo links can sit alongside photos in the same gallery.
- Poster images and titles are pulled in automatically when you paste a YouTube or Vimeo link.
- Videos play in the lightbox without leaving the page, and get a play badge and duration on their tile.
- New media-type filter in the library, in saved displays, and optionally for visitors.
3.0.0
- Renamed to JMarzTech Gallery. Existing data migrates automatically on activation.
- New: caption position above the photo.
- New: separate separators for values within a field and between fields.
2.0.0
- Rebuilt around a single admin app with a spreadsheet-style library.
- Added user-defined metadata fields, batch upload with shared metadata, saved displays and shortcodes.
