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 → 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 → Features (
/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 can be allowed non-English slugs. See Sites moved from WordPress below.
- 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 → Advanced (/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 ▸ 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 “Paging with /page/2” 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 the URLs tab 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 → URLs → Posts 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.
Sites moved from WordPress
The SeedWebs team can turn on experimental features for a site moved from WordPress. Only such a site sees these settings, and each makes the site answer as the old WordPress site did. A real post or page at an address, and a redirect rule in Tools ▸ Redirects, always win over them; their redirects (301) keep anything after ? in the link.
Switches in Settings ▸ General ▸ WordPress
| Switch | While it is on |
|---|---|
| Thai (non-English) slugs | 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, ํ + า typed for ำ). A Thai title gets a Thai slug, an import keeps every URL as it was, and the site answers a Thai URL however the browser spells it. Everything else still needs English slugs. Turning it off changes no saved slug, but some links (Thai URLs without a prefix) may stop working, so keep it on once you rely on it. |
| Links by ID | /15/05/2020/841/ (any date), /?p=841, /?page_id=… and /?attachment_id=… go to the imported post, page or file, in the visitor’s language when a published translation exists. Turn it on before importing: content imported earlier is recorded only when the same import runs again. An ID never imported or not published, or a file attached to an unpublished post or page, shows the not-found page. |
| Paging with /page/2 | The home page, post categories, tags, and author pages at WordPress’s /author/ address use /…/page/2/ instead of ?page=2, each counting only its own language’s posts. /page/1 and old ?paged=2 links redirect, a page after the last is not found, and /page/2 of the home page shows the home page. Posts per page come from the theme ({{#each posts limit=11}} in the category, tag and author templates). Other lists keep ?page=2. |
| Date archives | /2024/, /2024/05/ and /2024/05/08/ list that year’s, month’s or day’s posts in the page’s language, in the site’s time zone, with the theme’s date-archive template ({{archive_title}} prints “May 2024”). Search engines are asked not to index them. |
| Search addresses | /?s=word and /search/word/ find posts the way WordPress does (every word must appear, title matches first), in the page’s language, and are not indexed. The site’s own /search?q= is unchanged. |
| Embeds on other sites | /post-address/embed/ shows the small card other WordPress sites framed when they embedded your post. |
| Attachment pages → the file | A file’s old page, /post-address/file-name/, redirects to the file, using the WordPress numbers the migration team records. |
| Category, tag and author links | /?cat=5, /?tag=news and /?author=3 redirect to that category, tag or author page, using the WordPress numbers the migration team records. |
| Wrong-language links → the translation | An English post opened without /en/, or a Thai post or page under /en/, goes to its published translation in the language asked for, otherwise to its own address (/en/contact-us/ reaches /en/contact/). Link the translations first (+ Link existing translation): a post with none always goes to its own language. Without the switch, a post that exists only in another language shows at the address asked for, and a page is not found. |
| Guess incomplete links | An address that would be not found goes where WordPress sent it: the first published post or page, in WordPress’s own order and any language, whose slug starts with the address’s last part (/huawei-watch-gt-7/ reaches /huawei-watch-gt-7-series/). Only one- or two-part addresses are guessed; feeds, files, and category, tag, author and search addresses stay not found. |
| Yoast SEO sitemaps | The site serves /sitemap_index.xml and Yoast’s files (post-sitemap.xml, post-sitemap2.xml and on, page-, category-, post_tag- and author-sitemap.xml), 1,000 addresses each with their other-language versions and images; categories, tags and authors appear only with published posts. /sitemap.xml and WordPress’s sitemap addresses redirect to the index, and robots.txt points to it. Off, the site goes back to /sitemap.xml. |
The Languages (WPML) card on the same tab:
- Language alternates: Only in the sitemaps puts the “this page in other languages” links (hreflang) in the sitemaps only, as WPML with Yoast did. Nowhere leaves them out of the sitemaps too.
- Language switcher: Hide a language the page is not translated into leaves that language out instead of linking its home page.
- Categories and tags: per language gives a category or tag its own address in each language and lets it exist in some languages only (
/en/tag/video-streaming-2and/tag/ding-yuxican be one tag). Its page lists only that language’s posts. Opened in a language it does not exist in, it lists that language’s posts carrying it (often none) and tells search engines its real page is in its own language, and the Yoast sitemaps list it only in its own languages. The migration team sets the per-language addresses; categories also need nested category addresses (see Post categories and tags).
The External feeds row on the same tab (Manage opens it) is for a WordPress theme that showed Dataxet press releases. Add Dataxet press releases sets it up the way that theme had it: {{external_feed feed="dataxet_pr" lang="th" limit="50"}} in a page body lists the 50 newest (see Template tags), and each release has a page at /pr-th/<id>/ and /pr-en/<id>/ under every language. Releases are read from Dataxet when a page is built and kept 5 minutes; nothing is copied into the site. The switch next to a feed turns it off once you save: its addresses are not found and its tag prints as typed, so take the tag out too. Edit as JSON (Apply, then save) sets the rest: the release template, cache times, the time zone.
The RSS feeds switch on the same tab: switched on, the site answers /feed/, /category/…/feed/, /tag/…/feed/, /author/…/feed/, /comments/feed/ and each post’s or page’s /feed/ (always empty: this site has no comments), each also with /atom/, and under /en/… with only that language’s posts. Every page tells feed readers where its feeds are, and /feed/rss2/ and /rss/ redirect. Its fields set posts per feed (10 if empty), full text or excerpt, and Yoast SEO’s text before and after each post (from the old site’s Yoast SEO ▸ Settings ▸ RSS).
Match like WordPress, in Tools ▸ Redirects, is for a site that used WordPress’s Redirection plugin. Keep the query string when redirecting sends /old-page?utm_source=facebook on to /new-page?utm_source=facebook; otherwise the part after ? is dropped. Ignore capital letters in addresses lets a redirect for /life catch /LIFE, and shows a page, post, category or tag typed in capitals: /GREEN-FINANCE/ shows /green-finance/, which stays the canonical address. /tag/ and /category/ must still be lowercase, as on WordPress. Both apply to every redirect within a minute.
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 (/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.