I have looked around noth in StackOverflow and WP.SE.
Like many before me, I just want this structure
mysite.com/custom-post-type/custom-taxonomy-term/post-name
Or, in other words,
mysite.com/publication/book/post-name (single post)
mysite.com/publication/book/ (all posts in the term 'book')
mysite.com/publication/ (all posts in this publication CPT)
I followed this instruction by TheDeadMedic for making custom post type with custom taxonomy permalink, and another one by Matthew Boynes to fix the pagination issue.
All works well, except... everytime I open the single post, it returns the 404 page.
I have tried opening the Permalink page and setting flush_rewrite_rules()
to no avail. I still can't open the single page.
The only fix that works is if I change the slug in my custom taxonomy to its original form.
So instead of publication
(the rewrite slug for this tax, in accordance to my custom post type name), I would have the default type
(the default slug for this tax). Which would defeat the purpose.
Here is my code.
Taxonomy.
function cptui_register_my_taxes_type() {
/**
* Taxonomy: Types.
*/
$labels = array(
"name" => __( 'Types', 'mysite' ),
"singular_name" => __( 'Type', 'mysite' ),
"menu_name" => __( 'Types', 'mysite' ),
"all_items" => __( 'All Types', 'mysite' ),
"edit_item" => __( 'Edit Types', 'mysite' ),
"view_item" => __( 'View Type', 'mysite' ),
"update_item" => __( 'Update Type Name', 'mysite' ),
"add_new_item" => __( 'Add New Type', 'mysite' ),
"new_item_name" => __( 'New Type Name', 'mysite' ),
"parent_item" => __( 'Parent Type', 'mysite' ),
"parent_item_colon" => __( 'Parent Type:', 'mysite' ),
"search_items" => __( 'Search Types', 'mysite' ),
"popular_items" => __( 'Popular Types', 'mysite' ),
"separate_items_with_commas" => __( 'Separate Types with commas', 'mysite' ),
"add_or_remove_items" => __( 'Add or remove Types', 'mysite' ),
"choose_from_most_used" => __( 'Choose from the most used Types', 'mysite' ),
"not_found" => __( 'No Types found', 'mysite' ),
"no_terms" => __( 'No types', 'mysite' ),
"items_list_navigation" => __( 'Types list navigation', 'mysite' ),
"items_list" => __( 'Types list', 'mysite' ),
);
$args = array(
"label" => __( 'Types', 'mysite' ),
"labels" => $labels,
"public" => true,
"hierarchical" => true,
"label" => "Types",
"show_ui" => true,
"show_in_menu" => true,
"show_in_nav_menus" => true,
"query_var" => true,
"rewrite" => array( 'slug' => 'publication', 'with_front' => true, 'hierarchical' => true, ),
"show_admin_column" => true,
"show_in_rest" => false,
"rest_base" => "",
"show_in_quick_edit" => true,
);
register_taxonomy( "tyoe", array( "publication" ), $args );
}
add_action( 'init', 'cptui_register_my_taxes_type' );
Custom Post Type
function cptui_register_my_cpts_publication() {
/**
* Post Type: Publication.
*/
$labels = array(
"name" => __( 'Publication', 'mysite' ),
"singular_name" => __( 'Publication', 'mysite' ),
"menu_name" => __( 'Publication', 'mysite' ),
"all_items" => __( 'All Publication', 'mysite' ),
"add_new" => __( 'Add New', 'mysite' ),
"add_new_item" => __( 'Add New Publication', 'mysite' ),
"edit_item" => __( 'Edit Publication', 'mysite' ),
"new_item" => __( 'New Publication', 'mysite' ),
"view_item" => __( 'View Publication', 'mysite' ),
"view_items" => __( 'View Publications', 'mysite' ),
"search_items" => __( 'Search Publications', 'mysite' ),
"not_found" => __( 'No publication found', 'mysite' ),
"not_found_in_trash" => __( 'No trashed publications', 'mysite' ),
"parent_item_colon" => __( 'Parent Publication:', 'mysite' ),
"featured_image" => __( 'Cover or illustration', 'mysite' ),
"set_featured_image" => __( 'Set cover or illustration for this publication', 'mysite' ),
"remove_featured_image" => __( 'Remove cover or illustration for this publication', 'mysite' ),
"use_featured_image" => __( 'Use as cover or illustration for this publication', 'mysite' ),
"archives" => __( 'Publication archives', 'mysite' ),
"insert_into_item" => __( 'Insert into publication info', 'mysite' ),
"uploaded_to_this_item" => __( 'Uploaded to publication info', 'mysite' ),
"filter_items_list" => __( 'Filter publication', 'mysite' ),
"items_list_navigation" => __( 'Publication list navigation', 'mysite' ),
"items_list" => __( 'Publication list', 'mysite' ),
"attributes" => __( 'Publication Attributes', 'mysite' ),
"parent_item_colon" => __( 'Parent Publication:', 'mysite' ),
);
$args = array(
"label" => __( 'Publication', 'mysite' ),
"labels" => $labels,
"description" => "",
"public" => true,
"publicly_queryable" => true,
"show_ui" => true,
"show_in_rest" => false,
"rest_base" => "",
"has_archive" => true,
"show_in_menu" => true,
"exclude_from_search" => false,
"capability_type" => "post",
"map_meta_cap" => true,
"hierarchical" => false,
"rewrite" => array( "slug" => "publication/%type%", "with_front" => false ),
"query_var" => true,
"menu_position" => 6,
"menu_icon" => "dashicons-format-aside",
"supports" => array( "title", "editor", "thumbnail", "comments", "revisions" ),
"taxonomies" => array( "type" ),
);
register_post_type( "publication", $args );
}
add_action( 'init', 'cptui_register_my_cpts_publication' );
Setting up the permalink
function change_permalink_publication( $link, $post ) {
if ( $post->post_type === 'publication' ) {
if ( $terms = get_the_terms( $post->ID, 'type' ) )
$link = str_replace( '%type%', current( $terms )->slug, $link );
}
return $link;
}
add_filter( 'post_type_link', 'change_permalink_publication', 10, 2 );
add_action( 'generate_rewrite_rules', 'change_permalink_publication_pagination' );
function change_permalink_publication_pagination( $wp_rewrite ) {
unset($wp_rewrite->rules['publication/([^/]+)/page/?([0-9]{1,})/?$']);
$wp_rewrite->rules = array(
'publication/?$' => $wp_rewrite->index . '?post_type=publication',
'publication/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?post_type=publication&paged=' . $wp_rewrite->preg_index( 1 ),
'publication/([^/]+)/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?type=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 2 ),
) + $wp_rewrite->rules;
}
Is there a way to fix this?
"tyoe"
inregister_taxonomy
is a typo? The problem is"hierarchical" => true
in your taxonomy. Those rewrite rules are capturing the request for singlepublication
posts, it's looking for atype
term matching your post name. You can fix it immediately if you just set"hierarchical" => false
. If you really want a hierarchical taxonomy, it'll get a little more complicated.hierarchical
tofalse
fixes it for now. Thanks! Would be nice if there's a way to allow hierarchical taxonomy though. :)