github austinginder/minn-admin v0.31.0

6 hours ago

The ACF release. Advanced Custom Fields is where much of the WordPress world keeps its real content, and until now almost none of it was editable in Minn. Every field group now renders in the editor with no settings to change, and the fields themselves are genuinely editable: repeaters as rows, flexible content as sections, galleries, images, colors, dates, files, rich text, relationships and conditional logic all working the way ACF intends. A theme's options pages gather under a single Site Options entry, ACF blocks open their own settings form, and field groups get a manager and a real builder, with location rules, repeater sub-fields, and import and export that speaks ACF's own JSON.

In the same cycle, contributed by Renan Diaz, the WooCommerce product page takes the shape merchants already know: a readable main column, variations as rows, taxonomy fields that check off in place, and uploads that show their progress.

Added

  • Add a category, tag or brand from the product. Contributed by Renan Diaz. Filing a product used to stop at the terms that already existed, so a new category meant a trip to WooCommerce and back. The taxonomy fields now carry an Add new door that opens a small dialog, where the name is typed on purpose and a category can be given its parent. Enter in the field still refuses to create a category by accident, because a typo in a tree is a mess to undo.

  • Uploads say what they are doing. Contributed by Renan Diaz. Sending pictures to the media library used to show nothing but a spinner, which reads the same at two percent and ninety. The picker now names the file, counts it against the batch and fills a bar as the bytes go out, so a large image on a slow connection looks like progress rather than a hang.

  • Location rules edit in place. The builder now carries ACF's location logic: rule sets that combine with or, rules that combine with and, each a readable sentence (Post type is Videos, User role is not administrator) over the site's real post types, templates, statuses, taxonomies, options pages, blocks and roles. Rules Minn doesn't model stay visible, survive saves untouched, and keep their pointer to ACF.

  • A real field group builder. Opening a field group now lands on its own builder page, the way ACF works: stack fields, click one to configure it inline (label, instructions, required, defaults, choices, placeholders, ranges), add new fields whose names derive from their labels as you type, drag rows to reorder them, duplicate a field with one click, remove, and save the whole group with one button. Field names lock after the first save so stored content can never be orphaned, groups registered in code open read-only, and field types Minn doesn't configure keep an honest pointer to ACF's editor while still listing, reordering and renaming in place.

  • Repeaters build in Minn too. With ACF Pro active, a repeater field opens its own sub-field builder inside the group builder: add text, choice, switch, color and media sub-fields, set the row limits and the add-row button label, then drag to reorder, duplicate and remove them like any other row. Everything saves with the group under the same protections (sub-field names lock after the first save, and a sub-field the builder cannot configure keeps its stored settings). Repeaters nest one level here; deeper nesting stays in ACF's own editor.

  • Field groups move between sites. Every field group exports as the same JSON file ACF's own tools produce, from the group's row menu or its builder page, and an Import button on the Field Groups list takes a file (dropped, picked or pasted) from ACF or from Minn. Minn's import is safer than the original: a group that already exists on the site is updated in place instead of silently duplicated, groups registered in code refuse with a plain explanation, and a file with problems is refused before anything is written. Post types and taxonomies stay in ACF's own tools. Plugin authors get the same two building blocks (a download action and a list import dialog) for their own surfaces.

  • ACF field groups are manageable from Minn. A new Field Groups view under Manage covers the schema work that used to mean a trip to wp-admin: see every group with where it shows and how many fields it carries, create a group against a post type, options page or block, rename, duplicate, activate or deactivate, and move a group to ACF's trash. Add a field from the group itself (text, choices, switches, color, image), then edit labels, defaults, choices and the required flag, reorder, or delete from the Fields view. Nothing here can lose content: deleting a field or trashing a group leaves every saved value in the database, field names are deliberately not renameable, and groups registered in code are shown read-only because their source of truth is the codebase. Anything richer, like conditional logic or repeaters, stays one click away in ACF's own editor.

  • ACF options pages get their own place in Minn. A theme's ACF options page (site-wide settings like footer content or an announcement banner) used to exist only in wp-admin. Each options page now appears in Minn's sidebar under its own name, with ACF's tab layout intact: simple fields edit and save in place through ACF's own storage, and anything richer keeps an honest link to the wp-admin page. Who can see it follows the capability the options page itself declares.

  • ACF blocks open a real settings form. A theme's ACF block used to show only its plumbing in the block inspector: an editable internal name that could corrupt the block, a raw mode value, and none of its actual fields. The inspector now renders the block's own fields (text, choices, switches) with their real labels, edits save back exactly the way ACF stores them, and anything the form cannot safely edit is counted with a pointer to the block editor. The internal wrapper settings are hidden. Plugin authors with the same nested-data block shape can opt in through the new dataForm descriptor.

Improved

  • The product page takes the shape merchants already know. Contributed by Renan Diaz. The product now reads the way the order page does: a main column for what the product is (name, pictures, price, stock, size, attributes, variations) and a sidebar for what it is filed under (published or not, type, taxonomies, linked products), each section its own card rather than one wall of panels. A save bar rises when something changes and offers Discard beside Save, so backing out of an edit is one click and the button is always in reach on a long page. The quick view from the products list takes the same body, stacked into one column.

  • Variations read as a list of what the product sells. Contributed by Renan Diaz. Six variations used to mean thirty input boxes and no answer to the question the card exists for. Each variation is now a row carrying its picture, its name, its price and what is available, and opens its own editor for attribute values, prices, SKU, stock and tracking. The per-variation picture is editable for the first time. The editor works on a copy, so Cancel is a real cancel, and everything still saves with the page's single Save.

  • Categories, tags and brands open into a checkable list. Contributed by Renan Diaz. The taxonomy fields used to be an empty search box that answered nothing until you guessed a term that exists. Clicking one now drops the list with a tick box per row, ticked where the product already sits, and a row toggles without closing the list, so filing a product in four categories is four clicks. Typing still searches the whole site, and every search says it is searching in the space the chevron occupies, so nothing moves when the answer lands.

  • The picture picker takes a folder at a time. Contributed by Renan Diaz. Building a gallery used to mean ten trips through the file dialog, because both the browse button and the drop zone took only the first file. The whole selection now uploads, one file after another so a shared host is not asked for a dozen at once, and the order you picked them in is the order of the gallery.

  • A way back to the product from its description. Contributed by Renan Diaz. Opening a product's long description in Minn's editor used to leave no marked path back. The editor now carries a button naming the product you came from, the same trail the order and subscription pages already leave. A link opened cold shows nothing, because there is nowhere to go back to.

  • Uploading something already installed offers to replace it. Uploading a plugin or theme zip whose folder already exists used to fail with an error; it now shows what's installed against what was uploaded and offers to replace it, the way wp-admin does. Files are swapped; settings and content stay. And when a server hiccup drops the connection mid-install, Minn now says so honestly and refreshes the list instead of reporting a failure that may not be one.

  • The builder's dropdowns match the rest of Minn. Picking a field type or building a location rule now uses the same searchable themed dropdown as the rest of the interface: click to browse the full list, type to filter it, arrow keys and Enter to choose. The native operating-system select menus are gone from the field group builder.

  • Rich-text fields open a real editor. An ACF wysiwyg field now edits in a focused writing dialog: paragraphs, bold, italic, strikethrough, lists and links, with pasted content cleaned the same way the main editor cleans it. It works in the Custom fields panel, inside an ACF block's settings form, and on ACF options pages, so a block built from rich-text fields (a timeline of steps, an embed with a description) and a theme's rich-text footer blocks are finally editable without leaving Minn. Saves respect the same trust boundary WordPress applies to post content.

  • Flexible content edits as sections. ACF Pro's flexible content, the field most theme page builders are made of, used to be the one thing that kept a page in wp-admin. A page's sections now render as a stack of cards in the Custom fields panel and on options pages, each card named by its layout and quoting its first line of text, collapsed so a page of nineteen section types reads as a list of what it holds rather than a wall of forms. Open one and its own fields are there to edit; the add button asks which kind of section first. Sections reorder and delete, and they carry everything with them: a field the card does not show keeps its value through every edit, reorder and removal. A section built on a layout the field no longer offers is kept exactly as it is rather than quietly dropped, and it says so. Designing the layouts themselves stays in ACF's field editor.

  • Repeater fields edit as rows. An ACF Pro repeater now renders in the Custom fields panel as one card per row: edit the text, choice, switch, image and gallery sub-fields in place (a team member's photo picks from the media library right on the row), add rows, reorder them, or remove them, and save with the post like any other field. Rows are careful with what they cannot show: a sub-field the panel does not render (a nested repeater, a relationship) keeps its stored value through every edit, reorder and removal, because saves change only the fields you touched on the rows you kept.

  • Revisions say what changed in the custom fields. A page whose edits all live in ACF fields used to open its own history and read "Identical to the current content", which was not merely unhelpful, it was wrong. A revision now also compares the custom fields, listing what moved (a subtitle rewritten, a set of sections reordered) and counting them in the summary. Structural fields report their shape rather than pretending to a line-by-line diff: "11 sections, 2 edited". Only fields a revision actually recorded are compared, so an older revision from before a field existed never claims the field was emptied. Plugin authors can report their own fields through a new filter.

  • Rows stop counting a field that isn't there. A repeater row said "1 more field per row lives in wp-admin" for a sub-field ACF itself never shows, because its condition points at a field that does not exist inside the row. Rows now count only what is really hidden, so the note sends you to wp-admin for something you can actually find there.

  • Field labels and choices read as plain text. A theme that decorates its ACF labels the way wp-admin allows (an alignment choice prefixed with a dashicon) used to show the raw markup inside the dropdown, and a group nobody had named contributed a stray separator, so its fields read as "· Height". Labels and choices now come through as text, and an unnamed group prefixes nothing.

  • The hex field opens the color picker. A color field's swatch was the only way into the picker, and it is a small target beside a wide box: clicking the box and getting nothing read as a dead control. Clicking anywhere in the field now opens the picker, and typing or pasting a hex still works.

  • Color, image and gallery fields join the editable set. An ACF color field now edits with a real color picker (a swatch synced with the hex value), and an image field gets a real picker: set, replace or remove the image from the media library, in the Custom fields panel, in an ACF block's settings form, and on ACF options pages (a site logo field on Theme Options edits in place). A gallery field opens the same image manager the editor's gallery blocks use: reorder by dragging, replace by clicking a tile, remove, add from the library, or drop files straight in, and the new order saves through ACF's own storage. Gallery fields work on options pages too, so a footer's logo strip edits in place.

  • Plugin settings gather in one place instead of crowding the sidebar. A plugin whose Minn integration is purely a settings screen used to claim its own top-level sidebar entry, so installing a few of them pushed the things you actually work on down the list. Those now gather under a single Site Options entry, each contributing its own tab, and they still save through their own code with their own permissions. A settings screen that genuinely belongs to a subject Minn already groups (a performance plugin sitting with the other performance tools) stays where it belongs.

  • Options pages live in one place. A site's ACF options pages used to arrive in the sidebar one item each, so three of them meant three top-level entries competing with Content and Media. They are now a single Site Options item with every page merged into its tab strip (a page with tabs of its own keeps them; a single-tab page's tab takes the page's name), which reads the way the wp-admin menu it mirrors does. A site with only one options page keeps that page's own name. Each tab still saves through its own page with that page's own permissions.

  • Theme options built from ACF groups unfold into real settings. The common agency pattern (an options page of ACF group fields, each holding toggles, link lists and repeaters) used to collapse into a single "N advanced settings" note. Each group now renders as its own titled section, repeaters edit as the same row cards the post editor uses (add, reorder, remove, with anything a row cannot show preserved untouched), and ACF link fields edit as URL, link text and a new-tab switch, in rows and on their own. Groups nest: a group inside a group joins the same section with a prefixed label (Search Bar · Title), and a group inside a repeater becomes prefixed row columns (Hover · Background Color), stored exactly where ACF keeps them. Saves route through the parent group the way ACF stores it, so subs Minn cannot render survive every save. And when something truly stays in wp-admin, the note now names it instead of only counting it. A footer navigation, contact block, button color variations and logo strip are now editable where they live.

  • A button's link edits from its settings gear. Blocks that keep their link only in saved markup (a Stackable button, a linked card) never showed the URL anywhere in Minn. The block's settings now list its links as editable fields: change the URL, Apply, and every copy of it in the block updates together, with the rest of the markup preserved byte for byte. Links that point at images stay with the image tools, and a link can never be changed into something that runs script.

  • Conditional fields show and hide the way ACF intends. A field group's conditional logic (show the image position only when the banner style is an image banner) is now honored at edit time: rows follow their controlling fields live as you flip a switch or change a choice, in the Custom fields panel and on ACF options pages. When a condition depends on something Minn does not render, it is answered once from the saved values, exactly like ACF's own screen. Hidden fields always keep their values; hiding never erases. Authoring the rules themselves stays in ACF's field editor.

  • Relational fields pick without leaving Minn. ACF's linking fields (Post Object, Relationship, Page Link, Taxonomy, User) used to be the surest trip back to wp-admin. A single-value field now searches as you type and picks from a dropdown; a multi-value field collects picks as chips you can drag into order and remove with a click. The search only ever offers what the field itself allows (its post types, its taxonomy, its user roles), drafts are labeled as drafts, and saves refuse anything outside the field's rules, so a picker can never file the wrong kind of thing. Works in the Custom fields panel and on ACF options pages; plugin authors get the same ordered picker as a documented field type.

  • File fields choose from the media library. An ACF file field (a PDF manual, a sample download) now shows its filename and picks a replacement from the media library with every attachment type listed, not just images. Works in the Custom fields panel, on ACF options pages, and inside repeater rows; only a real attachment can be saved.

  • Date and time fields pick like the rest of Minn. An ACF date field now opens the same calendar popover the editor's scheduling uses (without the content heatmap, which belongs to scheduling), a date-and-time field adds the time row, and a time field takes relaxed typing ("7:30 pm" becomes 19:30). Values save in exactly the format ACF stores, so the field's own display format and every theme reading it keep working, a mistyped value never overwrites a saved date, and clearing is explicit. Works in the Custom fields panel, on ACF options pages, and inside repeater rows.

  • Checkbox and button-group fields join the editable set. An ACF checkbox field (and a select allowed to hold several values) now edits as a list of tick boxes with the field's own choice labels, in the Custom fields panel, in an ACF block's settings form, on ACF options pages, and inside repeater rows. A button group edits as the choice control it is. Saves keep only real choices from the field's list, in order, so a stray value can never sneak into the database.

  • Custom fields show up without the REST setting. The ACF panel used to appear only for field groups with "Show in REST API" switched on, a setting that is off by default and off on most real sites, so the panel usually never rendered at all. Field values now travel through Minn's own channel using ACF's field API, so every field group that applies to the post you are editing renders and saves with no ACF settings to change. Layout elements like tabs and messages no longer inflate the advanced-fields count.

  • Slider and carousel images edit as a gallery. A carousel nested in a column (or on its own) now offers Edit images from its settings gear: reorder slides by dragging, replace by clicking a tile, remove, or add, with the slider's arrows, dots and styling preserved exactly and captions traveling with their slides.

  • Stackable columns edit in place. A Stackable columns block used to render as one untouchable card. Each column is now its own writing surface: type in the text, edit headings and tables where they sit, and blocks Minn cannot safely edit (a carousel, an ACF block) keep their own protected card inside the column, with their own settings gear. Every byte of Stackable's wrappers, styles and ids is preserved exactly on save. Adding or removing columns stays in the block editor, one click away.

Fixed

  • Editing a picture or rich text from the Custom fields dialog returns you to it. Opening a gallery's image editor, a rich-text field's editor, or the media picker from the Custom fields dialog closed the dialog to make room, and finishing dropped you back in the post editor with the dialog gone. The dialog now reopens on its own when the second window closes, applied or cancelled, scrolled where you left it and showing the change you just made. Nothing typed in the dialog is lost along the way.
  • Changing your language is immediate. Saving a language used to wait while every installed plugin and theme fetched its translations from WordPress.org, which on a long plugin list took long enough that the page looked like it had ignored you. Minn switches straight away now and those plugin translations arrive in the background, so the interface is in your language the moment you save. A first switch that still has to fetch the language itself shows a marker in the top bar while it works.
  • A dropdown opened the instant a dialog appears lands in the right place. Clicking a dropdown while its dialog was still animating open put the list about ninety pixels too low, far enough to run off the bottom of the screen, until the animation finished and it snapped back. It now settles into place as soon as the dialog does.
  • Minn tells you when a post type is hidden from it. A custom post type created in Custom Post Type UI without touching its "Show in REST API" setting is switched off there by default, despite that plugin's own help text saying otherwise. The post type then works normally in the old dashboard while being invisible to Minn and to the block editor, which reads as Minn having lost it. System now says so plainly, naming the post types affected, and the Post Types list marks them "Hidden from Minn" instead of a dash that is easy to miss. Turning on Show in REST API from the post type's own settings in Minn fixes it, and the change is written back where Custom Post Type UI keeps it.
  • Escape closes a row's menu. The ⋯ menu on a list row could only be dismissed by clicking elsewhere, so anyone working from the keyboard was stuck with it open over the row it belonged to. Escape closes it now, like every other panel in Minn.
  • The autoload summary says what it is again. The Database card's autoloaded-options section lost its title when System diagnostics was translated, leaving a bare size with nothing naming it. The title is back.
  • A row moved after a save is the row that gets removed. Reordering repeater rows, saving, then removing one used to take a different row than the one whose card was clicked, because the save had changed the stored order underneath. The rows now re-point to their new places the moment a save lands.
  • Two product saves that quietly did nothing now say so. Contributed by Renan Diaz. A sale price at or above the regular price came back from WooCommerce as a success with the sale price silently dropped, on a product and on a variation alike; the page now answers before saving, so the number you typed is either kept or explained. A duplicate SKU inside a batch of variations came back as a success too, with the refusal buried in the response, so a variation could report saved while keeping its old SKU. The refusal now reaches you, along with the free SKU WooCommerce suggests, and a SKU already used by the product or one of its own variations is caught on the page.
  • Custom CSS and JS respects its own code permission when linking changes. A snippet set to load as an external file is the one kind someone without the raw-code permission is allowed to write, because that file is loaded as a stylesheet and cannot escape into the page. Switching that same snippet to load inline used to skip the permission check, since only a language or location change asked for it again. Sites were still protected by WordPress itself, which strips anything executable from those authors, but the check now covers the switch as well. Renaming a snippet, editing external CSS and switching a snippet inline as an administrator all work exactly as before.
  • Order actions apply to the order you opened. Sending an order email, listing its emails or reading its refund state took the order from the request rather than from the address, so a crafted request could aim one of those at a different order than the one being checked. On a standard WooCommerce store, anyone who can reach these can already work with every order, so no store was exposed; the actions now always act on the order in the address they were checked against.
  • Field pickers only answer for the fields you were handed. The address behind ACF's linking fields checked whether you use the editor at all, not which fields were yours, so an author or contributor could point it at any field on the site. Aimed at a user field, it answered with every account on the site, including login names of people who have never published, which WordPress deliberately keeps from those roles. Each picker address now carries a signature tied to you and to that one field, issued only where Minn had already decided to show you the field. Pickers work exactly where they appear and nowhere else.
  • Draft titles stay with the people allowed to edit them. A picker decided who may see unpublished entries by asking one question about blog posts, then let that answer speak for every kind of content the field covered. An editor holds that permission and usually does not hold the matching one for products, so a picker limited to products offered them draft product names that WordPress itself refuses the same account outright. Unpublished entries are now judged per kind of content, and everyone still sees their own drafts.
  • Uploading a plugin that is already installed now offers to replace it. The replacement notice used to never appear on a site with a large plugin list: WordPress unpacked the zip, noticed the folder, then fired a hook that made every installed plugin phone home and crashed the local server before the notice could be sent. Minn now reads the zip's name and version without installing anything, so the Replace confirm shows even when that hook would have taken the server down.
  • Dropdown lists open where their control is. A searchable dropdown that opened near the bottom of a scrollable page could flash at the far left edge of the screen before settling into place. It now opens directly under its control on the first paint.
  • A theme's page-canvas sizing no longer inflates block previews. On themes that pin the page body to the viewport height (a common sticky-footer pattern), every preserved block preview rendered at least a full screen tall, so a 50-pixel spacer filled the window. Preview scoping now drops canvas sizing, and blocks render at their real height.
  • Picking from a long dropdown inside a dialog no longer closes it. When a searchable dropdown's option list reached past the bottom of its dialog, choosing one of the lower options could dismiss the whole dialog and lose what was typed. Dialogs now only dismiss when the click starts on the background.

Don't miss a new minn-admin release

NewReleases is sending notifications on new releases.