Skip to content

Instantly share code, notes, and snippets.

@kasparsd
Created June 13, 2012 15:47
Show Gist options
  • Star 92 You must be signed in to star a gist
  • Fork 32 You must be signed in to fork a gist
  • Save kasparsd/2924900 to your computer and use it in GitHub Desktop.
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;
}
@Flaschenzug
Copy link

Flaschenzug commented Apr 8, 2021

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