Posts and pages are two sides of the same coin, the main difference is that posts (a.k.a blog-posts) are sorted by date and have optional categories or tags, pages do not.
Under the hood they are both called post_types but they have been initialized with different parameters.
We will be creating our own post type with it’s own taxonomy (categories) for storing favourite music videos.
Create a new plugin
# nvim wp-content/plugins/music-ctp.php
<?php
/*
* @package Music Custom Posttype
* @version 1.0
* Plugin Name: Music Custom Posttype
* Description: Custom posttype for music videos
* Version: 1.0
* Author: Nimpen, ASBRA AB
* Author URI: http://asbra.nu
*/
/**
* Create Custom Post Type
*/
function music_posttype($posttype)
{
$posttype = 'music'; // Name in Database
$labels = array(
'name' => __('Music posts'),
'singular_name' => __('Music post')
);
$attr = array(
'labels' => $labels,
'supports' => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'revisions', 'custom-fields', ),
'public' => true,
'has_archive' => true,
'menu_position' => 1,
);
register_post_type( $posttype, $attr);
}
add_action( 'init', 'music_posttype' );
/**
* Create a Custom Taxonomy for Custom Post Type
*/
function music_taxonomy() {
register_taxonomy(
'music_categories', // Name of taxonomy
'music', // Name of post type
array(
'hierarchical' => true,
'label' => 'Music Categories', //Display name
'query_var' => true,
)
);
}
add_action( 'init', 'music_taxonomy');After you’ve enabled or disabled a custom post type or a custom taxonomy be sure to put the following command at the end of your functions file and run once:
flush_rewrite_rules();
Otherwise your webpage will state something like “Ooops! this is a stupid message”

