Pages and posts
Creating, editing and publishing Pages and Posts — Draft/Published/Trash, slugs, content modes, categories, and the URLs you actually get.
Last updated 2026-10-09
Two content types are available on every plan from day one: Pages and Posts. This guide covers creating them, editing them, publishing them, and what happens to your public URLs when you press save.
How Pages and Posts differ
| Pages | Posts | |
|---|---|---|
| Admin menu | Pages → /admin/pages | Posts → /admin/posts |
| Public URL | /{slug}, for example /about-us | /posts/{slug}, or whatever you set under Settings → General → Post URLs |
| Parent/child structure | Yes (Parent Page + Page Order) | No |
| Categories / tags | No | Yes (Categories + Tags) |
| Author | No field | One is required, and co-authors are allowed |
| Template | Choose one per page | No choice; every post uses the theme’s post template |
| Second content mode | HTML Builder | Markdown (must be enabled first) |
Both types are on every plan (Seed, Pro, Business and the trial) and need no special flag.
Note: switching Pages or Posts off under Settings → General, Admin Menu (
/admin/settings/general) removes the menu from the admin panel and makes that type’s public pages 404. Only switch it off if you really mean to hide the whole thing.
Creating something new
- Go to Pages → Add Page (
/admin/pages/new) or Posts → Add Post (/admin/posts/new). - Type a title in the top field. A slug is generated from it (see the note on Thai titles below).
- Write the content in the editor on the left.
- For a post, pick an Author in the Publish box first — saving fails without a primary author.
- Choose Draft or Published and press save. New forms start on Published, so if it is not ready for the public you have to switch it to Draft yourself.
The save button’s label follows the status: Publish (new + Published), Save Draft (new + Draft) and Update (editing an existing item). After a successful save it shows “Saved ✓” and ignores clicks for about 3 seconds, so a double-press cannot stack two requests.
Leaving the page with unsaved changes asks for confirmation first.
The Publish box
The thick-bordered box at the top right is the Publish box, separate from the accordion card below it. It holds:
- Draft / Published status, via the pair of buttons on the left
- A trash icon that moves the item to Trash (only on items already saved)
- The Slug, and a language badge (the badge appears once the site has more than one language)
- The Category and Author fields (posts only)
- The save button
Three statuses
| Status | Meaning |
|---|---|
draft | Not published. The public URL does not resolve |
published | Live on the public site |
trash | In the bin, still recoverable |
The status buttons in the form offer Draft and Published only. There are two routes to Trash: the trash icon in the Publish box (one item at a time), or ticking several rows in the list and using the bulk action (super_admin and admin only). There is no per-row trash button in the table.
There is no publish scheduling in SeedWebs. The three statuses above are all there is. Setting a future date in the “Created” field does not publish the page when that date arrives — Published is visible immediately, Draft is never visible.
Slug rules
The slug is the tail of the URL. On a new item it is generated from the title; when editing, click the slug to type over it.
- A slug keeps only a-z, 0-9 and
-. Everything else is stripped, capitals become lowercase, and spaces and underscores become-. - Slugs are English only. A slug typed in Thai (or any other non-English script) is refused when you save, with a message asking for an English one. Slugs already saved in Thai keep working exactly as before — nothing is rewritten behind your back.
- Exception: sites with Thai URLs moved from WordPress. On a site where the SeedWebs team has turned on experimental features, Settings ▸ General ▸ Content URLs has a switch, “Allow non-English slugs” (other sites do not see it). While it is on, posts, pages, categories and tags may have slugs in Thai or any other language: letters, numbers and
- _ .between them, with no spaces, invisible characters, other symbols or look-alike characters (full-width or styled letters, or ํ + า typed in place of ำ). A Thai title then gets a Thai slug, a WordPress import keeps every URL exactly as it was, and the site answers a Thai URL however the browser spells it. Everything else on the site still needs English slugs. Turning the switch off later changes no saved slug, but the site then handles Thai URLs the way every other site does, so some links (Thai URLs without a prefix, for one) may stop working — keep it on once you rely on it. - Old WordPress ID links (same sites only). WordPress also links to a post by its ID —
/15/05/2020/841/(any date) or/?p=841,/?page_id=…,/?attachment_id=…. On a site where the SeedWebs team has turned on experimental features, Settings ▸ General ▸ Content URLs has a second switch, “Keep old WordPress ID links working”. While it is on, a WordPress import records each post’s, page’s and file’s WordPress ID, and those old links redirect (301) to it here — in the visitor’s language when a published translation exists. Turn it on before importing: content imported earlier is recorded only when you run the same import again. An ID that was never imported, or whose post is not published, shows the not-found page — and so does a file attached to a post or page that is not published, as on WordPress. - WordPress page numbers (same sites only). WordPress puts the page number of a list in the address —
/category/business/page/2/,/tag/ai/page/3/,/page/2/— while this site uses?page=2. On a site where the SeedWebs team has turned on experimental features, Settings ▸ General ▸ Content URLs has a switch, “Page archives like WordPress”. While it is on, the home page, post categories and tags use WordPress’s addresses — and so do author pages (/author/jane/page/2/) on a site whose author pages are at WordPress’s/author/address, each counting only the posts in its own language:/page/1and old?paged=2links redirect to the matching address, a page after the last one shows the not-found page, and each page tells search engines it is its own page, with links to the previous and next one./page/2on the home page shows the home page, as on WordPress. How many posts a page holds is set in the theme ({{#each posts limit=11}}in the category, tag and author templates). Other lists — products, events, the posts list, search results — keep?page=2. - WordPress page numbers (same sites only). WordPress puts the page number of a list in the address —
/category/business/page/2/,/tag/ai/page/3/,/page/2/— while this site uses?page=2. On a site where the SeedWebs team has turned on experimental features, Settings ▸ General ▸ Content URLs has a switch, “Page archives like WordPress”. While it is on, the home page, post categories and tags use WordPress’s addresses:/page/1and old?paged=2links redirect to the matching address, a page after the last one shows the not-found page, and each page tells search engines it is its own page, with links to the previous and next one./page/2on the home page shows the home page, as on WordPress. How many posts a page holds is set in the theme ({{#each posts limit=11}}in the category and tag templates). Other lists — products, events, the posts list, search results — keep?page=2. - WordPress’s other addresses (same sites only). On a site where the SeedWebs team has turned on experimental features, Settings ▸ General ▸ Content URLs has five more switches for addresses a WordPress site had. Date archives like WordPress:
/2024/,/2024/05/and/2024/05/08/list that year’s, month’s or day’s posts, in the page’s language, counted in the site’s time zone (Settings ▸ General) — they use the theme’sdate-archivetemplate, where{{archive_title}}prints “May 2024”. Search addresses like WordPress:/?s=wordand/search/word/show results found the way WordPress finds them (every word must appear, matching titles first), in the page’s language only; the site’s own/search?q=stays as it is. Embeds like WordPress:/post-address/embed/shows the small card other WordPress sites put in a frame when they embedded one of your posts. Send WordPress attachment pages to the file: the page every uploaded file had on WordPress (/post-address/file-name/) redirects to the file. Keep old WordPress ?cat=, ?tag= and ?author= links working:/?cat=5,/?tag=newsand/?author=3redirect to that category, tag or author page. The last two use lists of WordPress numbers the migration team records; a real page or post at any of these addresses always wins, and date archives and search results tell search engines not to index them, as WordPress did. - Languages the WordPress (WPML) way (same sites only). On a site where the SeedWebs team has turned on experimental features, Settings ▸ General ▸ Languages has a WordPress (WPML) languages section with three settings. Language alternates: WordPress with WPML and Yoast put the “this page in other languages” links (hreflang) only in its sitemaps, not in each page — choose Only in the sitemaps to match. Language switcher: choose Hide a language the page is not translated into and the switcher leaves that language out, as WPML does, instead of linking its home page. Categories and tags: per language lets a category or tag have its own address in each language and exist in some languages only —
/en/tag/video-streaming-2and/tag/ding-yuxican be one tag — and a category or tag page then lists only the posts in that page’s language. A category or tag opened in a language it does not exist in still shows — listing only that language’s posts that carry it, often none — and tells search engines its real page is the one in its own language. The per-language addresses are set by the migration team; categories need the nested category addresses (below) for this. - A post or page opened in the wrong language (same sites only). WordPress with WPML sends a visitor who opens an English post without
/en/— or a Thai post or page under/en/— to the right address. On a site where the SeedWebs team has turned on experimental features, Settings ▸ General ▸ Content URLs has a switch, “Send a post or page asked for in the wrong language to the right address”. While it is on, such a link redirects (301) to the post’s or page’s translation in the language that was asked for, when that translation is published, and otherwise to its own address in its own language —/innovestx-q4-2026/goes to the Thai translation,/true-go-world-sim/(English only) to/en/true-go-world-sim/, and/en/contact-us/to/en/contact/. The redirect keeps anything after?in the link. Without the switch, a post that exists only in another language is shown at the address that was asked for, and a page is not found. Link each translation first (+ Link existing translation on the post or page): a post with no linked translation always goes to its own language. A redirect rule (Tools ▸ Redirects) for the same address still wins, and a preview opens as before. - A link that was cut short (same sites only). When an address does not exist, WordPress looks for a published post or page whose slug starts with the address’s last part and sends the visitor there, so a link that a chat app cut short or someone typed partly kept working —
/huawei-watch-gt-7/reached/huawei-watch-gt-7-series/, and/business/mark-brinn-new-holland/reached/mark-brinn-new-holland/. On a site where the SeedWebs team has turned on experimental features, Settings ▸ General ▸ Content URLs has a switch, “Guess a missing address like WordPress”. While it is on, an address that would show the not-found page redirects (301) the same way, to the post or page WordPress would have picked: the first slug in WordPress’s own order, in any language, at that post’s or page’s own address (an English post goes to its/en/address even from a Thai link). The redirect keeps anything after?in the link. Only an address of one or two parts is guessed, as on WordPress: addresses with more parts, feeds (/…/feed/), files, and category, tag, author and search addresses still show the not-found page, and so does a name that no published post or page starts with. A real post or page at the address, and a redirect rule (Tools ▸ Redirects), always win. - Redirects that match like WordPress (same sites only). On a site where the SeedWebs team has turned on experimental features, Tools ▸ Redirects has a Match like WordPress box with two switches, for a site that used WordPress’s Redirection plugin. Keep the query string when redirecting sends a visitor who opens
/old-page?utm_source=facebookon to/new-page?utm_source=facebook— otherwise the part after?is dropped. Ignore capital letters in addresses lets a redirect for/lifealso catch/LIFEand/Life, and makes a page, post, category or tag address typed in capitals show that page:/GREEN-FINANCE/shows the page at/green-finance/, which stays its canonical address. Words such as/tag/and/category/still have to be lowercase, as on WordPress (/TAG/…is not found there either). Both switches apply to every redirect on the site and take effect within a minute; other sites do not see them. - WordPress (Yoast SEO) sitemaps (same sites only). A site moved from WordPress with Yoast SEO has its sitemaps registered in Google Search Console under Yoast’s file names. On a site where the SeedWebs team has turned on experimental features, Settings ▸ General ▸ Content URLs has a switch, “WordPress (Yoast SEO) sitemaps”. While it is on, the site serves
/sitemap_index.xmland the same child files Yoast did —post-sitemap.xml,post-sitemap2.xmland on,page-sitemap.xml,category-sitemap.xml,post_tag-sitemap.xml,author-sitemap.xml— 1,000 addresses per file, each with its other-language versions and its images./sitemap.xmland WordPress’s own sitemap addresses redirect (301) to the index, androbots.txtpoints to it. Categories, tags and authors are listed only where they have published posts. With the WordPress (WPML) language settings above, Language alternates: Nowhere leaves the other-language links out of the sitemaps too, and Categories and tags per language lists each category and tag only in the languages it exists in, linked to its other language. Turned off, the site goes back to the single/sitemap.xml. - Press releases from an outside feed (same sites only). On a site where the SeedWebs team has turned on experimental features, Settings ▸ General has an External feeds box, for a site whose WordPress theme showed press releases from Dataxet. Add Dataxet press releases sets it up the way that theme had it: the tag
{{external_feed feed="dataxet_pr" lang="th" limit="50"}}in a page body lists the 50 newest releases (see Template tags), and every release has its own page at/pr-th/<id>/and/pr-en/<id>/, under each language — any address under those two answers, as on WordPress. Releases are read from Dataxet when a page is built and kept for 5 minutes (one that is not found, 1 minute), so a new one shows within minutes without anyone editing the site; nothing is copied into the site. The switch next to a feed turns it off at once: its addresses are not found, and a page that still carries its tag shows the tag as typed — take the tag out of the page too. Edit as JSON sets what the box does not show — a template for the release pages, your own elements, how long answers are kept, the time zone (UTC, as the old site printed, orAsia/Bangkok). - RSS feeds the WordPress way (same sites only). On a site where the SeedWebs team has turned on experimental features, Settings ▸ General has an RSS feeds (WordPress) card. Switched on, the site answers the feed addresses a WordPress site has —
/feed/(the newest posts),/category/…/feed/,/tag/…/feed/,/author/…/feed/,/comments/feed/and each post’s or page’s/feed/(its comment feed, which stays empty: this site has no comments), the same with/atom/added for Atom readers, and/en/…for each language, listing only that language’s posts — and every page tells browsers and feed readers where its feeds are. WordPress’s old spellings (/feed/rss2/,/rss/) redirect to them. The card also sets how many posts a feed shows (10 if empty), whether each post is sent in full or as its excerpt, and the text Yoast SEO put before and after each post (for example The post %%POSTLINK%% appeared first on %%BLOGLINK%%. — copy it from the old site’s Yoast SEO ▸ Settings ▸ RSS). A change on the card takes effect within a minute, and a newly published post is in the feeds at once (a feed reader may take a few minutes to ask again); other sites do not see the card. - A title written entirely in Thai leaves nothing behind, so SeedWebs substitutes a random 10-character code — you get a URL like
/k3d9f0a1b2. For a readable URL, type an English slug yourself every time. - A mixed Thai-English title keeps only the English: “บทความ Hello World” becomes
hello-world. - Slugs must be unique within one language. A collision is resolved by appending a random code rather than refusing the save. Different languages may share a slug.
- For Pages, that uniqueness is per parent, not sitewide. A child page’s slug only has to be unique among its own siblings —
/face/laserand/body/lasercan both end inlaserbecause they sit under different parents. Two pages under the same parent (or two top-level pages) still can’t share a slug; the second one gets the random-code treatment same as above. Posts have no parent, so their uniqueness is sitewide as stated above. - Moving an item to Trash rewrites its slug to
{slug}-trashed-{number}, freeing the original for immediate reuse.
The sidebar accordion
Below the Publish box is a single card of collapsible sections. Opening one closes the others.
Featured Image
Click the dashed frame to pick an image from Library, Upload or Unsplash. This is the image a theme shows in cards and listings, and it becomes og:image and twitter:image when the link is shared. The library is covered in Media library.
Options
For Pages:
| Field | What it does |
|---|---|
| Template | The page’s template. The list comes from both Pages → Templates (/admin/pages/templates) and any theme template named page-* |
| Parent Page | Sets a parent, which makes the URL /{parent}/{this page} |
| Page Order | A sort number, used in the list and in Structure |
| Show gallery | Enables this page’s gallery. A picker appears under the editor and an insert-gallery button in the toolbar. Put a {{gallery}} tag in the content and the images render there; leave it out entirely and the gallery is appended to the end of the content |
The template named landing is a special case: it removes the theme’s header and footer entirely. Good for single-page promotions.
Worth knowing: with HTML Builder mode on, choosing a Template other than Default shows a yellow warning that the template will not be used, because HTML Builder renders your HTML directly.
For Posts, the Options section holds only the Show gallery switch.
Tags and Co-authors (posts only)
- Tags — type a name and press Add or Enter. A tag with the same name or slug is reused rather than duplicated. Existing tags appear as
+ tag namebuttons to click. - Co-authors — several, in the order you add them. The section is hidden from the writer role.
SEO
SEO Title (60 characters), SEO Description (160 characters) and Keywords, with a live SEO check panel scoring what you have entered. Left blank, the public site uses the title as the page title.
The home page is the exception. Left blank, it uses Site name - Tagline rather than the page’s own title: someone who searches their way to a home page searches for the brand, so the brand belongs first. Every other page keeps Page title — Site name. Fill in SEO Title and it is used as written, as everywhere else.
Sites moved from WordPress with Yoast SEO can switch on Keep the SEO tags of the WordPress site on the SEO page (shown only on sites where the team enabled migration features). Titles then follow Yoast instead: Page title - Site name (a plain hyphen) on every page including the home page, Category Archives - Site name on categories and tags, and an SEO Title printed exactly as typed, with no site name added. The meta description is only ever the SEO Description — it is never filled in from the content.
Custom Fields
Extra fields you have defined appear here (and some below the editor). Where they come from depends on the type:
- Pages: from the template chosen under Pages → Templates
- Posts: from the category chosen (
/admin/posts/categories)
Change the template or the category and the fields change with it. Values already entered are not deleted.
Created / Updated dates
Under the accordion card are the created and last-updated dates. Click to set a different date and time — it affects sorting and the date a theme displays.
Content modes
Article (the default, both Pages and Posts)
A what-you-see editor: bold, italic, underline, H2/H3/H4, bulleted and numbered lists, left/centre/right alignment, image insert, gallery insert (when Show gallery is on), links, and a view-source button at the right of the toolbar.
A video, post or map address pasted alone on an empty line is embedded (Template tags).
HTML Builder (Pages only)
The HTML Builder switch sits next to the screen title. Turn it on and the content is cut into section cards along its top-level HTML structure. Each card has three tabs:
| Tab | For |
|---|---|
| Content | Editing the text and swapping images in that block, without touching code |
| Style | Editing each element’s Tailwind classes |
| HTML | Editing the HTML directly, with a format button |
Cards can be dragged, duplicated and deleted. Add Block offers ready-made blocks (Hero, Features, Stats, Logos, Testimonials, Pricing, FAQ, Team, Blog, Social, Contact, CTA), and Import HTML takes a whole page of HTML you paste in. The Social blocks show Instagram, TikTok or Facebook posts you pick, a TikTok profile, or one YouTube video; see Social media. Contact has a Google Map block.
The split into cards happens when the HTML has two or more block-level children at the top level. Nested structures — a multi-column grid, say — stay as one card.
Markdown (Posts only, and off by default)
A Markdown switch appears next to the screen title once Enable Markdown on posts is turned on under Settings → General (/admin/settings/general, super_admin or admin). On save, SeedWebs converts the Markdown to HTML for the post body and keeps your Markdown source so you can carry on editing it.
A post that was saved in Markdown mode keeps its switch even if the setting is turned off later, so the post never becomes uneditable.
Switching modes clears the content
Switching with content already in place asks for confirmation, on a button labelled Switch & Clear. The old mode’s content is always discarded; nothing is converted between modes. Copy anything you want to keep out first.
What the saved mode does on the public site
SeedWebs records the mode last used on that item (internally, _content_mode), and the public site reads it to decide how to render.
- A Page in HTML Builder mode is rendered as your HTML directly, not through the theme’s page template. SeedWebs still wraps it in
<main>, unless your HTML has its own<main>or you are using the landing template. - A Page in Article mode goes through the theme’s templates, looking for
page-{template name}and falling back topage. - Posts always render through
post-detail-page, falling back topost-detail, whether written in Article or Markdown.
An old page with no recorded mode is guessed when you open the editor: content starting with <section>, <div> or <main> opens in HTML Builder mode.
Most template tags inside the content body work on Pages only. A page’s content is passed through the tag renderer before display, so {{site_name}}, {{#each posts}}, {{slider}} and {{form}} all work mid-content. A post’s content is placed into its template as-is; the only tags that work there are {{gallery}}, {{social_share}}, {{locale_prefix}}, {{pdf_button}} and the video, social post and map tags ({{youtube}}, {{instagram}}, {{facebook}}, {{tiktok}}, {{tiktok_profile}}, {{map}}). Anything else appears literally as {{...}} on the page. To use those tags with posts, put them in the theme’s template instead. A home page written in Article mode is stricter still: only the video, social post and map tags and {{pdf_button}} work there. The full list is in Template tags.
Post categories and tags
- A post belongs to one category (the Category field is single-select) but can carry many tags.
- With only one category on the site, the Category field is hidden and posts join it automatically. A new site starts with one called News.
- Manage categories at Posts → Categories (
/admin/posts/categories) and tags at Posts → Tags (/admin/posts/tags). Categories support parents and children. - The public pages are
/category/{slug}and/tag/{slug}. - Nested category addresses, like WordPress. Settings ▸ General ▸ Content URLs ▸ Post categories can put the parent in the address:
/category/business/marketinginstead of/category/marketing. Every other way of writing a category’s address — the short one, an old parent, different capital letters — then redirects to the full one, so links and bookmarks keep working. With more than one language, each category can also have its own slug per language (Posts → Categories → edit → Slug per language), the way WordPress with WPML keeps/en/category/business-en. While this is on, a sub-category cannot be sluggedfragment,pageorfeed: those words are kept for the end of a category address. WordPress’s page addresses (/category/business/page/2) redirect to the same page of the category — or, with “Page archives like WordPress” on, are that page. Switching back to the default makes the short addresses the only ones again; the per-language slugs are kept, unused, and show on a category’s edit page so you can clear them. Switching on again is refused while one of them is another category’s slug in that language.
Parent pages and ordering
Set Parent Page under Options and the URL nests: a page team whose parent is about lives at /about/team. Several levels deep is fine.
Pages → Structure (/admin/pages/structure) lets you drag both the order and the parent nesting on one screen. Saving also syncs the order and parent onto the page’s translations in the same group.
The URLs you actually get
| Content | URL |
|---|---|
The page whose slug is home | / (opening /home 301-redirects to /) |
| An ordinary page | /{slug} |
| A child page | /{parent-slug}/{child-slug} |
| A post | /posts/{slug} by default — see Post URLs in Settings → General |
| Any language other than the primary one | Prefixed with the language code: /th/about-us, /th/posts/hello |
Every new site comes with a Home page (slug home) containing the words “COMING SOON” — edit it in place. With no published home page, SeedWebs uses the first published page as the home page.
That page only changes the home page: every other page stays open. To close the whole site while you work on it, use Settings → Site status — see Maintenance mode and coming soon.
Pages come first. If a page’s slug matches the URL a visitor opens, that page is served before any other content type’s routes are considered. The exception is the paths below, which are reserved for other content types. Nothing stops you saving a page with one of these slugs, but such a page is never served:
search · posts · blog · news · events · products · tours · staffs · authors · books · docs · category · tag · product-categories · product-tags · product-brands · tour-category · book-categories · robots.txt · sitemap.xml · llms.txt
The store pages work the other way round: /cart, /checkout and /orders/… are NOT on that list, so a page you save at cart or checkout is served and the built-in store page is not. Draft or delete that page when you want the store’s own.
You can move your posts. Settings → General → Post URLs offers four shapes: /posts/my-article (the default), /blog/my-article, /news/my-article, or /my-article with no prefix at all. Whichever you pick, the other three keep working — they redirect to the one you chose, so nothing you have already published or shared breaks.
Two things to know before you switch:
- With no prefix, a post and a page can want the same address. The page wins, and that post stays reachable at
/posts/{slug}. SeedWebs tells you which posts this affects before you save, and refuses to let you give a new post a slug that is already taken by a page. - If you have redirect rules under Tools → Redirects that point at
/posts/…, fix them first. SeedWebs blocks the change until you do, because a rule pointing one way while the site redirects the other way sends visitors round in a loop.
The list screens (All Pages / All Posts)
- Status tabs — All, Published, Draft, Trash. The count in brackets shows on the selected tab only, and a tab with 0 items is hidden unless it is All or the tab you are on.
- Search — matches title and content.
- Language filter — at the right of the heading, once the site has more than one language.
- Category filter — on every content type that has categories (Posts, Events, Books, Programs, Staff, Members, Products, Tours, Authors). Picking a parent category also lists everything filed under its sub-categories. Pages have no categories, so they have no such filter.
- Custom-field filters — a custom field becomes a filter here once you tick Filter on it: on the type’s own Custom Fields page (
/admin/{type}/fields, and/admin/store/products/fieldsfor products), or in the template for Pages. A select becomes a dropdown of its options, a checkbox becomes Yes/No, and a text field becomes a contains box. Tick nothing and no filter bar appears. - Column picker — choose which columns you see. The Save as default button, which sets it for the whole site, is for super_admin and admin only.
- Duplicate — makes a
... (Copy)as a Draft with a new slug. A post’s categories and tags come along, but the copy’s author becomes whoever pressed Duplicate, not the original author. - Multi-select — the toolbar at the top changes status, changes language, and moves items to Trash in one go. These bulk actions are for super_admin and admin. The selection only covers the rows on screen: switching tab or page, searching, or changing the language or a filter un-ticks any row that is no longer shown.
- The Pages list indents children under their parent.
Trash and restoring
In the Trash tab each row has a Restore button, which brings the item back as a Draft — it does not return to Published on its own. Empty Trash deletes everything in the bin permanently, with no recovery.
One thing to watch after restoring: the slug is still {slug}-trashed-{number}. Set it back yourself before republishing.
Saved, but the site is unchanged
The public site sits behind a cache. After saving something Published, visitors may see the old version for about another minute. Wait it out and reload. (Saving a page shows a message about this; saving a post just confirms the save, but the cache behaves the same way.)
Draft items never appear on the public site, and there is no preview link for a draft. To see the real thing before announcing it, publish the page without linking it from any menu and open the URL directly (see Menus).
Who can do what
| Task | super_admin | admin | editor | writer |
|---|---|---|---|---|
| See the list | Everything | Everything | Everything | Own items only |
| Create | Yes | Yes | Yes | Yes (forced to Draft) |
| Edit | Anything | Anything | Anything | Own drafts only |
| Publish / move to Trash | Yes | Yes | Yes | No |
| Bulk actions | Yes | Yes | No | No |
More about the writer role:
- Sees and edits only what they created.
- The Published status button is not rendered in a writer’s form at all, leaving Draft; a publish request arriving by any other route is quietly downgraded to Draft.
- Once an editor or admin publishes a writer’s work, the writer can no longer edit it. The reply says an editor has to move it back to Draft first.
- The byline is locked to the writer. They cannot choose someone else or add co-authors.
Roles and adding users are covered in Users and permissions.
AI helpers in the form (key required)
The AI button at the top right of the form, and the Translate button next to the title field, appear only once an API key is saved under Settings → General, AI Features (/admin/settings/general, super_admin and admin only). Translate needs two further conditions: the item is linked into a translation group, and you are editing a language other than the site’s primary one.