I’m working on a random quote generator for one of my sites. I decided to create a custom post type called ‘quote’. I wanted to create a custom taxonomy for quote categories and another for quote tags since I want these categories and tags to be separate from the other categories and tags on the site.
First, I needed to register the quote custom post type:
register_post_type( 'quote',
array(
'labels' => array(
'name' => __( 'Quotes' ),
'singular_name' => __( 'Quote' ),
'add_new' => __( 'Add New Quote' ),
'add_new_item' => __( 'Add Quote' ),
'edit' => __( 'Edit' ),
'edit_item' => __( 'Edit Quote' ),
'new_item' => __( 'New Quote' ),
'view' => __( 'View Quote' ),
'view_item' => __( 'View Quote' ),
'search_items' => __( 'Search Items' ),
'not_found' => __( 'No Quotes Found' ),
'not_found_in_trash' => __( 'No Quotes Found in Trash' ),
'parent' => __( 'Parent Event' ),
),
'public' => true,
'show_ui' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'menu_position' => 20,
'hierarchical' => true,
'query_var' => true,
'supports' => array( 'title', 'editor', 'thumbnail' ),
'has_archive' => true,
'rewrite' => array('slug' => 'quotes'),
)
);
Next we have to set up the variables and register the quote category custom taxonomy:
$labels = array(
'name' => __( 'Quote Categories' ),
'singular_name' => __( 'Quote Category' ),
'add_new' => __( 'Add New Quote Category'),
'add_new_item' => __( 'Add Quote Category' ),
'edit_item' => __( 'Edit Quote Category' ),
'new_item' => __( 'New Quote Category' ),
'view_item' => __( 'View Quote Category' ),
'search_items' => __( 'Search Quote Category' ),
'not_found' => __( 'No Quote Category found' ),
'not_found_in_trash' => __( 'No Quote Category found in Trash' ),
);
$pages = array( 'quote' );
$args = array(
'labels' => $labels,
'singular_label' => __( 'Quote Category' ),
'public' => true,
'show_ui' => true,
'hierarchical' => true,
'show_tagcloud' => false,
'show_in_nav_menus' => true,
'rewrite' => array('slug' => 'quote-categories'),
);
register_taxonomy( 'quote_categories' , $pages , $args );
And then the custom quote tags taxonomy:
$labels2 = array(
'name' => __( 'Quote Tags' ),
'singular_name' => __( 'Quote Tag' ),
'add_new' => __( 'Add New Quote Tag'),
'add_new_item' => __( 'Add Quote Tag' ),
'edit_item' => __( 'Edit Quote Tag' ),
'new_item' => __( 'New Quote Tag' ),
'view_item' => __( 'View Quote Tag' ),
'search_items' => __( 'Search Quote Tag' ),
'not_found' => __( 'No Quote Tag found' ),
'not_found_in_trash' => __( 'No Quote Tag found in Trash' ),
);
$pages2 = array( 'quote' );
$args2 = array(
'labels' => $labels2,
'singular_label' => __( 'Quote Tags' ),
'public' => true,
'show_ui' => true,
'hierarchical' => false,
'show_tagcloud' => true,
'show_in_nav_menus' => true,
'rewrite' => array('slug' => 'quote-tags'),
);
register_taxonomy( 'quote_tags' , $pages , $args2 );
One more thing we need to do is to refresh the rewrite rules so that our new permalinks will work for our new post type and taxonomies:
flush_rewrite_rules( false );
We now have a new custom post type for quotes along with quote categories and tags that show up in our WordPress Admin menu. Each quote will be added as a separate ‘post’.
add_action( 'init', 'create_quotes_post_type' );
function create_quotes_post_type() {
register_post_type( 'quote',
array(
'labels' => array(
'name' => __( 'Quotes' ),
'singular_name' => __( 'Quote' ),
'add_new' => __( 'Add New Quote' ),
'add_new_item' => __( 'Add Quote' ),
'edit' => __( 'Edit' ),
'edit_item' => __( 'Edit Quote' ),
'new_item' => __( 'New Quote' ),
'view' => __( 'View Quote' ),
'view_item' => __( 'View Quote' ),
'search_items' => __( 'Search Items' ),
'not_found' => __( 'No Quotes Found' ),
'not_found_in_trash' => __( 'No Quotes Found in Trash' ),
'parent' => __( 'Parent Event' ),
),
'public' => true,
'show_ui' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'menu_position' => 20,
'hierarchical' => true,
'query_var' => true,
'supports' => array( 'title', 'editor', 'thumbnail' ),
'has_archive' => true,
'rewrite' => array('slug' => 'quotes'),
)
);
$labels = array(
'name' => __( 'Quote Categories' ),
'singular_name' => __( 'Quote Category' ),
'add_new' => __( 'Add New Quote Category'),
'add_new_item' => __( 'Add Quote Category' ),
'edit_item' => __( 'Edit Quote Category' ),
'new_item' => __( 'New Quote Category' ),
'view_item' => __( 'View Quote Category' ),
'search_items' => __( 'Search Quote Category' ),
'not_found' => __( 'No Quote Category found' ),
'not_found_in_trash' => __( 'No Quote Category found in Trash' ),
);
$labels2 = array(
'name' => __( 'Quote Tags' ),
'singular_name' => __( 'Quote Tag' ),
'add_new' => __( 'Add New Quote Tag'),
'add_new_item' => __( 'Add Quote Tag' ),
'edit_item' => __( 'Edit Quote Tag' ),
'new_item' => __( 'New Quote Tag' ),
'view_item' => __( 'View Quote Tag' ),
'search_items' => __( 'Search Quote Tag' ),
'not_found' => __( 'No Quote Tag found' ),
'not_found_in_trash' => __( 'No Quote Tag found in Trash' ),
);
$pages = array( 'quote' );
$pages2 = array( 'quote' );
$args = array(
'labels' => $labels,
'singular_label' => __( 'Quote Category' ),
'public' => true,
'show_ui' => true,
'hierarchical' => true,
'show_tagcloud' => false,
'show_in_nav_menus' => true,
'rewrite' => array('slug' => 'quote-categories'),
);
$args2 = array(
'labels' => $labels2,
'singular_label' => __( 'Quote Tags' ),
'public' => true,
'show_ui' => true,
'hierarchical' => false,
'show_tagcloud' => true,
'show_in_nav_menus' => true,
'rewrite' => array('slug' => 'quote-tags'),
);
register_taxonomy( 'quote_categories' , $pages , $args );
register_taxonomy( 'quote_tags' , $pages , $args2 );
flush_rewrite_rules( false );
}

Pingback: Cullen Web Services | Add a WordPress Meta Box to a Post
Pingback: How to Choose a Random Post with a Custom Post Type in a Wordpress Shortcode - Cullen Web Services
Pingback: Post to a Facebook Wall from my WordPress Website - Cullen Web Services
Pingback: Display My Custom Post Categories (Custom Taxonomy) in a Dropdown - Cullen Web Services | Cullen Web Services