Skip to content

v0.5.0

Choose a tag to compare

@austinginder austinginder released this 04 Jul 23:06
· 1190 commits to main since this release

Added

  • Taxonomies manager: The Post Types view gains a Taxonomies tab — every registered taxonomy with its attachments, term counts and owner, editable through the same storage adapters as post types (ACF acf-taxonomy definitions via ACF's own API, Custom Post Type UI's option, or Minn's own store). Create (hierarchical or flat, choose the backend), re-attach to any post types, or remove — terms always stay in the database, and ACF deletions trash recoverably. Core and code-registered taxonomies are read-only. The Post Types modal's taxonomy checkboxes are now dynamic — every assignable taxonomy, not just Categories/Tags.

  • Create redirects (and search them): The Redirects surface gains an Add redirect button — a form for source, target and HTTP status that writes through Redirection's own API — plus a filter box that searches by source URL server-side. Both come from two new generic surface capabilities (create and search), so any adapter can opt in.

  • Tidier surface tables: Columns take an explicit width and a num format (right-aligned, tabular); text cells truncate to one line with an ellipsis instead of wrapping long URLs to three rows, and empty/zero timestamps read "—" rather than "Invalid Date". Redirects now fit source, monospace target, code, hits and last-hit cleanly on one row.

  • More redirect plugins: Drop-in adapters for Safe Redirect Manager and Simple 301 Redirects — list, search, create and delete, each shimmed over the plugin's own storage (SRM's srm_* functions; the 301_redirects option) since neither exposes REST.

  • Image controls: Clicking an image in the editor opens a popover — alt text, caption (created, updated or removed, wrapping bare images in the standard figure), Replace via the media picker, and Remove. Replacing keeps the block honest: the {"id":…} attribute and wp-image-N class follow the new attachment, and stale srcset/sizes/dimensions are dropped.

  • Video & audio blocks: core/video and core/audio join the editable set via attribute passthrough — no longer islands.

  • Query Monitor support: With QM active, Minn's pages get the full Query Monitor experience — a floating summary chip (time · memory · query time · query count) that opens the real QM panel, covering the Minn document request. The integration is a bundled adapter plus minn_admin_template_footer, the one hook Minn's standalone document now fires (deliberately not wp_footer — no third-party injection). Capability checks stay QM's own: users without view_query_monitor get zero QM bytes.

  • Attribute passthrough for simple blocks: Images, tables, quotes, separators, verse and preformatted blocks that carry attributes ({"id":…,"sizeSlug":…} images, styled tables/quotes/separators) are now fully editable instead of islanded — the comment attributes are parked on the element and re-emitted byte-faithfully on save, with Gutenberg's comment-safe escaping. The class-derived hasFixedLayout respects explicitly-written false (newer Gutenberg defaults tables to fixed). Only non-text-flow blocks participate, so contenteditable splits can never duplicate attributes. Cosmetic note: void elements serialize as <img …> rather than <img …/> (HTML-equivalent).

  • Activity chart drill-down: The Overview's activity bars are clickable — a modal lists the events behind the bar (posts and pages published, comments received in that day or week), each row linking to the editor or the Comments view. The overview endpoint now stamps each chart bucket with its GMT bounds, and a new overview/activity endpoint returns the events for a window.

  • Trash: The Content view gains a Trash toggle — see trashed posts, pages and custom post types, restore them (a new posts/{id}/restore endpoint; core REST has no untrash) or delete them permanently, singly or in bulk. Authors see only their own trashed items, matching wp-admin.

  • Menus: A full navigation manager for classic themes (block themes keep the site editor, matching wp-admin) — every menu as a tab, items in their real hierarchy with reorder/indent/outdent controls, inline label and URL editing, add pages/posts via a searchable picker or custom links, theme-location assignment via combobox, and create/rename/delete menus. All through core's wp/v2/menus, menu-items and menu-locations REST — reordering renumbers the whole tree and writes only the items whose order or parent actually changed.

  • Widgets: Classic widget areas as cards — reorder within an area, move between areas, delete, and edit block, text and HTML widgets in place (other widget types keep their settings and can still be arranged). Adding drops in a block widget and opens the editor. Widgets are created and then assigned to their area in a second request — creating straight into a sidebar gets silently swept to inactive by the same request's retrieve_widgets() pass (core #53657 territory).

  • Page attributes in the editor: Pages (and hierarchical post types) get a Page attributes card — a parent picker showing the page tree with the post's own descendants excluded, a template combobox (a new templates endpoint exposes the theme's classic Template Name: templates, which core REST validates against but never lists), and a menu order field. Everything rides the normal autosave. The card appears only when the post type actually supports something: posts see nothing unless the theme registers post templates.

  • New menu: The + New button opens a Post / Page choice (page authors only — everyone else goes straight to a new post), and the ⌘K palette gains "Create new page". New pages get the full Page attributes card before first save, so parent and template can be set as you write.

  • Embeds: Paste a lone YouTube / Vimeo / TikTok / Spotify / X link (any of fifteen core oEmbed hosts) into an empty block and it becomes a core/embed island; the slash menu gains an Embed command that takes any URL. The markup is Gutenberg-byte-faithful (verified with a parse_blocks/serialize_blocks identity round-trip), so the block opens natively in the block editor. URLs inside sentences still paste as plain text, and classic-mode content keeps relying on WP's own autoembed.

  • Galleries: A Gallery slash command opens the media picker in multi-select — pick images in order (or upload straight into the selection) and insert a modern nested-image core/gallery as an island, rendered in place. Editing an existing gallery still hands off to the block editor; creating one no longer does.

  • Core WordPress updates: When a core update is on offer, Extensions leads with an update banner — one click runs the same Core_Upgrader path as wp-admin (maintenance mode, rollback protection), then triggers the database migration step over loopback. Update notifications now land on Extensions instead of bouncing to wp-admin. Gated on update_core.

  • Minn as the default admin: A new General setting — after signing in, users who can use Minn land at /minn-admin/ instead of the wp-admin dashboard. Explicit redirect_to deep links (a plugin page, a specific post) still go where they intended, users without edit_posts keep core behavior, and classic wp-admin stays fully reachable.

  • Comment replies: Answer comments without leaving Minn — a Reply box on every pending and approved comment, posting as you. Replying to a pending comment approves it, matching wp-admin.

  • Media search & filters: The library gains a search box and type tabs (Images / Video / Audio / Docs) — server-side via the media endpoint's own search and media_type params, so it scales past the 48-per-page window.

  • Excerpt: Posts (and CPTs with excerpt support) get an Excerpt field in the editor's Settings card, riding the normal autosave.

  • Your profile: The sidebar account area (and a new ⌘K entry) opens your own profile for any role — display name, email and password, with the role shown read-only when you can't change it. Non-admins finally get a way to update their password without wp-admin; the page reloads after a self password change since the session token (and REST nonce) rotates. A self display-name edit updates the sidebar immediately.

Improved

  • Real pagination: Every list view — Content, Media, Comments, Orders, Users and all adapter surfaces — replaces the append-only "Load more" button with numbered pagination (‹ 1 … 4 5 6 … 20 ›) plus a "page X of Y" count, jumping back to the top on page change. Content's type tabs now filter server-side (each tab is its own query instead of a client-side sieve over merged pages), which also makes them accurate on large sites. The wp.org install dialogs keep "Load more", where appending suits browsing.
  • Editor says what it's editing: The topbar pill reads "New page" / "Post · Published" instead of a bare status, and the title placeholder follows suit ("Untitled page") — a blank new page and a blank new post are no longer indistinguishable.
  • Add-plugin dialog: wp.org search results paginate — a "Load more" row appends the next page (with the running count of 2,500-odd results) instead of stopping at twelve, keeping your scroll position instead of snapping back to the top. Plugin-name cleanup handles more tagline junk: attached colons ("UpdraftPlus: WP Backup & Migration Plugin"), sentence periods ("CleanTalk Anti-Spam. Spam Firewall…"), comma lists ("SmartCrawl SEO checker, analyzer & optimizer") and "by Vendor" suffixes — the vendor only comes off when a multi-word name remains, so "Login by Auth0" survives while "GEO Plugin by Squirrly SEO" trims. The untouched full name stays as the row's tooltip, and the same cleanup already runs across the Extensions list.
  • Swappable overview chart: When an analytics adapter provides traffic, the chart no longer hides the Activity view — a ⇄ button in the chart header swaps between Traffic and Activity (with its clickable drill-down bars), and the choice sticks across visits. Recent activity trims to four entries so the two dashboard cards line up.
  • Searchable Forms and Activity Log: The Gravity Forms surface gains a filter box that searches every field of every entry (per-form tabs included), and Simple History's Activity Log gets free-text event search — both server-side through each plugin's own REST API. Gravity Forms takes its search criteria as a JSON string, so the generic surface search capability now accepts a JSON-criteria form alongside the plain {q} query template — any adapter can use either.
  • Revision authors: The editor's History card now shows who made each revision. (Revisions expose an author ID but no embeddable link, so names resolve through the users endpoint — the previous _embed approach could never work.)
  • Tag autocomplete: The editor's tag input uses the combobox — click to browse existing tags with usage counts, arrow/click to pick; plain Enter still creates exactly what you typed as a new tag.
  • Site icon as favicon: Minn's pages now use the site icon (settable from Minn's own Settings) as their favicon when one exists.

Fixed

  • Stale content loads: A content request still in flight when the filter context changes (trash toggled, search typed, taxonomy picked) is now discarded instead of landing rows from the old context into the new view — which in trash mode could have decorated live posts with Restore/Delete-permanently buttons.