Search code examples
wordpresscustom-post-typepermalinks

Show only specific categories in permalinks for custom post type in WordPress


I tried to ask this question in the Wordpress Devlopment network with no success, I'm trying to display only 3 specific categories in permalinks for custom-post-type categories.

Right now the permalinks structure (that is the structure given by the theme i'm using and that i'm modifying through a child theme)is as follows:

www.myfoodblog.com/recipes/the-post-title/
         ^            ^           ^    
       root   custom-post-type  title  

some post are under 3 categories that i would like to display in permalinks which are restaurant, users and admin to get something like this

www.myfoodblog.com/recipes/restaurant/the-post-title/

www.myfoodblog.com/recipes/users/the-post-title/

www.myfoodblog.com/recipes/admin/the-post-title/

leaving the original structure for posts that are not in those categories.

I tried using this plugin but it will display the custom post type category for all posts.

I also tried to follow the instructions provided in this question but it's not working, no changes are made in the permalinks structure.

Any advice is much appreciated.


Solution

  • You have to work with both post_type_link and add a rewrite rule

    function recipes_post_link( $post_link, $id = 0 ){
        $post = get_post( $id );
        if ( is_object( $post ) ){
            $terms = get_the_terms( $post->ID, 'recipe-category' );
            foreach($terms as $term) {
                if( $term->slug == 'restaurants' || $term->slug == 'users'){
                    return str_replace( site_url()."/recipes" , site_url()."/recipes/".$term->slug , $post_link );
                }
            }
        }
        return $post_link;
    }
    add_filter( 'post_type_link', 'recipes_post_link', 1, 3 );
    
    function custom_rewrite_basic() {
      add_rewrite_rule('^recipes/(.+)/(.+)', 'index.php?recipe=$matches[2]', 'top');
    }
    add_action('init', 'custom_rewrite_basic');