Post types & taxonomies
The custom post types and taxonomies Highend registers, their metabox groups, and how to query them.
Highend registers seven custom post types and six custom taxonomies, all conditional on the matching Highend Module being enabled (checked with highend_is_module_enabled(); see Functions & constants). Modules are enabled by default. A module's toggle only takes effect once the master Enable/Disable Highend Modules switch is turned on, so all seven post types register out of the box. None of them declare has_archive or a custom rewrite slug unless noted below, so each uses the default /{post_type}/{post_name}/ permalink structure and has no built-in archive page. Grid/listing pages are built with the dedicated page templates instead (Portfolio Standard, Gallery Standard, and so on).
Portfolio
Registered in includes/portfolio/class-highend-portfolio.php, gated by the hb_module_portfolio option.
| Post type | portfolio |
| Taxonomy | portfolio_categories (hierarchical), rewrite slug portfolio_category (filter: highend_portfolio_category_rewrite) |
| Supports | title, excerpt, editor, thumbnail, page-attributes, custom-fields, comments |
| REST API / block editor | Yes: the only custom post type with show_in_rest enabled |
| Single template | single-portfolio.php (theme root) |
| Metabox groups | portfolio_settings, portfolio_layout_settings (portfolio only); general_settings, background_settings, misc_settings (shared with post/page/team/faq) |
$portfolio_items = new WP_Query( array(
'post_type' => 'portfolio',
'posts_per_page' => 12,
'tax_query' => array(
array(
'taxonomy' => 'portfolio_categories',
'field' => 'slug',
'terms' => 'branding',
),
),
) );Gallery
Registered in includes/gallery/class-highend-gallery.php, gated by hb_module_gallery.
| Post type | gallery |
| Taxonomy | gallery_categories (hierarchical), rewrite slug gallery_category (filter: highend_gallery_category_rewrite) |
| Supports | title, editor, thumbnail, page-attributes, custom-fields, comments |
| REST API / block editor | No: show_in_rest isn't set for this post type (only its taxonomy is) |
| Single template | template-parts/single/single-gallery.php, loaded via get_template_part( 'template-parts/single/single', 'gallery' ) |
| Metabox groups | gallery_settings (gallery only); no general_settings/background_settings/misc_settings (those aren't attached to gallery) |
$gallery_items = new WP_Query( array(
'post_type' => 'gallery',
'posts_per_page' => -1,
'orderby' => 'menu_order',
'order' => 'ASC',
) );Team members
Registered in includes/core/class-highend-theme-setup.php, gated by hb_module_team_members.
| Post type | team |
| Taxonomy | team_categories (hierarchical), rewrite slug team_member_category (filter: highend_team_member_category_rewrite) |
| Supports | editor, title, excerpt, thumbnail, page-attributes |
| Single template | single-team.php (theme root) |
| Metabox groups | team_layout_settings, team_member_settings (team only); featured_section (shared with page); general_settings, background_settings, misc_settings (shared with post/page/portfolio/faq) |
$team_members = new WP_Query( array(
'post_type' => 'team',
'posts_per_page' => -1,
'orderby' => 'menu_order',
'order' => 'ASC',
) );FAQ
Registered in includes/core/class-highend-theme-setup.php, gated by hb_module_faq.
| Post type | faq |
| Taxonomy | faq_categories (hierarchical), rewrite slug faq_category (filter: highend_faq_category_rewrite) |
| Supports | title, editor, page-attributes, custom-fields, comments |
| Single template | template-parts/single/single-faq.php, loaded via get_template_part( 'template-parts/single/single', 'faq' ) |
| Metabox groups | general_settings, background_settings, misc_settings (shared with post/page/team/portfolio) |
$faqs = new WP_Query( array(
'post_type' => 'faq',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'faq_categories',
'field' => 'slug',
'terms' => 'billing',
),
),
) );Testimonials
Registered in includes/core/class-highend-theme-setup.php, gated by hb_module_testimonials.
| Post type | hb_testimonials |
| Taxonomy | testimonial_categories (hierarchical), rewrite slug testimonial_category (filter: highend_testimonial_category_rewrite) |
| Supports | title, page-attributes, custom-fields, editor, comments |
| Single template | template-parts/single/single-hb_testimonials.php |
| Metabox groups | testimonial_type_settings (testimonials only) |
hb_testimonials is registered public => true (so single URLs resolve normally), but query_var => false, exclude_from_search => true, and show_in_nav_menus => false. It won't appear in search results, custom-menu post-type pickers, or answer a ?hb_testimonials= query var. Query it explicitly with 'post_type' => 'hb_testimonials', as below.
$testimonials = new WP_Query( array(
'post_type' => 'hb_testimonials',
'posts_per_page' => 6,
) );Clients
Registered in includes/core/class-highend-theme-setup.php, gated by hb_module_clients.
| Post type | clients |
| Taxonomy | client_categories (hierarchical), rewrite slug client_category (filter: highend_client_category_rewrite) |
| Supports | title, page-attributes |
| Metabox groups | clients_settings (clients only) |
clients is registered publicly_queryable => false. There's no front-end single template for it at all, and visiting its permalink returns a 404. It exists purely as data for the Client Carousel/Logos elements; query it the same way ('post_type' => 'clients') and read its meta, but don't link to get_permalink() for it.
Pricing tables
Registered in includes/core/class-highend-theme-setup.php, gated by hb_module_pricing_tables.
| Post type | hb_pricing_table |
| Supports | title, page-attributes, custom-fields |
| Metabox groups | pricing_settings (pricing tables only) |
Like clients, publicly_queryable => false means there's no public single page. Unlike clients, hb_pricing_table also sets query_var => false, so it doesn't answer a ?hb_pricing_table= query var either. Pricing tables are read directly (by ID, or with 'post_type' => 'hb_pricing_table') and rendered through the [pricing_table] shortcode, not linked to individually.
Reading a post type's meta
Every metabox group above is read the same way, with vp_metabox() using "{group_id}.{field_id}":
$team_role = vp_metabox( 'team_member_settings.hb_employee_position', '', $post_id );
$author = vp_metabox( 'testimonial_type_settings.hb_testimonial_author', '', $post_id );Field IDs inside each group aren't listed here. Check the corresponding file in admin/metaboxes/ (for example meta-team-member-settings.php for team_member_settings) for the exact field IDs available in that group.
In the post editor, a post type with two or more groups shows them as tabs of one Highend Settings box (ID highend_settings), with some fields regrouped by topic. The group IDs, field IDs and saved meta are the same as before, so vp_metabox() calls don't change.
Post likes
The Like button (Portfolio and blog posts) stores its count in the _likes post meta key on any post type, read and written through hb_like_this(). See Functions & constants.