Skip to content

Create :slug field for unique URLs #31

Open
@nelsonic

Description

@nelsonic

As a user (content creator)
I want to have a slug (easy to read and relevant) URL for the content I am publishing
So that any person seeing the URL can immediately infer/deduce the content.

A :slug is user/SEO friendly path to an item of content.
Instead of using the :cid of the content e.g: gVSTedHFGBetxyYib9 or a UUID e.g: f587be12-bdd4-4723-a8db-e0ee2384aea0 which is useless from a both a user's and SEO perspective.

Good summary: https://yoast.com/slug/ + https://www.wpbeginner.com/glossary/post-slug/

Todo

Create following specification:

  • :slug field (String) - the slug will be stored as plaintext. (no need to encrypt it as it's public)
  • Create a Fields.validate_slug function that validates the :slug as containing exclusively URL safe characters: abcdefghijklmnopqrstuvwxyz0123456789-_.
  • Invalid :slug should return and Error which autoform will display in the frontend.
    e.g: "That slug is invalid, please include only valid characters to ensure that humans can read/type it: abcdefghijklmnopqrstuvwxyz0123456789-_."
  • We cannot perform a Database check for the uniqueness of the :slug from a fields perspective, but this should be done in the Application that is using the :slug field to ensure that there are no duplicate/colliding URLs. This should be added to the documentation.

Thankfully there is this StackOverflow answer:
https://stackoverflow.com/questions/695438/safe-characters-for-friendly-url
Which gives most of the detail we need: ALPHA DIGIT "-" / "." / "_" / "~"
image

However I would exclude the ~ ("tilde") character,
because it's not immediately findable on some keyboards and a pain on mobile.

Thus the valid characters for a :slug should be: abcdefghijklmnopqrstuvwxyz0123456789-_.
Yes, the W3C Spec allows uppercase characters in URLs https://www.w3.org/TR/WD-html40-970708/htmlweb.html as per https://stackoverflow.com/questions/7996919/should-url-be-case-sensitive but how many of the top 100 websites

Ok, Amazon uses case sensitive URLs ... 🙄
e.g: https://www.amazon.com/Zero-One-Notes-Startups-Future/dp/0804139296/
although ... what really matters in an Amazon URL is the "ASIN" (:id) of the item ...
this works: https://www.amazon.com/iCan-write-anything-in-this-section/dp/0804139296/
However many ASIN's are all UPPERCASE:
e.g: https://www.amazon.com/Nintendo-Switch/dp/B01MUAGZ49/
but they still work if down-cased: https://www.amazon.com/Nintendo-Switch/dp/b01muagz49 ...
I vote that we make slug lowercase for now, and if any user requests that we allow UPPERCASE characters, we can add that later.

Note: :slug is different from :url #16 in that :url is the full URL
e.g: https://dwyl.com/home whereas a :slug is just the part after the domain,
e.g: home-healthy-creative-technology-co-living-community
(that's probably way too long for a :slug, but you get the idea ...)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions