🔗

Semantic URLs & URL Slugs

Create clean, SEO-friendly URLs with parent-child hierarchy

🔗 How to Create Semantic URLs/URL Slugs for Root and Child Documents in WordPress

Learn how to create clean, hierarchical URLs that improve SEO and user experience. Transform URLs like vizem.net/almanya to vizem.net/germany and create nested structures like vizem.net/germany/visa.

URL Transformation Examples:
vizem.net/almanyavizem.net/germany
vizem.net/almanya/vize/vizem.net/germany/visa/

By default, WordPress does not allow you to nest one post directly under another (i.e., "parent → child" hierarchy) in the way Pages do. You can certainly have a URL like domain.com/germany/visa, but getting it to work exactly as a post under another post is not straightforward out of the box.

Here are your main options:

1

Using Pages (Easiest for "domain/germany/visa" hierarchy)

The most common way to get URLs like domain.com/germany/visa is by using Pages in a parent–child relationship:

  1. Create Parent Page

    • Create a parent Page called "Germany" (slug: germany)
  2. Create Child Page

    • Create a child Page called "Visa" (slug: visa)
    • In the Page Attributes (right sidebar), set the Parent of "Visa" to "Germany"
Your URLs will then look like this:
domain.com/germany
domain.com/germany/visa

Note: These would be pages, not posts.

2

Using Posts With a "Category/Postname" Permalink

If you really need both "Germany" and "Visa" to be posts, you can leverage WordPress categories and permalink settings:

  1. Create Category

    • Create a category named "Germany" (slug: germany)
  2. Assign Post to Category

    • Assign your second post (Visa) to the "Germany" category
    • Give that post the slug visa
  3. Update Permalink Structure

    • Go to Settings > Permalinks
    • Set your permalink structure to: /%category%/%postname%/
You'll end up with:
domain.com/germany/visa

⚠️ Important Warning

If you already have a post with the exact slug germany at domain.com/germany, WordPress will conflict with the category named germany. Generally, a slug cannot be shared between a post/page and a category/taxonomy term because WordPress won't know which one to load.

Solution: You could remove or rename the category base altogether using a plugin or code snippet, but you still risk conflicts if a post shares the same slug as a category.

Because of these conflicts, if you want domain.com/germany and domain.com/germany/visa purely as posts without using categories, you would need to do some custom rewrite rules or a plugin that introduces "parent-child" relationships for posts. This usually isn't recommended when Pages can handle the hierarchy much more cleanly.

3

Summary and Best Practices

  • WordPress Pages

    Have a native parent–child hierarchy. That's the simple path to get domain.com/germany/visa.

  • WordPress Posts

    Are chronological/blog entries by default. They don't natively nest under each other in the URL structure.

  • Categories

    Can emulate part of the URL structure (e.g., domain.com/germany/visa), but domain.com/germany ends up being the category archive, not a post.

💡 Pro Tip

For most use cases, using WordPress Pages with parent-child relationships is the recommended approach. It's clean, SEO-friendly, and doesn't require any complex workarounds.

  • Easy to manage and maintain
  • Native WordPress functionality
  • No plugin dependencies
  • Search engine friendly
  • Clean URL structure