How To Create Custom Post Type In WordPress (Without Plugin)

How To Create Custom Post Type In WordPress (Without Plugin)

21 Sep 2018 9 min read

The term of “Post Type” used to determine different types of content that can hold and display in WordPress.
By default WordPress already has several basic post types, they are:

  • post
  • page
  • attachment
  • revision
  • nav_menu_item
  • custom_css
  • customize_changeset

But sometimes there is a need to create your own version of the post.
This can be a portfolio, people, goods, etc etc

For example, let’s create a post-type “Materials”.

Also, we’ll create different custom taxonomies and other Tweaks in the second part of this article (category, tags, filtering)

For convenience, we will create our own function, in which we will create post type and tags with categories for it. Then we raise this function on the init hook.

First Step

Function register_post_type() –

function material_init {
$labels = array(
‘name' => esc_html__('Materials', 'themedomain' ),
'singular_name' => esc_html__('Material Item',
'themedomain' ),
'add_new' => esc_html__('Add New Item', 'themedomain'
'add_new_item' => esc_html__('Add New Material Item',
'themedomain' ),
'edit_item' => esc_html__('Edit Material Item',
'themedomain' ),
'new_item' => esc_html__('Add New Material Item',
'themedomain' ),
'view_item' => esc_html__('View Item', 'themedomain' ),
'search_items' => esc_html__('Search Material',
'themedomain' ),
'not_found' => esc_html__('No material items found',
'themedomain' ),
'not_found_in_trash' => esc_html__('No material items
found in trash', 'themedomain' )
$args = array(
'labels' => $labels,
'public' => true,
'show_ui' => true,
'menu_icon' => 'dashicons-paperclip',
'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail', 'comments', 'author', 'custom-fields', 'revisions'
'capability_type' => 'post',
'hierarchical' => false,
'rewrite' => array( 'slug' => sanitize_title(
'material' ), 'with_front' => false ),
'menu_position' => 5,
'has_archive' => true
register_post_type( 'material', $args );
add_action( 'init', 'material_init' );

That’s what we got


Now let’s see what these terms mean.

$post_type (string) Post Type Name

(max. 20 characters, cannot contain capital letters or spaces, symbols, numbers, also _ or -: a-z0-9_-.)

$args (array) An array of arguments.

Consider the parameters of the array $ args

$labels (array)

An array that contains labels names for the current post type./ An array of labels for this post type.

Array Arguments  


a general name for the post type, usually plural.


name for one object of this post type.


the add new text, like „Add New“ for posts in the admin panel.


the header text of the newly created entry in the admin panel, like „Add New Post“ for posts in the admin panel.


the text for editing item


the new item text


the view item text


the text for a search for this item


the text in case nothing was found


the text if the item wasn’t’ found in a trash


the all items text

public (boolean)

Determines whether the post type is public or not. On the basis of this parameter, many others are constructed, i.e. this is a kind of pre-installation for the following parameters:

  • false
    • show_ui = false – doesn’t show user interface (UI) for this post type. publicly_queryable = false – The queries affected to this post type will not function in a template
    • exclude_from_search = true – This post type will not be taken into account when searching the site
  • show_in_nav_menus = false – This post type will be hidden from the navigation menu selection

    • show_ui = true
    • publicly_queryable = true
    • exclude_from_search = false
    • show_in_nav_menus = true

menu_icon (string)

Link for an image that will be used for this post type.

You can use an icon font  Dashicons –, that is essential for WordPress core. It contains more than 150 vector images. To set an icon as featured just type its name to a parameter.

For example, post icon name is dashicons-admin-post, and URL: dashicons-admin-links. Or if you need some special icon than make it fit 16*16 pixel)
For example get_stylesheet_directory_uri() .’/img/material_icon.png’

supports (array)

Which meta boxes should be added to editing the page for this post type.

  • title — field for entering the header of the post
  • editor — text editor form
  • excerpt — meta_box for a snippet of the post
  • author — meta_box for the Author name
  • thumbnail — meta_box for the featured image, current theme must also support post-thumbnails
  • comments — if such meta_box is present then comments for this post type are allowed
  • custom-fields — this meta_box will be supported by default.
  • revisions— such meta_box will store revisions

capability_type (string or array)

This sting to use to determine capabilities to build the read, edit, and delete. Built-in types that can be used are post and page.


Whether the post type is hierarchical.

rewrite (boolean or array) Triggers the handling of rewrites for this post type. To prevent rewrites, set to false. Default: true and use $post_type as slug.

  • slug (string)
    Customize the permalink structure slug. Defaults to the $post_type value. Should be translatable.
  • with_front (bool)
    Should the permalink structure be prepended with the front base.
    Slug takes from $wp_rewite->front. Example, if your permalink structure is blog/%postname%, then your links will be: false- /material/ postname, true – /blog/material/ postname. Defaults to true.

menu_position (integer)

The position in the menu orders the post type should appear. show_in_menu must be true.

has_archive (boolean or string)

Enables post type archives. Will use $post_type as archive slug by default. Example, if post URL is –, then archive URL will be

An archive file name in the theme will be archive-type.php. Will generate the proper rewrite rules if rewrite is enabled.

After creating this new post type go to “Settings” -> “Permalinks” and just press the “Save Changes” button. This is necessary for the clean URL rules to be restored and the rules for a new post type added there.


In the next article, we will also describe how to create custom taxonomies to custom post type.

ERP development final cta

Get a Custom Solution with Web Design Sun

At Web Design Sun, we specialize in building web applications for clients in every business and industry.  If you’re interested in custom applications for your business, contact us today.

Contact us today to get started

More From Blog

7 Web Design Tendencies for 2017

As 2017 is already here, it’s high time we all found out the major web design tendencies that will prevail during the year.
6 Mar 2017 11 min read

18 Ways Web Design Can Screw Up Your Business

When web design is not your friend, you may notice that your site has a higher bounce rate, doesn't convert well, or has low return traffic.
15 Jun 2018 14 min read

How To Develop Widgets For Gutenberg Using ACF

Gutenberg is a new WordPress editor for posts and pages, built on the principles of builders, allows you to write custom page builder elements. Using the ACF plugin, you can very simply make a widget of any type. And here we'll show how.
1 May 2020 6 min read