How to Create a Custom Post Type in WordPress Without Using a Plugin

WordPress is a powerful content management system that allows you to create and manage various types of content on your website. One of the key features of WordPress is the ability to create custom post types, which enable you to organize and display different types of content in a way that suits your needs. While there are many plugins available to create custom post types, you can also achieve this functionality without using any plugins by writing your own PHP code.

Understanding Custom Post Types

Before we dive into the PHP code, let’s first understand what custom post types are. In WordPress, a post type is a way to classify different types of content. By default, WordPress comes with built-in post types such as posts and pages. However, you may have specific content that doesn’t fit into these default post types, such as testimonials, portfolio items, or products. This is where custom post types come in handy.

A custom post type allows you to define a new type of content that is separate from the default post types. This means you can create a custom post type for testimonials, for example, and have a dedicated area in your WordPress admin panel to manage and display them.

Creating a Custom Post Type

To create a custom post type in WordPress without using a plugin, you need to add some PHP code to your theme’s functions.php file. Here’s an example of the code you can use:

function custom_post_type() {
    $args = array(
        'public' => true,
        'label'  => 'Custom Post Type',
        'supports' => array( 'title', 'editor', 'thumbnail', 'custom-fields' ),
        'taxonomies' => array( 'category', 'post_tag' ),
    register_post_type( 'custom_post_type', $args );
add_action( 'init', 'custom_post_type' );

Let’s break down the code above:

  • function custom_post_type(): This is the function that defines our custom post type. You can name this function whatever you like.
  • $args: This variable holds an array of arguments that define the behavior and settings of our custom post type. In this example, we have set the post type to be public, given it a label of “Custom Post Type”, and specified the supported features such as title, editor, thumbnail, and custom fields.
  • register_post_type(): This function registers our custom post type with WordPress. The first parameter is the slug of the post type, and the second parameter is the array of arguments we defined earlier.
  • add_action( 'init', 'custom_post_type' ): This line of code hooks our custom_post_type function to the init action, which ensures that our custom post type is registered when WordPress initializes.

Once you have added this code to your theme’s functions.php file, you should see a new menu item in your WordPress admin panel labeled “Custom Post Type”. You can click on this menu item to manage and create new posts for your custom post type.

Customizing Your Custom Post Type

Now that you have created your custom post type, you may want to further customize its behavior and appearance. Here are a few additional PHP code examples that you can use:

1. Changing the Icon:

function custom_post_type_icon() {
    $icon_url = '';
    <style type="text/css">
        #adminmenu #menu-posts-custom_post_type .wp-menu-image:before {
            content: 'f109';
            background-image: url(<?php echo $icon_url; ?>);
            background-repeat: no-repeat;
add_action( 'admin_head', 'custom_post_type_icon' );

This code changes the default WordPress icon for your custom post type to a custom icon of your choice. You need to replace the $icon_url variable with the URL of your desired icon.

2. Adding Custom Meta Boxes:

function custom_post_type_meta_boxes() {
        'Custom Meta Box',
add_action( 'add_meta_boxes', 'custom_post_type_meta_boxes' );

function custom_meta_box_callback() {
    // Your custom meta box content goes here

This code adds a custom meta box to the edit screen of your custom post type. You can replace the 'Custom Meta Box' with your desired meta box title and customize the custom_meta_box_callback function to define the content of your meta box.


Creating a custom post type in WordPress without using a plugin is a great way to have more control over your website’s content. By writing your own PHP code, you can define custom post types, customize their behavior, and create a tailored experience for managing different types of content on your website.

Remember to always backup your theme’s functions.php file before making any changes and test your code on a staging environment before implementing it on your live website. With a little bit of PHP knowledge and the examples provided in this post, you can start creating custom post types in WordPress without relying on plugins.

Discover more from WP Notch

Level up your skills. Get expert tips delivered straight to you. Subscribe!

Continue Reading