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 — the one switch 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 the pinned ones set into core's All | Published | Drafts row as links. 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. 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. Changing views needs the type's edit_others_posts capability.
Stale pages. [Pro feature] There is no report page: the Pages list is the report. Pages Plus → Stale pages opens the list with the free plugin's Modified-before filter set to a year ago and the status to published, and whenever that filter is on — from the menu entry, a saved view or 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. One line above the table gives the count, the date and the owners with their counts, each linking to their rows. 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 hierarchical type the plugin serves gets the column and the line; the menu entry is for pages. Owner is the post's author, and the line 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 the column 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: Overview, Change pages, Stale pages, Saved views, Settings and License. Without a key, only Overview and License are on it.
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:
- A connection problem is never reported as a bad key. If the plugin cannot reach the server, it says so in those words. Only the server itself may call a key invalid.
- A brief outage does not lock you out. The answer is cached and re-checked periodically rather than on every page load, and an unreachable server leaves an already-valid site working for a grace period rather than downgrading it instantly.
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 entry disappear, and the columns, filters and Duplicate carry on unchanged.
Settings
Pages Plus → Settings holds one switch, and it is there only while a key validates, since the switch governs a Pro surface: Hide core's Quick Edit where Edit fields is on. Off by default — 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; Bulk Edit is untouched. It is one option, freshet_pagesplus_hide_quick_edit, and uninstalling removes it 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. Uninstalling the plugin removes the table, the views and the licence data.
Next: Extending & internals.