Skip to content

Instantly share code, notes, and snippets.

@kasparsd
Created June 13, 2012 15:47
Show Gist options
  • Select an option

  • Save kasparsd/2924900 to your computer and use it in GitHub Desktop.

Select an option

Save kasparsd/2924900 to your computer and use it in GitHub Desktop.
Create permalink structure URLs for custom post types that include all parent terms from a custom taxonomy
<?php
/*
Term Archive Pages:
- http://example.com/recipes/dinner/
- http://example.com/recipes/breakfast,brunch/
Single Recipe Pages:
- http://example.com/recipes/dinner/soup-title/
- http://example.com/recipes/breakfast,brunch/egg-dish-title/
*/
add_action( 'init', 'register_my_types' );
function register_my_types() {
register_post_type( 'recipes',
array(
'labels' => array(
'name' => __( 'Recipes' ),
'singular_name' => __( 'Recipee' )
),
'public' => true,
'has_archive' => true,
)
);
register_taxonomy( 'occasion', array( 'recipes' ), array(
'hierarchical' => true,
'label' => 'Occasions'
)
);
}
// Add our custom permastructures for custom taxonomy and post
add_action( 'wp_loaded', 'add_clinic_permastructure' );
function add_clinic_permastructure() {
global $wp_rewrite;
add_permastruct( 'occasion', 'recipes/%occasion%', false );
add_permastruct( 'recipes', 'recipes/%occasion%/%recipes%', false );
}
// Make sure that all links on the site, include the related texonomy terms
add_filter( 'post_type_link', 'recipe_permalinks', 10, 2 );
function recipe_permalinks( $permalink, $post ) {
if ( $post->post_type !== 'recipes' )
return $permalink;
$terms = get_the_terms( $post->ID, 'occasion' );
if ( ! $terms )
return str_replace( '%occasion%/', '', $permalink );
$post_terms = array();
foreach ( $terms as $term )
$post_terms[] = $term->slug;
return str_replace( '%occasion%', implode( ',', $post_terms ) , $permalink );
}
// Make sure that all term links include their parents in the permalinks
add_filter( 'term_link', 'add_term_parents_to_permalinks', 10, 2 );
function add_term_parents_to_permalinks( $permalink, $term ) {
$term_parents = get_term_parents( $term );
foreach ( $term_parents as $term_parent )
$permlink = str_replace( $term->slug, $term_parent->slug . ',' . $term->slug, $permalink );
return $permlink;
}
// Helper function to get all parents of a term
function get_term_parents( $term, &$parents = array() ) {
$parent = get_term( $term->parent, $term->taxonomy );
if ( is_wp_error( $parent ) )
return $parents;
$parents[] = $parent;
if ( $parent->parent )
get_term_parents( $parent, $parents );
return $parents;
}
@asmerkin

Copy link
Copy Markdown

Gracias!. Esto me ha sido muy util!

Thank you!! This has been very useful to me!

@kvvaradha

Copy link
Copy Markdown

@fwolfers

Copy link
Copy Markdown

is it possible to get the taxonomy archive pagination to work.. gives me an 404 error when going to --> example: /recipes/dinner/page/2/

@talha-presstigers

Copy link
Copy Markdown

I want the permalink structure like this one below
www.site.com/post-type/year/post-name
I have used the code below to rewrite custom post slug, but it ends up with this "news/%year%/one/
where news = post type
one = post name
add_action( 'wp_loaded', 'add_clinic_permastructure' );
function add_clinic_permastructure() {
global $wp_rewrite;
add_permastruct( 'news', 'news/%year%/%news%', false );
$wp_rewrite->flush_rules();
}

@Nerdcomputers

Copy link
Copy Markdown

@magarampage

Copy link
Copy Markdown

Brilliant , big thanks man

@scottwvw

Copy link
Copy Markdown

This is great! Exactly what I needed!

I'm trying to get the posts to order by title on the Taxonomy page and not having much luck, is there an easy way of doing this I've missed?

Thanks

@gbiorczyk

Copy link
Copy Markdown

Hi,

If anyone still has a problem with the link structure in WordPress, then I would like to present you a plugin that solves this problem:

https://wordpress.org/plugins/wp-better-permalinks/

This plugin allows you do what with the code above and more - and all this with a few clicks in the admin panel. By using it you can achieve a friendly link structure:

Custom Post Type> Single Term> Post
Custom Post Type> Post (if there is no selected category)
Custom Post Type> Single Term

I invite you to check my plugin and if you like it - to recommend to others. I will be very grateful!

@Nsokyi

Nsokyi commented Oct 12, 2017

Copy link
Copy Markdown

This is exactly what I have been looking for, it works great for me but I do get the following error message 'Undefined variable: permlink in /Users/...' 'on line 89'.

@uniterrenerina

Copy link
Copy Markdown

after adding $wp_rewrite->flush_rules(); in wp_load action 404 page is appeare how to solve that .

ghost commented Mar 15, 2018

Copy link
Copy Markdown

Great Work, i solved a little problem adding a line here:

add_filter( 'term_link', 'add_term_parents_to_permalinks', 10, 2 );
function add_term_parents_to_permalinks( $permalink, $term ) {
$term_parents = get_term_parents( $term );
$permlink = '';
foreach ( $term_parents as $term_parent )
$permlink = str_replace( $term->slug, $term_parent->slug . ',' . $term->slug, $permalink );
return $permlink;
}

because without this i retrieve an error when i navigate custom taxonomy archive.

And i have a question:
i have a problem with wpml. When i try to change language in custom taxonomy archive it doesn't work, anyone knows how to solve that?

@orest22

orest22 commented Apr 6, 2018

Copy link
Copy Markdown

Note: taxonomy has to be registered before post type.

@akshuvo

akshuvo commented May 8, 2018

Copy link
Copy Markdown

Great Works

@nejehh

nejehh commented May 29, 2018

Copy link
Copy Markdown

how to replace , by /

@Vladymyrlem

Vladymyrlem commented Oct 2, 2018 •

Copy link
Copy Markdown

Hi! Thank for the example! But can somebody help me to do for this example own structure? But only for the three taxonomies: www.mysite/type-deal/type-realty/city/address. In my situation address is post name for wordpress.

@Zexccerd

Zexccerd commented Dec 7, 2018

Copy link
Copy Markdown

i have a post type with 2 different categories
how do i set up my permalink like this:
mysite.com/post_type/taxonomy_name/term/sub_term/post

@braddalton

Copy link
Copy Markdown

i have a post type with 2 different categories
how do i set up my permalink like this:
mysite.com/post_type/taxonomy_name/term/sub_term/post

I wouldn't use category and tags with CPT's.

Better to register custom taxonomy terms and separate standard posts from custom post types.

@john-ampwebdesign

Copy link
Copy Markdown

Thank you for the example. At least it got me on the right track and I didn't miss anything.
All to fix one link... Doh!

@mykhaylopetrov

mykhaylopetrov commented Aug 21, 2019 •

Copy link
Copy Markdown

Hi.

If I want to add a non-hierarchical taxonomy like WordPress tags to your code.
For example:

register_taxonomy ( 'taggs', array ('recipes'), array (
        'hierarchical' => false,
        'label' => 'Taggs'
    )
);

As a result, the link structure will be as follows:

http://example.com/taggs/tag-1,tag-2,tag-3

How else to add “recipes” to this taxonomy so that:

http://example.com/recipes/taggs/tag-1,tag-2,tag-3

Tried like this:

function add_clinic_permastructure () {
    global $ wp_rewrite;
    add_permastruct ('occasion', 'recipes/%occasion%', false);
    add_permastruct ('recipes', 'recipes/%occasion%/%recipes%', false);

    add_permastruct ('taggs', 'recipes/%taggs%', false);
    add_permastruct ('recipes', 'recipes/%taggs%/%recipes%', false);
}

In this case, the structure http://example.com/recipes/dinner,breakfast,brunch does not work (error 404).

How to tie these 2 taxonomies together?

Thank.

@mehranattari

Copy link
Copy Markdown

Hi.

If I want to add a non-hierarchical taxonomy like WordPress tags to your code.
For example:

register_taxonomy ( 'taggs', array ('recipes'), array (
        'hierarchical' => false,
        'label' => 'Taggs'
    )
);

As a result, the link structure will be as follows:

http://example.com/taggs/tag-1,tag-2,tag-3

How else to add “recipes” to this taxonomy so that:

http://example.com/recipes/taggs/tag-1,tag-2,tag-3

Tried like this:

function add_clinic_permastructure () {
    global $ wp_rewrite;
    add_permastruct ('occasion', 'recipes/%occasion%', false);
    add_permastruct ('recipes', 'recipes/%occasion%/%recipes%', false);

    add_permastruct ('taggs', 'recipes/%taggs%', false);
    add_permastruct ('recipes', 'recipes/%taggs%/%recipes%', false);
}

In this case, the structure http://example.com/recipes/dinner,breakfast,brunch does not work (error 404).

How to tie these 2 taxonomies together?

Thank.

Looks like there is a typo in the code... Just change the implode( ',', $post_terms ) with implode( '/', $post_terms ). It'll replace the , with /.

Please let me know your results

@Flaschenzug

Flaschenzug commented Apr 8, 2021 •

Copy link
Copy Markdown

amazing, thanks man!

Is there a simple way to use / instead of the , for mulitple categories?
It would be nice to have the hierarchical structure in the url.

The biggest problem with hierachical that I see is the add_permastruct function.
Therefore I have to register it like:

add_permastruct( 'recipes', 'recipes/%occasion%/%recipes%', false );
add_permastruct( 'recipes', 'recipes/%occasion%/%occasion%/%recipes%', false );
add_permastruct( 'recipes', 'recipes/%occasion%/%occasion%/%occasion%/%recipes%', false );

But if I do that, only the last one is active.

Any ideas? Thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment