How to Create a Custom Post Type in a Plugin

Custom post types in WordPress are a handy way to create a new type of post for specific type of information. A custom post type (CPT) provides the ability to organize your WordPress site without creating new categories.  Once a CPT is created there are a few options available to display the post.  For instance, a new page templates can be created or a new shortcode could be made available to display the post information.  In this post we will focus on creating a CPT for members of a roster.

If you are unfamiliar with how to create a plugin you can follow the steps in How to Create a WordPress Plugin. These steps will guide you through the basics of creating a WordPress plugin. For brevity’s sake I am going to keep the basics minimal and only focus on what is needed to create a CPT.

Step 1  Create a plugin folder

Create a new folder in the wp-content\plugins folder called my-cpt-plugin.

Step 2  Create the plugin PHP file

Add a new text file to the my-cpt-plugin folder and name it my-cpt-plugin.php.

Step 3  Add a plugin information header

Now we have to tell WordPress this is a plugin and give it the information it needs to display on the Plugins panel on the WordPress admin page. Open the my-cpt-plugin.php file and add the following text.

	Plugin Name: My Custom Post Type Plugin
	Plugin URI:
	Description: This is my first Custom Post Type plugin.
	Author: Frank Jones
	Version: 1.0
	Author URI:


After saving this file you should be able to now see your plugin in the Plugins panel on the WordPress admin page.

Step 4  Add Custom Post Type code

Add the following code just below the information header in the my-cpt-plugin.php file. This code will create a new CPT in WordPress.

 add_action( 'init', 'mycpt_create_member' );
 function mycpt_create_member() {
			'labels' => array(
				'name' => __( 'Roster' ),
				'singular_name' => __('Roster'),
				'add_new_item' => __(''),
				'add_new' => __('Add New Member'),
				'edit_item' => __('Edit Member'),
				'new_item' => __('New Member'),
				'all_items' => __('All Members'),
				'view_item' => __('View Member'),
				'search_items' => __('Search Members'),
				'not_found' => __('No Members found'),
				'not_found_in_trash' => __('No Members found in Trash'),
				'parent_item_colon' => '',
				'menu_name' => 'Roster'
			'hierarchical' => true,
			'description' => 'Roster members and descriptions',
			'supports' => array('title', 'editor', 'thumbnail', 'custom-fields', 'page-attributes'),
			'public' => true,
			'show_ui' => true,
			'show_in_menu' => true,
			'menu_position' => 25,
			'show_in_nav_menus' => true,
			'publicly_queryable' => true,
			'exclude_from_search' => false,
			'has_archive' => true,
			'query_var' => true,
			'can_export' => true,
			'rewrite' => true,
			'capability_type' => 'post'

Instead of explaining each line I will just point out a few highlights. For more information about the various options refer to the WordPress Codex. I have found WordPress does a pretty good job of documenting their functions.

A couple of things to take note on in this code…

line 1  This is the action hook that tells WordPress to run your function right after WordPress initializes, but before everything else.
line 5  This is the name of the CPT as WordPress will know it. This is important later when you want to create a custom taxonomy for you new post type
lines 6-21  These lines define the text that will be displayed at various points in the WordPress admin page for the CPT.
lines 22-36  These lines define different options about the CPT.

I highly recommend checking out the WordPress Codex to explore the various available labels and options.

Step 5  Activate the plugin

Once you activate the plugin you should see a menu option added to the WordPress admin page.


Now that you have successfully created a new post type there are a plethora of options available to you. You can create a new taxonomy to further customize the post type. You can add a new page template to display your new custom post type. You can also create a shortcode to display information from the new post type.

Posted in Tech Tagged with: , ,

Leave a Reply