This is a repost of an earlier question I had, but I like to go into more details now to be able to fully solve this.

So again, with (normal) posts changing the permalink is as easy as going to Settings > Permalink and by changing it to anything you like such as the broadly used %category%/%postname%.html. This all works. If only this was as easy for the custom post type and it's taxonomies as well.

So this is what I like to accomplish.

  1. http://mywordpress.com/portfolio.html - Display all posts in all categories.
  2. http://mywordpress.com/portfolio/music/ - Display all posts in this category.
  3. http://mywordpress.com/portfolio/music/trance/ - Display all posts in this (child) category.
  4. http://mywordpress.com/portfolio/music/trance/Tiesto.html - Display the post.

What I got so far is the following:

  1. First I created a custom_post_type named project and a taxonomy project_category.
  2. I created a page Portfolio and gave it a Page Template that will list all of the post_type = project posts. How can I add .html to the permalink of pages? It now links to http://mywordpress.com/portfolio while I want http://mywordpress.com/portfolio.html. This should solve the first issue.
  3. Then things will get tough, because we don't know by forehand how many subcategories there, maybe there are even none. So the structure we are after is portfolio/(CATEGORY PATH FROM TOP TO CHILD)/post.html. I am still stuck at this point. I think I should somehow get the last category added to the path and pass that along the project_category, which should lead to a taxonomy.php file where I can process it properly.
  4. I haven't tackled this neither but it should have something to do with %postname%.html at the end of something.

I hope my problem is clear and that there are brave developers which will help me tackle this problem which has already keep me busy for four FULL days!

  • 1
    The solution I gave in the last question should have worked that way, if you implemented it correctly. The only thing is you can't get the html part Commented Sep 20, 2011 at 14:43
  • Yes but it was locked to a specific path, so only category/subcategory/page while there might not be subcategories or even more. This is more dynamic.
    – Mark
    Commented Sep 20, 2011 at 15:58
  • Or I did not implement it properly ;)
    – Mark
    Commented Sep 20, 2011 at 15:59

3 Answers 3


Ok I think I might have a solution. I have no idea if this is the right way to accomplish this, but as for now it's the only thing that seems to work.

add_filter('rewrite_rules_array', 'mmp_rewrite_rules');

function mmp_rewrite_rules($rules) {
    $newRules                               = array();
    $newRules['portfolio/(.+)/(.+?).html$'] = 'index.php?project=$matches[2]';
    $newRules['portfolio/(.+)/?$']          = 'index.php?project_category=$matches[1]'; 

    return array_merge($newRules, $rules);

add_filter('request', 'mmp_rewrite_request');

function mmp_rewrite_request($vars) {
    if (isset($vars['project_category'])) {
        if (strpos($vars['project_category'], '/') !== false) {
            $categories = explode('/', $vars['project_category']);
            $vars['project_category'] = $categories[count($categories) - 1];

    return $vars;
  • The request filter is a good way to filter if we're asking a category (term in fact) and a post. It allows adding only one rewrite rule and get post page whether if post is in a category, a subcategory or not at all. Commented Oct 30, 2018 at 11:14

After banging my head for hours, I found this plugin very helpful.


Below is the screen shot of options it gives.

enter image description here


2 Different Methods:

*See notes in the bottom of this post.

for example, you want to have such permalink structure:

At first, you may need to set permalinks to /%category%/%postname%. Then...


create STANDARD categories (MAIN_CATEGORY, SUB_CAT_1, and etc..) , and register the CUSTOM POST, including this parameter:

'taxonomies'    => array('category'..)

and use this codes to change permalinks: https://wordpress.stackexchange.com/a/195643/33667
Then, after publishing a CUSTOM POST (if attached under a category), URL will be:


(p.s. this method is not advised if you plan to publish hundreds or thousands of posts)

register the CUSTOM POST (named MAIN_CATEGORY), including these parameters:

    "supports"      => array('page-attributes'......
    "hierarchical"  => true,

then, publish custom posts like this:
(i.e. publish several custom posts, named SUB_CAT_2, SUB_CAT_1... After then, when you publish another post, but choose SUB_CAT_2 as parent.

1) If you are newbie, review: Register CUSTOM POST and Registering CUSTOM POST with TAXONOMY
2) if you will need search functionality for sub-levels, then use custom search query

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.