JustFlows

De documentatie is voorlopig alleen in het Engels. De rest van de site volgt uw taal.

Permalinks

Choose a post URL preset or a custom token structure, set per-type and taxonomy bases, and pick a trailing-slash policy. Previous URLs 301 to the new ones.

6 min leestijd

Admin → Settings → Permalinks. Existing sites default to /%postname%/ without a trailing slash, so their current URLs do not move. Settings are stored in the existing site settings table — no migration — and the contract is identical on PostgreSQL, MySQL, and MariaDB.

Structures and tokens

Post presets are Plain (/?p=%id%), Day and name (/%year%/%monthnum%/%day%/%postname%/), Month and name (/%year%/%monthnum%/%postname%/), Post name (/%postname%/), and Numeric / ID (/archives/%id%/). Justflows content IDs are UUIDs, so the Plain and Numeric / ID presets carry UUIDs, not WordPress integer IDs.

A custom structure must start with /, contain %postname% or %id%, and use only the documented tokens and literal path segments. Query strings are supported only by the Plain preset. Unknown tokens, traversal, repeated separators, fragments, and reserved platform paths are rejected.

TokenValue
%postname%Content slug
%id%Content UUID
%year% / %monthnum% / %day%UTC publication date; creation date for an unpublished preview
%category%First assigned term slug in the category taxonomy (ordered by slug then ID); uncategorized if none
%author%Author ID; unknown if none
%type%Registered content type slug

/%type%/%category%/%postname%/ gives /post/news/launch/. Republishing a post preserves its original publication date, so editing it does not move a date-based URL.

Per-type and taxonomy bases

A per-type base such as shop/products produces /shop/products/ceramic-mug. Without a base, pages and custom types keep their root-level slug; bases have no leading or trailing slash. Category and tag bases default to category and tag, and registered custom taxonomies can carry their own. Archive pages list content assigned through the existing terms and content_terms tables — this screen only configures URLs; term creation and assignment belong to the extension that manages the taxonomy.

Locales and trailing slashes

The locale prefix precedes the configured structure. The default locale is unprefixed; other active locales use their exact locale tag, e.g. /nl-NL/2026/09/07/lancering/. Explicit default-locale prefixes and alternate casing redirect to the canonical URL, and the configured homepage stays at the locale root. The trailing-slash policy applies to content URLs, archives, and locale roots; / itself is always /.

Content-linked menus select the published translation when one exists, otherwise the original content's canonical locale URL. Authenticated previews keep their access checks and bypass public HTML caching.

Redirects and collisions

Saving a new structure or base records the known previously published URLs and returns 301 redirects straight to their current URLs. History stores content IDs, so successive settings changes never build redirect chains. The admin screen warns before saving and lists the historical URLs afterward. Imported WordPress URLs, URLs already shared by multiple content types, handwritten links, deleted items, and URLs from before history was recorded cannot be mapped automatically — review those separately.

Note

The Redirect manager exposes permalink history as suggestions and adds manual rules, CSV import/export, and public 404 reporting. An enabled managed exact rule overrides the matching historical redirect; disabling it restores automatic permalink handling.

The server rejects collisions with known content URLs, archive URLs, historical URLs, enabled locale prefixes, and reserved platform routes (including the configured admin path). New content resolves a conflicting slug with a suffix such as -2, including across different content types. Saving invalidates cached public pages, menus, content, and site context; core sitemap entries, canonical tags, blog links, translated links, content-linked menu URLs, and REST content links.self follow the active structure, while explicit SEO canonical overrides and handwritten URLs stay author-controlled.

Settings API

GET /api/settings/permalinks and PUT /api/settings/permalinks require an administrator session; writes use the normal CSRF protection.

PUT body
json
{
  "structure": "/%year%/%monthnum%/%postname%/",
  "typeBases": { "product": "shop/products" },
  "categoryBase": "topics",
  "tagBase": "tag",
  "taxonomyBases": {},
  "trailingSlash": "always"
}

GET also returns the presets, registered types and taxonomies, and historical redirects. PUT returns { "ok": true, "redirectsCreated": 3 } — the count covers newly recorded content paths. Invalid input returns 400; URL conflicts return 409. Public REST content responses include links.self, a site-relative canonical permalink; consume that link rather than assembling URLs from slugs.

Careful

The static / edge export requires a path-based preset. A Plain query-string identity cannot be represented as separate static files, so export rejects that configuration with an actionable error.