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 Answer 1

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 );
6
  • 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, 2016 at 10:04
  • Glad to hear! I think I know what you're after. I've updated the code. Sep 19, 2016 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, 2016 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. Sep 19, 2016 at 20:49
  • Woohoo! Glad to hear. Sep 20, 2016 at 20:17

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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