Action hooks
Every do_action() call in Highend's own code, grouped by where it fires, with parameters and use cases.
This is a full reference of the action hooks Highend's own theme code fires: everything you can hook into with add_action() from a child theme's functions.php. It doesn't include the many standard hooks inside the theme's copied woocommerce/ and bbpress/ override templates (woocommerce_before_cart, bbp_template_before_single_topic, and so on). Those are WooCommerce's and bbPress's own documented hooks, unchanged from their defaults, so refer to WooCommerce's own hook docs for those.
For the counterpart list of apply_filters() calls, see Filter hooks.
How to read this page
Each row gives the hook name, the file where it fires, the arguments passed to your callback, and a one-line use case. Where a "region" hook wraps a larger block, like highend_header, Highend itself listens on that same hook to render the default markup, so removing the listener with remove_action() and adding your own replaces that region entirely; adding your own callback at a later priority runs alongside it.
// Runs on the same hook Highend uses for the page title and featured section.
// Use a later priority to run after them.
add_action( 'highend_after_header', 'highend_child_announcement_bar', 30 );
function highend_child_announcement_bar() {
echo '<div class="announcement-bar">Free shipping this week</div>';
}Setup and bootstrap
| Hook | Fires in | Params | Use case |
|---|---|---|---|
highend_loaded | functions.php:84 | — | The Highend singleton has finished loading constants, includes, and objects. Safe point to assume the whole theme is initialized. |
highend_after_setup_theme | includes/core/class-highend-theme-setup.php:145 | — | Fires at the end of Highend's own after_setup_theme callback. Add or remove add_theme_support() calls, register more nav menu locations. |
highend_admin_loaded | admin/class-highend-admin.php:52 | — | Fires once Highend_Admin finishes its own hook registration. Only runs in wp-admin. |
highend_theme_installed | includes/core/class-highend-install.php:85 | — | Fires whenever the theme's stored highend_theme_version option is behind the running HB_THEME_VERSION, on first activation and on every later theme update alike, not just the first install. |
highend_theme_updated | includes/core/class-highend-install.php:55 | — | Fires immediately after highend_theme_installed, on the same condition (stored version behind HB_THEME_VERSION). The two always fire together on a single request, so this isn't a separate "update only" event. Check get_option( 'highend_theme_version' ) yourself if you need to distinguish a first install from an update. |
highend_enqueue_scripts | includes/core/class-highend-enqueue-scripts.php:168 | — | Fires at the end of Highend's wp_enqueue_scripts callback, after the parent stylesheet is already enqueued. The reliable place to enqueue a child theme's own assets with highend-style as a dependency. See Create a child theme. |
highend_demo_import_complete | hbframework/admin/utilities/class-demo-importer.php:293 | — | Fires once a demo import (all steps) finishes. |
Header and navigation
| Hook | Fires in | Params | Use case |
|---|---|---|---|
highend_before_page_wrapper | header.php:27 | — | Right before the opening wrapper markup, before anything else on the page. |
highend_before_header | header.php:33 | — | Immediately before the header region. |
highend_header | header.php:34 | — | Renders the header itself (top bar + main header). Highend's own listener draws the default header; unhook it to replace the header entirely. |
highend_after_header | header.php:35 | — | Immediately after the header region. Highend already uses this hook for two things: the page title bar (highend_page_title) and the featured section (highend_featured_section_template). A callback you add here runs alongside those; use a later priority to run after them, as in the example above. |
highend_before_header_bar | template-parts/top-bar/top-bar.php:16 | — | Before the top info bar's contents. |
highend_after_header_bar | template-parts/top-bar/top-bar.php:50 | — | After the top info bar's contents. |
highend_main_navigation_start | template-parts/header/navigation.php:16 | — | Just inside the opening <nav> of the main menu, before menu items. |
highend_main_navigation_end | template-parts/header/navigation.php:46 | — | Just inside the closing of the main menu, after menu items. |
highend_side_navigation_start | template-parts/header/side-navigation.php:16 | — | Start of the side navigation panel (Left Panel header layout). |
highend_side_navigation_logo_after | template-parts/header/side-navigation.php:21 | — | Right after the logo inside the side navigation panel. |
highend_side_navigation_end | template-parts/header/side-navigation.php:46 | — | End of the side navigation panel. |
highend_featured_section_before | template-parts/header/featured-section.php:15 | — | Before the page's featured section (image/video header area). |
highend_featured_section | template-parts/header/featured-section.php:16 | — | Renders the featured section content itself. |
highend_featured_section_after | template-parts/header/featured-section.php:17 | — | After the featured section. |
Content, loop, and single
| Hook | Fires in | Params | Use case |
|---|---|---|---|
highend_main_content_start | index.php, archive.php, search.php, page.php, single.php, and the blog.php, blog-grid.php, blog-minimal.php, gallery-standard.php, login.php, portfolio-standard.php, and portfolio-simple.php page templates | — | Right after the opening of the main content wrapper, on these templates. Highend's own listener (highend_main_content_start()) outputs the opening markup here, and on blog-listing templates a second listener (highend_before_blog_listing, priority 20) adds context above the loop: the author info box on author archives, category/tag description, or a "search again" prompt. Not fired on blog-grid-fullwidth.php, contact.php, gallery-fullwidth.php, presentation-fullwidth.php, blank.php, or maintenance.php. Those build #main-content directly. |
highend_main_content_end | Same files as above | — | Right before the main content wrapper closes. Highend's listener is highend_main_content_end(). |
highend_before_single_content | single.php:26 | — | Before a single post's content. No default listener (a clean hook). |
highend_single_content | single.php:27 | — | Renders the single post/page content itself. Highend's listener (highend_single_content()) loads template-parts/single/single-{post_type}.php. |
highend_after_single_content | single.php:28 | — | After a single post's content. Highend already hooks three things here: highend_post_author_infobox, highend_post_related_articles, and highend_single_comments_template. Your own callback runs alongside them. |
highend_blog | index.php:23, search.php:23, page-templates/blog.php:36, blog-grid.php:36, blog-grid-fullwidth.php:31, blog-minimal.php:36 | $template (string, which blog layout to render), $page_id (int, optional: the page ID when triggered from a page template) | Renders a blog listing. Highend's listener (highend_blog_output) resolves $template to blog, blog-small, blog-grid, blog-grid-fullwidth, or blog-minimal and outputs that layout. |
highend_before_blog_loop | functions/template-parts.php:1412 | — | Immediately before the post loop inside a blog listing. |
highend_blog_loop | functions/template-parts.php:1413 | $template (string) | Fires the actual entry loop. Highend's listener (highend_blog_loop()) loops the active query with have_posts()/the_post() and calls get_template_part( 'template-parts/entry/entry', $template ) per post. |
highend_after_blog_loop | functions/template-parts.php:1414 | — | Immediately after the post loop (pagination normally renders after this). |
highend_archive | archive.php:23 | — | Renders archive page content. Highend's listener dispatches to the category-archive hooks below, or falls back to highend_blog. |
highend_gallery_category_archive | functions/template-parts.php:1903 | — | Fires instead of highend_blog when viewing a gallery_categories term archive. |
highend_portfolio_category_archive | functions/template-parts.php:1905 | — | Fires instead of highend_blog when viewing a portfolio_categories term archive. |
highend_team_category_archive | functions/template-parts.php:1907 | — | Fires instead of highend_blog when viewing a team_categories term archive. |
Post types with their own region hook
| Hook | Fires in | Params | Use case |
|---|---|---|---|
highend_portfolio | page-templates/portfolio-standard.php:36, portfolio-simple.php:36 | $template (string, portfolio-standard or portfolio-simple), $page_id (int) | Renders the Portfolio page template's grid. |
highend_gallery | page-templates/gallery-standard.php:35 | $template (string), $page_id (int) | Renders the Gallery page template's grid. |
Footer
| Hook | Fires in | Params | Use case |
|---|---|---|---|
highend_before_footer | footer.php:15 | — | Before the footer widget columns. Highend hooks four things here: the one-page navigation bullets, the back-to-top button, the quick contact form, and the pre-footer callout (highend_pre_footer()). A callback you add runs alongside all of them. |
highend_footer | footer.php:16 | — | Renders the footer widget columns. Highend's listener is highend_footer_widgets(). |
highend_after_footer | footer.php:17 | — | After the footer widget columns. Highend hooks two things here: the copyright bar (highend_copyright()) and the single post next/previous links (highend_single_next_prev()). A callback you add runs alongside both. |
highend_after_page_wrapper | footer.php:23 | — | After the closing wrapper markup, the last thing on the page before wp_footer(). |
Page templates (Contact, Login, 404)
| Hook | Fires in | Params | Use case |
|---|---|---|---|
highend_contact_page_form | page-templates/contact.php:103 | — | Renders the form on the Contact page template. Replace to swap in a different form (Contact Form 7, WPForms, and so on) without editing the parent template. |
highend_login_form | page-templates/login.php:34 | — | Renders the form on the Login page template. |
highend_404_page_start | 404.php:19 | — | Start of the 404 template's content area. |
highend_404_page | 404.php:21 | — | Renders the 404 page content itself. |
highend_404_page_before_content | functions/template-parts.php:2021 | — | Immediately before the 404 message/search box. |
highend_404_page_after_content | functions/template-parts.php:2025 | — | Immediately after the 404 message/search box. |
highend_404_page_end | 404.php:23 | — | End of the 404 template's content area. |
Examples
Add a callout above the post content on every single post, without touching single.php:
add_action( 'highend_before_single_content', 'highend_child_post_notice' );
function highend_child_post_notice() {
if ( ! is_singular( 'post' ) ) {
return;
}
echo '<div class="hb-notice">This article was last reviewed in 2026.</div>';
}Enqueue a child theme script only after Highend's own assets are queued:
add_action( 'highend_enqueue_scripts', 'highend_child_scripts' );
function highend_child_scripts() {
wp_enqueue_script(
'highend-child-scripts',
get_stylesheet_directory_uri() . '/assets/script.js',
array( 'jquery' ),
wp_get_theme()->get( 'Version' ),
true
);
}Swap out the Contact page template's form for a Contact Form 7 shortcode:
remove_action( 'highend_contact_page_form', 'highend_contact_page_template_form' ); // Highend's own callback, in functions/template-parts.php
add_action( 'highend_contact_page_form', 'highend_child_contact_form' );
function highend_child_contact_form() {
echo do_shortcode( '[contact-form-7 id="123" title="Contact form"]' );
}remove_action() needs the exact function (or class method) name Highend used when it called add_action(), not just the hook name. Check the relevant file (linked in the tables above) for the listener's callback name before removing it. It isn't always the same as the hook name.