Reference
Template overrides
Copy a template into a w3bullhorn/ directory in your theme and the plugin uses yours instead. The child theme is checked first, then the parent, then the plugin’s own copy — so the way WordPress asks you to customise a theme is the way this works.
Resolution order
Where a template is looked for
Three places, in this order, and the first readable file wins.
wp-content/themes/acme-child/w3bullhorn/job-listing.php <- wins
wp-content/themes/acme/w3bullhorn/job-listing.php <- then this
wp-content/plugins/w3rp-core/templates/job-listing.php <- else this
Overrides live under a w3bullhorn/ subdirectory so that your theme can hold them without colliding with its own template names. On a site with no child theme the first two paths are the same directory and the duplicate is skipped.
A template name is validated against a strict pattern before it is ever joined to a path, and every resolved path is re-checked to be inside one of those three roots. A path pointing anywhere else is refused, so this seam cannot be turned into an arbitrary file include.
Available
The templates you can override
Fourteen files. Copy the one you need; do not copy the directory.
| archive-job.php | The job listing archive |
|---|---|
| job-listing.php | The listing itself, used by the archive and the listing block |
| job-single.php | The body of a single job |
| single-job.php | The single job page wrapper |
| form-preview.php | The application form preview in the admin |
| parts/job-card.php | One job in a listing |
| parts/filters.php | The search and filter controls |
| parts/pagination.php | Listing pagination |
| parts/key-facts.php | The job’s key facts block |
| parts/overview.php | The job description section |
| parts/recruiter.php | The consultant shown on the job |
| parts/apply-slot.php | Where the application form is placed |
| parts/related.php | Related roles |
| parts/sample-notice.php | The notice shown over sample data |
WordPress templates
Your theme’s own templates still win
The plugin does not take the page over.
Separately from the override directory above, the ordinary WordPress template hierarchy applies. A theme that ships a real archive-job.php or taxonomy-job_category.php at its top level wins outright, and the plugin steps aside. Its own wrapper is supplied only when the theme’s choice was a generic fallback — archive.php, index.php, or a block theme’s canvas.
The job post type is job and the category taxonomy is job_category. Classic and block themes need different amounts of document from the plugin, and both are handled: your header, footer and design tokens are the theme’s throughout.
| Post type | job |
|---|---|
| Taxonomy | job_category |
| Theme template that wins | archive-job.php, taxonomy-job_category.php, single-job.php in your theme root |
| Override directory | w3bullhorn/ in the active theme, then the parent theme |
| Permitted names | One or two path segments of lowercase letters, digits and hyphens, ending .php |
| Code-level seam | The w3rp_template_path filter, for the exceptional case |
w3rp_template_path
The filter, and when not to use it
add_filter(
'w3rp_template_path',
static function ( ?string $found, string $name ): ?string {
if ( 'parts/job-card.php' !== $name ) {
return $found;
}
// Must be inside the active theme, its parent, or the plugin.
return get_stylesheet_directory() . '/alternate/job-card.php';
},
10,
2
);
A path that is not a readable file inside the active theme, its parent or the plugin is ignored. Reach for this only when the directory convention genuinely cannot express what you need — choosing a template by language, say, or by a request condition. For ordinary customisation, a file in the override directory is clearer to whoever maintains the site after you.
Reference