Custom post types extend WordPress beyond blog posts and pages. They are the foundation of any content-driven WordPress site — portfolios, products, testimonials, team members, events, and more.
When to Use a Custom Post Type
Use a CPT when your content has a distinct structure that does not fit posts or pages. If it needs its own archive, its own admin menu, and its own set of meta fields, it is a custom post type.
Registration Best Practices
Always register on the init hook. Include full labels for a polished admin experience. Enable show_in_rest for Gutenberg compatibility. Set has_archive to true if you want a listing page. Choose supports carefully — only include what the content type needs.
Custom Taxonomies
Pair your CPT with custom taxonomies for organization. A portfolio post type might have a “Project Type” taxonomy. A snippet post type might have “Category” and “Language” taxonomies. Register taxonomies on init and attach them via the taxonomies argument or register_taxonomy_for_object_type().
Template Hierarchy
WordPress automatically looks for single-{post_type}.php and archive-{post_type}.php. Create these template files to control how your CPT content displays. Use get_template_part() for reusable card components.
REST API Integration
With show_in_rest enabled, your CPT is automatically available at /wp-json/wp/v2/{post_type}. This enables the block editor, mobile apps, and headless frontends to interact with your custom content.