Freshet Studio Pages Plus

What Pro adds

The columns, the path line, the filters, path search and Duplicate are free, and stay free — they are the plugin. Nothing in the free download is locked, limited, time-barred or nagged at. Pro is for larger sites: move, re-template and republish whole branches with a preview before anything changes and an undo after; take the tree with you as CSV, JSON or an outline; copy a branch; save the views you keep coming back to; see what nobody has touched since.

The six

Bulk changes, with a preview and an undo. [Pro feature] Tick pages on the list and pick Change… from the bulk actions. The batch screen takes the action and its value — parent, template, status, author, a term, a password, or publish / unpublish a whole subtree — and shows the dry run first: every page's before and after per field, the path it has now and the path it would have, and any conflict that stops a row (a page moved under its own descendant, a template the theme does not offer, a private branch about to go public, the front page about to go dark). A row with a conflict is shown and skipped; the rest of the batch applies. Apply writes the batch and stores what it overwrote, and the notice on the list carries an Undo. An undo is a batch like any other — previewed, applied, stored, undoable — and it refuses a field that has changed again since, rather than silently discarding the newer change. Content, excerpt and title are never touched by a batch, so they are never stored.

Edit fields in the row. [Pro feature] An Edit fields row action opens a form under the row with every field core's Quick Edit offers on a page — title, slug, date, author, password or private, parent, order, template, comments, status — laid out as Quick Edit lays them out. Every change asks for a dry run, so the new path, each field's before and after and any conflict are on screen before Save. Save goes through the batch engine as a batch of one — the same snapshot, the same Undo — and the row reads Changed — Undo until the page is loaded again. Core’s own Quick Edit stays beside it unless you switch it off — one of the two switches on Pages Plus → Settings, below.

Tree export. [Pro feature] An Export control in the list's own filter bar: the list as CSV, JSON or a Markdown outline — the whole tree, or exactly the view the filters left on screen, since every filter the list runs on shapes the export unchanged. Paging does not: the export carries every row the view matches, never the twenty on screen. A hierarchical type without a chosen sort exports in tree order, nested as the screen nests it; with a sort chosen it keeps the list's order, flat. Copy as text gives the same outline in a textarea, for a message or a ticket. CSV is RFC 4180 with a UTF-8 BOM so spreadsheets read the encoding, and a cell a spreadsheet would run as a formula is neutralised; JSON is a flat array of rows, the path column carrying the hierarchy.

Duplicate a branch. [Pro feature] A Duplicate branch row action on any page with children, and the same entry on the batch screen for a selection of roots. Both land on the preview first: every page that will be created and the path it will land on — a sixty-page copy under the wrong parent is exactly what the preview is for. The root lands beside the original, at the top level, or under any page of the target type; only the root's slug can collide, and where it would, the copy is numbered the way core numbers slugs, shown in the preview rather than refused. Each page goes through the free plugin's own Duplicate, so terms, template and meta come along the same way; every copy is a draft. Undo of a copy is not in this release — the copies are drafts, trash them — and the batch row says so.

Saved views. [Pro feature] The filter combination on screen — status, parent, template, path search, Modified before, author, taxonomy, sort — kept under a name, per post type, and offered on every post type the plugin serves. Five ship with it — Stale, Recently changed, Drafts, Pending review and, where content nests, Top level — and you save as many of your own as you like. A view that ships is not a separate class of thing: it carries no “built in” tag, it renames and it deletes like any other, and a removed one stays removed. Only its query is still computed on every read, which is how Stale’s “a year ago” stays a year ago. Pages Plus → Saved views is where a collection is looked after: every view you can see in one table — its name, its post type, its scope, what it filters by in words and whether you have pinned it — sortable by name, post type or scope, with Open, Rename, Pin / Unpin, Make global and Delete on each row. A view whose vars no longer resolve — a template the theme dropped, a parent since deleted — stays, and the control says what no longer resolves, so you decide, not the plugin. Pinned views carry no count on purpose: a saved view is an arbitrary filter set, and counting it would be one query per pinned view on every load of the list.

Whose view and whose menu are two different questions. A view you save is Personal — only you see it, which is what makes it safe to keep a working mode nobody else needs. Make global hands it to the site and every editor sees it; the five that ship are global already. Promotion is one way: there is no Make personal, so a global view goes by being deleted rather than demoted, and can never quietly take a colleague’s working mode away. Promoting, renaming or deleting a global view needs the type’s edit_others_posts (edit_others_pages on pages); saving one of your own needs only the right to edit content. A pin is yours alone: it puts a view beside All | Published | Drafts on the list and under the Pages Plus menu itself, grouped by the list it belongs to — and it is kept on your own user account, so two editors keep two different sidebars and two different filter rows on the same list, and unpinning takes a view out of yours without touching anyone else’s. Stale ships pinned; the rest you pin yourself.

Stale pages. [Pro feature] There is no report page and no menu entry of its own: the Pages list is the report. Stale is one of the views that ship with the plugin — the list with the free plugin’s Modified-before filter set to a year ago and the status to published — and it ships pinned, so it is in the filter row and on the Pages Plus menu until you unpin it. Whenever that filter is on — from the view, from a view of your own, or from the date field in the toolbar — the list carries what a report would. A Stale column after Modified says on each row why it is there: how long it has gone without an edit, whose it is, with that owner’s share of the stale set linked to their rows alone, and, where WordPress recorded one, who last saved it in the editor. Everything else is the list’s own: the date and the status are the toolbar’s controls, the author filter is core’s, the export is the tree export’s exactly the filtered view, and the bulk actions are one tick away. Every post type the plugin serves gets the view and the column, and the view is offered only to an editor who can edit other people’s content, since what it answers is a question about everyone’s. Owner is the post’s author, and the column says so: WordPress records who last edited a page for editor saves only — a move, a template change, a batch from this plugin leave no trace of who did it — so it shows that name when there is one and never claims more.

What that means for the free version

The six are additions, not limits on what is there. The columns, the path line, the filters, path search and single-page Duplicate stay exactly as they are, free, with nothing in the free download pointing at a thing it will not do.

Two downloads, and why

The version on wordpress.org contains no licensed code at all — not the features, not the licence client, not the License tab. There is nothing in it to unlock, so there is nothing in it advertising a thing it will not do. The version downloaded from freshet.studio is the one that carries the licensed features, and it adds a menu of its own, Pages Plus, right below Pages. Under it: the Overview, and then the views you have pinned — nothing else, because four labels naming screens are worth less sidebar space than the working modes you actually open. The plugin’s own screens carry a tab row of their own instead — Overview, Saved views, Settings, License — and the Overview lists every tool with a sentence each, Change pages among them, so nothing is reachable in one place and invisible in the other. Without a key the menu is the Overview, and its tab row holds Overview and License.

That build without a key is not crippled: it is the free plugin plus a place to enter a key.

Requirements

Pro needs PHP 8.1 or newer; the free plugin keeps its 7.4 floor. On an older PHP the freshet.studio build shows one notice in wp-admin saying so, loads none of the licensed code, and the free features keep working — nothing breaks, and nothing is half-loaded.

Getting a key

A key is bought from freshet.studio, where checkout runs through Stripe. On payment the key is shown on the confirmation page and emailed to the address the payment was made with. A Pages Plus Pro licence is per year: it covers every site you build on, with updates and support for as long as it runs, and it renews on the date your key email states. Cancel any time by replying to that email from the address you paid with; the licence runs until the end of the year you paid for, after which the Pro features switch off and the free plugin keeps working. The terms have the rest, including what happens when a renewal payment fails.

Activating

Enter your key on Pages Plus → License and press activate. The plugin asks the licence server to activate this site and reports the server's own answer.

Two behaviours worth knowing:

With no key entered, the plugin makes no network request at all — not on activation, not on any admin screen.

Removing the key returns the site to the free feature set immediately: the bulk entry, the batch screen, the row actions, the export, the views, the Stale column and the Settings screen disappear, and the columns, filters and Duplicate carry on unchanged.

Settings

Pages Plus → Settings holds two switches, and it is there only while a key validates, since both govern Pro surfaces. Hide core’s Quick Edit where Edit fields is on — off by default, so the two row actions sit side by side; on, the Quick Edit link is left off the rows that carry Edit fields and nowhere else, and Bulk Edit is untouched. Leave WordPress’s own status links off the filter row — also off by default; on, Published, Scheduled, Sticky, Drafts, Pending, Private and any status another plugin registers come off that row on every post type and your pinned views stand in their place, on the ground that a view says the same thing better. All, Mine and Trash stay either way. They are two options, freshet_pagesplus_hide_quick_edit and freshet_pagesplus_hide_status_links, and uninstalling removes them with the rest.

What is stored

Every applied batch is one row in a table of its own, {prefix}freshet_pagesplus_batches, holding what the batch overwrote and what it wrote, both keyed by post ID. The table is created on the first load after activation and is not gated on the key: a batch applied while the key was valid keeps its Undo across a lapse and a renewal. The newest 100 batches per site are kept; older ones go when a new one is inserted, and an Undo asked of a batch that has left the record says so rather than guessing — the pages are as they were left, and you change them by hand. Saved views live in one option, freshet_pagesplus_saved_views, not autoloaded, and what a site changed about a view that ships — renamed, or removed — in a second one, freshet_pagesplus_view_presets, so a preset the plugin improves in a later release still reaches every site that never touched it. Your pins are not there at all: they are user meta, freshet_pagesplus_pinned_views, per post type. Uninstalling the plugin removes the table, the views, every editor’s pins, the two switches and the licence data.

Next: Extending & internals.