How to Create custom post type taxonomy category in WordPress
Custom Taxonomy for Custom Post Types
Taxonomies are a great way to group things together and help us to search posts belonging to a specific group. In WordPress we generally use Categories and Tags as taxonomies. The steps given below explain how to create custom taxonomies for your CPT.
Step 1 : Register Custom Post Type
Open functions.php file in your theme and Paste these Code, in our case we will register Photogallery as CPT.
// Photo Gallary Customs Post Register
function create_posttype()
{
register_post_type(
'photogallery',
array(
'labels' => array(
'name' => __('Photo gallery'),
'singular_name' => __('photogallery')
),
'public' => true,
'menu_position' => 5,
'supports' => array('editor', 'title', 'thumbnail',),
'has_archive' => true,
'rewrite' => array('slug' => 'photogallery'),
'taxonomies' => array('photogallery', 'photogallery-category'),
)
);
}
add_action('init', 'create_posttype');
Making Custom Archive For Custom Post Type
Create a file name archive-photogallery.php in theme's root directory and paste these code in it.
Url: mywebsite.com/photogallery
Note: (if url does't work please do that)This will re-write the htaccess file and then the re-write should work.
- Navigate to Settings -> permalinks
- Change the permalink structure to Default
- Save settings
- Change to custom structure or post name (or any other structure)
- Save Settings
<!-- archive-photogallery.php -->
<?php get_header(); ?>
<div id="primary">
<div id="content" role="main">
<?php $mypost = array('post_type' => 'photogallery',);
$loop = new WP_Query($mypost); ?>
<?php while ($loop->have_posts()) : $loop->the_post(); ?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<header class="entry-header">
<div style="float: top; margin: 10px">
<?php the_post_thumbnail(); ?>
</div>
<strong>Title: </strong><?php the_title(); ?><br />
<br />
</header>
<div class="entry-content">
<!-- <?php the_content(); ?> -->
</div>
<hr />
</article>
<?php endwhile; ?>
</div>
</div>
<?php wp_reset_query(); ?>
<?php get_footer(); ?>
Step 2 : Implementation of Custom Function and Registering Custom Taxonomy
Paste these Code in functions.php as well, in that case we will register Photogallery's custom Taxonomy.
//Create category for Photo post type
function tr_create_my_taxonomy()
{
register_taxonomy(
'photogallery-categories',
'photogallery',
array(
'label' => __('Photogallery Categories'),
'rewrite' => array('slug' => 'photogallery-category'),
'hierarchical' => true,
'has_archive' => true
)
);
}
add_action('init', 'tr_create_my_taxonomy');
Making Custom Archive For Custom Taxonomy
Create a file name taxonomy-photogallery-categories.php in theme's root directory and paste these code in it.
<?php get_header(); ?>
<div class="custom_container">
<div class="photo_subcat_posts_grid">
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<div class="single-block auto">
<div class="img-box">
<a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>">
<?php if (has_post_thumbnail()) {
the_post_thumbnail('custom-size');
} else { ?>
<img src="<?php bloginfo('template_directory'); ?>/img/default-img_final.gif" alt="<?php the_title(); ?>" />
<?php } ?></a>
</div>
<h4><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php echo wp_trim_words(get_the_title(), 10); ?></a></h4>
</div>
<?php endwhile;
endif ?>
</div>
<div class="pagination1">
<div class="pagi_inner">
<?php echo paginate_links(array(
'prev_text' => __('«', 'textdomain'),
'next_text' => __('»', 'textdomain'),
)); ?>
</div>
</div>
</div>
<?php get_footer(); ?>
Other Support Options:
To support custom post type post in different templaet
// To Support Custom Post Format in different Template
function namespace_add_custom_types($query)
{
if (is_single() || is_category() || is_tag() && empty($query->query_vars['suppress_filters'])) {
$query->set('post_type', array(
'post', 'nav_menu_item', 'photogallery','videogallery'
));
return $query;
}
}
add_filter('pre_get_posts', 'namespace_add_custom_types');
Custom Post type Post Query
<?php $args1 = array(
'post_type' => 'photogallery',
'posts_per_page' => 10,
'order' => 'DESC',
);
$lastpost = new WP_Query($args1);
if ($lastpost->have_posts()) : while ($lastpost->have_posts()) : $lastpost->the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>">
<?php if (has_post_thumbnail()) {
the_post_thumbnail();
} else { ?>
<img src="<?php bloginfo('template_directory'); ?>/img/default-img_final.gif" alt="<?php the_title(); ?>" />
<?php } ?></a>
<a href="<?php the_permalink(); ?>"><span class="media-body"><?php echo wp_trim_words(get_the_title(), 10); ?></span></a>
</li>
<?php endwhile;
endif ?>
3 comments
MH
Mahmud Hossain
July 16, 2026
Well written. Bookmarked this for my team's reference. Looking forward to more content like this.
SB
Sumaiya Begum
July 15, 2026
Does this approach also work for larger datasets? Our team is dealing with something similar at scale.
RK
Rafiq Khan
July 14, 2026
Really insightful article! This is one of the clearest explanations I've come across. The examples make it very easy to understand.
AD
AdminAdminJuly 14, 2026Thank you Rafiq! Glad it was helpful.
