0

I've created a custom post type for a website. This is the code:

  //EVENTS 
// Register Custom Post Type
function 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',
    );
    register_post_type( 'Eventi', $args );

}
add_action( 'init', 'events_post_type', 0 );

then I added a custom taxonomy for this specific custom post type:

//EVENTS TAXONOMY
function 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', 'events_taxonomy');

It seems to work fine, however it doesn't with category pages. I use Breadcrumb NavXT as bc plugin and when I click on subcategories, browser gives me back a 404 error. I thought it could be a plugin problem, I deactivated it but the problem remains.

I've seen many other posts like mine but no previously posted solutions has worked.

What am I mistaken?

1

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 );
  • Thank you Dave, it worked ! I have one more question about it: I would like to keep "eventi" as main category and the others as subcategories. I wouldn't like to use "eventi-categorie" as slug for the new taxonomy, but only "eventi". If I change it in 'slug' field, the sub category pages keep giving 404 error. Is there a solution? Thanks again! – Stefano Sep 19 '16 at 10:04
  • Glad to hear! I think I know what you're after. I've updated the code. – Dave Romsey Sep 19 '16 at 15:41
  • Hi again, unfortunately the last update gives me back a 404 error for "eventi" main category. The url updated on the browser is in fact .../eventi/%events_categories%. However, if I call from browser the main category, it works. Maybe is it a problem of NavXT breadcrumb? – Stefano Sep 19 '16 at 19:32
  • Ah, yes. In the updated version, the /eventi URL will now be a working post type archive. The trick here was to change the has_archive parameter to eventi when registering the post type (that was my bad, changed it to true, earlier). Also, code has been added to properly handle events that have not been associated with an event category. – Dave Romsey Sep 19 '16 at 20:49
  • Woohoo! Glad to hear. – Dave Romsey Sep 20 '16 at 20:17

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.