The default URL of example.com/?p=123 is obviously no good from either a usability or a SEO point of view (although note: URLs are not as big a deal for SEO as they were at one point). A lot of blogs use one of the date based WordPress permalink structures instead, but that’s almost always a bad idea. Unless your content is only going to stay relevant for a short period of time, if it’s a news blog or a “what’s on” blog for instance, there’s no need to advertise how old a post is. All it does is imply that your older posts are no longer relevant, while at the same time making the URL longer and messier.
A good alternative structure is example.com/%postname%, which is now one of the options you can select under Settings > Permalinks. The %postname% tag defaults to the title of the post in lowercase with spaces replaced by hyphens, but you can edit it for each post. It’s a good idea to remove so called stop words like “and” or “or” to keep the URL short and the keyword density high.
Using a /category/postname hierarchical structure
It seems quite popular for people to use /%category%/%postname% as their WordPress permalink instead, adding the category tag in there as well the post slug . The category a post belongs to is presumably strongly related to the content of that post, so adding this keyword into the URL is a good idea from a SEO point of view.
It also looks pretty good from a usability point of view. The %category% tag will display the correct nesting for subcategories, so the URL effectively becomes a breadcrumb trail to the visitor’s current location on the site, which I find quite satisfying.
People are of course intuitively going to expect to be able to navigate up a level by editing the URL, like how they might navigate a folder structure. At the moment though example.com/%category% doesn’t exist, because WordPress forces you to use a category base. One option might be to 301 redirect /%category% to /category/%category%, but a neater solution would be to remove the category base altogether.
Removing the WordPress permalink category base
There are two ways I’ve found to remove the category base in WordPress. The first is with a plugin like “WP No Category Base“, which pretty much does exactly what it says on the tin with no hassle (despite not having been updated in over 2 years). The SEO by Yoast plug-in also includes this functionality, and you probably have that installed anyway. If so, all you need to do is tick the box under SEO > Advanced > Permalinks.
The second way is to set your WordPress permalink structure to /%category%/%postname%, and put a full stop as the category base.
Removing or redirecting the WordPress permalink tag base
Removing the category base still leaves the tag base intact and although there exists a plugin for removing that too, I haven’t tried it. There’s already potential for confusion over what the difference between a tag and a category is, and making tags look like categories isn’t gonna help. If you insist it apparently can be done with that plugin combined with one of the methods above for removing the category bases.
If you leave the tag base be there’s still the issue of example.com/tag giving a 404 error. This is normal behaviour, but it bugged me anyway. It’s easy enough to fix, all you need to do is set up a 301 redirect in your .htaccess file to take people back to the homepage:
RewriteEngine On RedirectMatch 301 ^/tag/?$ http://example.com/
This leaves all the /tag/%tag% pages alone, and only directs you if you try to go to /tag itself. A more sophisticated solution might have been to make a page named “tag” display all the available tags but… well maybe another time.
Disadvantages to using a category-postname hierarchical structure
Using the category in your WordPress Permalink settings limits your flexibility somewhat. Firstly, WordPress lets you give posts multiple categories. Since each post only has one URL, the %category% tag will correspond to the first category alphabetically (although there are plugins which let you choose which it should take). This screws with the nice breadcrumb-like hierarchy a little, but it’s not too bad – you could always just stick to one category per post.
I’m also not a fan of restricting myself to the categories I originally chose. If I later change my mind about how my blog should be organised I don’t want to have to deal with a whole tonne more 301 redirects. I admit this is probably avoidable if you plan out exactly how your blog is going to grow, but I’m still not keen.
There’s also a potential (albeit very minor) performance cost due to WordPress having to work harder to figure out what you’re asking it to display; is example.com/bleep-bloop a page or a category? And if you use a plug-in like woocommerce, which adds categories for products with a corresponding base, you’ve lost consistency over how your URLs are structured throughout the site. You could find a way to remove those category bases too… but by now things are starting to get complicated.
To keep things simple and flexible I opted not to include a post’s category in the WordPress permalink configuration for this blog, though I have done so in the past. I also decided, just to satisfy my own desire for organisation and consistency, to prepend /blog/ onto my blog posts in parallel to WordPress’ /category/ for categories and /tag/ for tags. None of the disadvantages to the /%category%/%postname% structure are insurmountable though, so at the end of the day it comes down to person preference.