Custom post type categories gives 404 error

I’ve updated and added to the code you’ve provided.

Event post type:

  • Changed post type name to from Eventi to eventi. Post type names cannot contain capital letters
  • Changed has_archive to eventi
  • Added rewrite arguments

Post type links


This configuration will result in the following URL structures:

Event post type archive URL:

/eventi

Event post type URLs:

/eventi/event-category-name/example-event-post-name/

Event category URLs:

/eventi/event-category-name/

Event post type URLs when no event category has been set:

/eventi/uncategorized/event-with-no-category/

Here is the updated code. Remember to visit the Settings > Permalinks page in the admin area after updating the code.

//EVENTS 
// Register Custom Post Type
function wpse239701_events_post_type() {
    $labels = array(
        'name'                  => _x( 'Eventi', 'Post Type General Name', 'text_domain' ),
        'singular_name'         => _x( 'Eventi', 'Post Type Singular Name', 'text_domain' ),
        'menu_name'             => __( 'Eventi', 'text_domain' ),
        'name_admin_bar'        => __( 'Eventi', 'text_domain' ),
        'archives'              => __( 'Item Archives', 'text_domain' ),
        'parent_item_colon'     => __( 'Parent Item:', 'text_domain' ),
        'all_items'             => __( 'All Items', 'text_domain' ),
        'add_new_item'          => __( 'Add New Item', 'text_domain' ),
        'add_new'               => __( 'Add New', 'text_domain' ),
        'new_item'              => __( 'New Item', 'text_domain' ),
        'edit_item'             => __( 'Edit Item', 'text_domain' ),
        'update_item'           => __( 'Update Item', 'text_domain' ),
        'view_item'             => __( 'View Item', 'text_domain' ),
        'search_items'          => __( 'Search Item', 'text_domain' ),
        'not_found'             => __( 'Not found', 'text_domain' ),
        'not_found_in_trash'    => __( 'Not found in Trash', 'text_domain' ),
        'featured_image'        => __( 'Featured Image', 'text_domain' ),
        'set_featured_image'    => __( 'Set featured image', 'text_domain' ),
        'remove_featured_image' => __( 'Remove featured image', 'text_domain' ),
        'use_featured_image'    => __( 'Use as featured image', 'text_domain' ),
        'insert_into_item'      => __( 'Insert into item', 'text_domain' ),
        'uploaded_to_this_item' => __( 'Uploaded to this item', 'text_domain' ),
        'items_list'            => __( 'Items list', 'text_domain' ),
        'items_list_navigation' => __( 'Items list navigation', 'text_domain' ),
        'filter_items_list'     => __( 'Filter items list', 'text_domain' ),
    );
    $args = array(
        'label'                 => __( 'Eventi', 'text_domain' ),
        'description'           => __( 'Descrizione evento', 'text_domain' ),
        'labels'                => $labels,
        'supports'              => array('title', 'thumbnail', 'editor' ),
        'taxonomies'            => array('events_categories'),
        'hierarchical'          => true,
        'public'                => true,
        'show_ui'               => true,
        'show_in_menu'          => true,
        'menu_position'         => 5,
        'show_in_admin_bar'     => true,
        'show_in_nav_menus'     => true,
        'can_export'            => true,
        'has_archive'           => 'eventi',        
        'exclude_from_search'   => false,
        'publicly_queryable'    => true,
        'capability_type'       => 'page',
        'rewrite' => array(
            'slug' => 'eventi/%events_categories%',
            'with_front' => false
        ),              
    );
    register_post_type( 'eventi', $args );

}
add_action( 'init', 'wpse239701_events_post_type' );

function wpse239701_events_taxonomy() {  
    register_taxonomy(  
        'events_categories',  
        'eventi',        
        array(  
            'hierarchical' => true,  
            'label' => 'Categorie',
            'query_var' => true,
            'rewrite' => array(
                'slug' => 'eventi', 
                'with_front' => false 
            )
        )  
    );  
}  
add_action( 'init', 'wpse239701_events_taxonomy' );


function wpse239701_events_post_link( $permalink, $post_id, $leavename ) {
    if ( strpos( $permalink, '%events_categories%' ) === false ) {
        return $permalink;
    }

    // Get post
    $post = get_post($post_id);
    if ( ! $post ) {
        return $permalink;
    }

    // Get taxonomy terms
    $terms = wp_get_object_terms($post->ID, 'events_categories');   
    if ( ! is_wp_error( $terms ) && ! empty( $terms ) && is_object( $terms[0] ) ) {
        $taxonomy_slug = $terms[0]->slug;
    } else { 
        $taxonomy_slug = 'uncategorized'; 
    }

    return str_replace( '%events_categories%', $taxonomy_slug, $permalink );
}   
// add_filter( 'post_link', 'wpse239701_events_post_link', 10, 3 ); // Not needed - we aren't adding our custom taxonomy to posts, but if we were, this would be used.
add_filter( 'post_type_link', 'wpse239701_events_post_link', 10, 3 );