feat(industries): build 5-page Industries section

Implements the Industries hub + 4 detail pages (Police, Special Forces,
Military, Firefighters) following the same data + partial + custom
template pattern as Solutions.

- inc/industries-data.php: 4 industries keyed by slug, copy verbatim
  from PDF Strategie & Contenu D.7-D.10.
- template-parts/industry-detail.php: hero + section iterator + shared
  conversion banner. Hero differs from Solution's: eyebrow + tagline-as-H1
  (no trademark concat), no upsell block.
- templates/page-industry-detail.php: Custom Template assigned to the
  4 child pages, looks up slug in industries-data.
- templates/page-industries-overview.php: Hub /industries/ with 4 cards.

5 pages seeded by one-shot mu-plugin (asterion-seed-industries.php in
LocalWP) and verified HTTP 200:
  /industries/                  55 KB
  /industries/police/           63 KB
  /industries/special-forces/   62 KB
  /industries/military/         60 KB
  /industries/firefighters/     60 KB

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-09 12:27:25 +02:00
parent 8207c5f72b
commit eb4a13ec0f
4 changed files with 489 additions and 0 deletions

View File

@@ -0,0 +1,245 @@
<?php
/**
* Asterion Bricks — Industries data
*
* Source of truth for the 4 industry pages (Police, Special Forces, Military,
* Firefighters). Copy lifted verbatim from PDF Strategie & Contenu D.7-D.10.
*
* Same section schema as inc/solutions-data.php : prose | cards | list | cta.
*
* @package AsterionBricks
*/
defined('ABSPATH') || exit;
return [
/* ========================================================== */
/* POLICE — national & municipal */
/* ========================================================== */
'police' => [
'eyebrow' => 'National & Municipal',
'title' => 'Police',
'tagline' => "Police training, when the schedule won't bend.",
'meta_title' => 'VR Training for Police — National & Municipal | Asterion VR',
'meta_description' => 'Vehicle stops, identity checks, urban CQB, de-escalation, riot containment. The VR training platform built for contemporary policing.',
'hero_lead' => 'Your officers train less than the doctrine demands. Live-fire ranges are saturated. Live exercises are rare and expensive. PROSERVE puts a saturated range, an urban CQB course, and a de-escalation rehearsal hall in the same facility you already run — and lets your officers use them every shift.',
'ctas' => [
['label' => 'Request a Demo for police use', 'href' => '/request-demo/', 'variant' => 'primary'],
],
'sections' => [
[
'type' => 'list',
'eyebrow' => 'The reality',
'title' => 'The training deficit, in numbers.',
'items' => [
'French regulation requires 90 cartridges fired per officer per year. The actual median sits between 10 and 15.',
'A live-fire exercise costs 5 to 7 times more than the equivalent simulated exercise (RAND Corporation, 2021).',
'Only 12% of police exercises integrate physiological stressors comparable to real conditions (National Police Foundation, 2021).',
'Tactical errors under stress increase by 40% compared to baseline conditions (Journal of Experimental Psychology, 2020).',
'42% of intervention errors are linked to insufficient realistic preparation (National Institute of Justice, 2022).',
],
],
[
'type' => 'cards',
'eyebrow' => 'What PROSERVE does for police',
'title' => 'What PROSERVE delivers.',
'items' => [
['title' => 'Volume — train every shift, not every quarter', 'body' => 'With MY PROSERVE in 9 m² of station floor, every officer can drill marksmanship, vehicle stops, and identity checks between two patrols. The legal floor becomes the daily floor.'],
['title' => 'Realism — under stress, with real recoil', 'body' => 'Unreal Engine 5 rendering. Physical ballistic simulation. Real-recoil weapons. AI civilians who panic, freeze, run, comply, or escalate. Urban environments — supermarkets, residential apartments, transit stations, parking decks — with day, night, and emergency-light conditions.'],
['title' => 'Decision-making — judgment and the law', 'body' => 'Many of our scenarios force the trainee to choose: shoot, hold, communicate, retreat. Every decision is recorded, replayable, and discussable in the AAR. Training the body is one thing. Training the decision is another.'],
['title' => 'Data — measurable progress per officer', 'body' => 'Reaction time, precision, civilian collateral, target identification accuracy. Per-officer dashboards over time. Unit-level statistics for command. Evidence to support training decisions, deployments, and audits.'],
],
],
[
'type' => 'list',
'eyebrow' => 'Police-relevant scenarios',
'title' => 'Scenarios designed with police instructors.',
'items' => [
'Vehicle stop with cooperative, evasive, or armed driver',
'Identity check escalating to violent resistance',
'CQB entry into a residential apartment',
'Active shooter in a supermarket',
'Hostage situation in a small business',
'Crowd containment with isolated aggressor',
'Domestic violence intervention',
'Fugitive pursuit through a parking deck',
'Static guard duties at sensitive facilities',
],
'cta' => ['label' => 'See the full scenario library', 'href' => '/technology/scenarios/'],
],
[
'type' => 'list',
'eyebrow' => 'Configurations',
'title' => 'Recommended configurations for police.',
'items' => [
'MY PROSERVE — for police municipale, station-floor continuous training, regional rollouts.',
'PROSERVE FLEX — for tactical units, mobile gendarmerie, BAC, K9 handlers.',
'PROSERVE ACADEMY — for police academies and regional training centres.',
],
],
],
],
/* ========================================================== */
/* SPECIAL FORCES */
/* ========================================================== */
'special-forces' => [
'eyebrow' => 'Tactical units',
'title' => 'Special Forces',
'tagline' => 'Special forces train differently. Their simulation should, too.',
'meta_title' => 'VR Training for Special Forces & Tactical Units | Asterion VR',
'meta_description' => 'Hostage rescue, dynamic entries, sniper-spotter coordination, hostile crowd extraction. Built for the units where every error has a name.',
'hero_lead' => 'PROSERVE was built in close partnership with serving and former tactical operators. It rejects the generic FPS-style simulator. The ballistics are physical. The recoil is real. The civilians act on personality, not script. The instructor sees what no one else can. And every session ends with a frame-by-frame after-action review.',
'ctas' => [
['label' => 'Request a T&E Kit', 'href' => '/request-te-kit/', 'variant' => 'primary'],
],
'sections' => [
[
'type' => 'prose',
'eyebrow' => 'Why this matters',
'title' => 'Why generic simulators fail tactical units.',
'body' => "Most VR training tools were built for entertainment first, training second. They look right at thirty meters and break apart at three. PROSERVE was engineered the other way: ballistic physics first, AI behavior second, photoreal rendering third. Because tactical units don't grade themselves on visuals. They grade themselves on the call they made under contact.",
],
[
'type' => 'cards',
'eyebrow' => 'Capabilities tactical units care about',
'title' => 'Capabilities specifically built for elite units.',
'items' => [
['title' => 'Cooperative team scenarios', 'body' => 'Up to 16 operators in the same scenario. Avatars whose role-specific appearance signals function: point, breach, security, sniper, K9, command. Voice communication is proximity-natural. Hand signals are visible.'],
['title' => 'Bespoke scenarios on demand', 'body' => 'PROSERVE+ produces custom environments — your specific buildings, your area of operations, your high-value targets. From specification to delivery: one to three months per environment.'],
['title' => 'Real-weapon integration', 'body' => "Use your service weapon firing blanks, fitted with our UWeD. Or use a high-fidelity gas-blowback replica. Either way, recoil, sound, and tracking remain coherent. Shot detection is dual-channel (sound + recoil) to avoid false positives from a teammate's fire."],
['title' => 'AI adversaries with personality', 'body' => 'Our autonomous agents have vision, hearing, and configurable personality — courage, caution, aggressiveness. They flee, take cover, change targets, coordinate. They do not run on scripts. The same scenario is never identical twice.'],
['title' => 'Instructor cockpit', 'body' => "From a separate room, the instructor walks through walls, watches the engagement from any angle, switches into any operator's first-person view, toggles shot trace and field-of-view overlays, manipulates the scenario without pausing it."],
['title' => 'Frame-level AAR', 'body' => "Replay any session in top-down tactical, free-camera, or any operator's first-person view. Speed control, pause, frame-by-frame. Field of view of every trainee, shot trace, hit location, reaction time. Compare runs to runs, operators to operators, unit to historical baseline."],
],
],
[
'type' => 'list',
'eyebrow' => 'Sample doctrine drills',
'title' => 'Sample doctrine drills.',
'items' => [
'Dynamic entry on a multi-room residence with hostages and unknowns',
'Hostage rescue in a moving vehicle',
'Counter-piracy entry on a vessel with hostile crew',
'Sniper-spotter coordination on a long-range engagement',
'VIP extraction from a hostile crowd',
'Counter-IED awareness in a vehicle convoy',
'Counter-drone intercept (with PROSERVE+ counter-UAS module)',
],
],
[
'type' => 'list',
'eyebrow' => 'Configurations',
'title' => 'Recommended configurations.',
'items' => [
'PROSERVE FLEX — for forward deployment, on-site training, partner-force training programs.',
'PROSERVE ACADEMY — for permanent training facilities, doctrine R&D, joint-services exercises.',
'PROSERVE+ — bespoke environments, custom adversary doctrine, country-specific weapon profiles.',
],
],
],
],
/* ========================================================== */
/* MILITARY */
/* ========================================================== */
'military' => [
'eyebrow' => 'Armed forces',
'title' => 'Military',
'tagline' => 'Military VR training. Sovereign. Modular. Field-deployable.',
'meta_title' => 'Military VR Training — Asterion VR | Sovereign, Modular, Field-Ready',
'meta_description' => 'MOUT, convoy escort, FOB defense, IED awareness, joint drills. French-engineered, GDPR-native, fully offline-capable VR training.',
'hero_lead' => 'PROSERVE supports modern military training across infantry, urban operations, convoy escort, and joint drills. The platform is designed in France, runs entirely on-premise, and operates without any internet connection. Your data, your scenarios, your operators — never leave your network.',
'ctas' => [
['label' => 'Request a Quote', 'href' => '/request-quote/', 'variant' => 'primary'],
],
'sections' => [
[
'type' => 'list',
'eyebrow' => 'Why sovereignty matters',
'title' => 'Sovereignty by design.',
'items' => [
'Engineered and produced in France — not a relabeled foreign platform.',
'On-premise compute — no cloud dependency, no foreign data jurisdiction.',
'Operates fully offline — your training scenarios, your unit data, your AAR videos never leave your network.',
'GDPR-native — designed under European data protection by default.',
'Custom development under sovereign-clearable conditions on request.',
],
],
[
'type' => 'cards',
'eyebrow' => 'Military capabilities',
'title' => 'Military-grade capabilities.',
'items' => [
['title' => 'MOUT — Military Operations on Urban Terrain', 'body' => 'CQB on residential, commercial, industrial, and government building interiors. Bespoke environments replicating actual mission geometry available through PROSERVE+.'],
['title' => 'Convoy escort', 'body' => 'Vehicle-mounted weapon training, IED-proximity awareness, immediate action drills under contact.'],
['title' => 'FOB and base defense', 'body' => 'Static and dynamic perimeter defense scenarios. Counter-infiltration drills. Coordinated response to multi-vector threats.'],
['title' => 'Joint operation drills', 'body' => 'Multi-team scenarios with up to 16 operators in the same simulation. Mixed-role exercises (infantry + special forces + command). Inter-services coordination.'],
['title' => 'Counter-drone training', 'body' => 'PROSERVE+ counter-UAS module for the detection, identification, and intercept of hostile drones in operational environments.'],
['title' => 'Live-data capture and AAR', 'body' => 'Per-operator and per-unit performance dashboards, exportable for command-level review and after-action analysis.'],
],
],
[
'type' => 'list',
'eyebrow' => 'Configurations',
'title' => 'Recommended configurations.',
'items' => [
'PROSERVE FLEX — for forward operating bases, deployable training cells, mobile training teams.',
'PROSERVE ACADEMY — for garrison training centres and doctrine schools.',
'PROSERVE+ — bespoke environments and adversary doctrine.',
],
],
],
],
/* ========================================================== */
/* FIREFIGHTERS */
/* ========================================================== */
'firefighters' => [
'eyebrow' => 'Emergency services',
'title' => 'Firefighters',
'tagline' => 'Train the worst day. Safely. Repeatedly.',
'meta_title' => 'VR Training for Firefighters & Emergency Services | Asterion VR',
'meta_description' => 'Structure fires, hazmat, multi-casualty triage, confined-space rescue. Train the worst day, safely, repeatedly, at one-tenth the cost.',
'hero_lead' => "Real fire is loud, hot, and finite. You can't rehearse a chemical leak the right way, you can't run a multi-casualty extraction every Tuesday, and you can't put recruits through a confined-space rescue at full scale. PROSERVE for firefighters and emergency services lets your crews drill the rare, the dangerous, and the irreversible — as often as needed.",
'ctas' => [
['label' => 'Request a Demo for fire & emergency', 'href' => '/request-demo/', 'variant' => 'primary'],
],
'sections' => [
[
'type' => 'list',
'eyebrow' => 'The case for VR in fire training',
'title' => 'The economics of fire training.',
'items' => [
'Live-fire exercises require purpose-built training structures, environmental compliance, and significant logistics.',
'Rare scenarios (industrial accidents, NRBC, mass-casualty triage) are nearly impossible to rehearse at full scale.',
'VR sessions cost a fraction of an equivalent live exercise — and can run multiple times per day, with consistent fidelity.',
'AAR is video-recorded, replayable, and measurable — not relying on instructor recall.',
],
],
[
'type' => 'cards',
'eyebrow' => 'Capabilities for fire & emergency',
'title' => 'Capabilities built for first responders.',
'items' => [
['title' => 'Structure fires', 'body' => 'Residential, commercial, and industrial structure-fire scenarios with smoke, heat-haze visual effects, dynamic fire spread, and victim location uncertainty. Practice search-and-rescue patterns, ventilation decisions, and command communication.'],
['title' => 'Hazmat & NRBC', 'body' => 'Chemical, radiological, and biological scenarios that cannot be rehearsed with real materials. Practice donning, decontamination, perimeter establishment, and specialized equipment use.'],
['title' => 'Confined-space and high-angle rescue', 'body' => 'Train rope work, confined-space entry, and casualty extraction in geometry that mirrors real intervention contexts.'],
['title' => 'Multi-casualty triage', 'body' => 'Practice mass-casualty triage at scale. AI casualties with realistic injury presentations and time-dependent deterioration.'],
['title' => 'Industrial accidents', 'body' => 'Custom scenarios via PROSERVE+ that replicate the specific industrial sites in your area of operation — refineries, chemical plants, transport hubs.'],
['title' => 'Joint exercises with police', 'body' => 'Fire-police-medical joint scenarios. Same scenario, mixed avatars, real-time inter-services coordination drills.'],
],
],
[
'type' => 'list',
'eyebrow' => 'Configurations',
'title' => 'Recommended configurations.',
'items' => [
'PROSERVE FLEX — for SDIS regional training cells and on-site continuous training.',
'PROSERVE ACADEMY — for national and regional firefighter schools.',
'PROSERVE+ — local industrial site replicas, NRBC scenarios, joint multi-services exercises.',
],
],
],
],
];

View File

@@ -0,0 +1,130 @@
<?php
/**
* Asterion Bricks — Industry detail partial
*
* Renders one industry page (Police / Special Forces / Military / Firefighters)
* from data passed via `set_query_var('av_industry', $industry_data)`.
*
* Section types : prose | cards | list | cta (same as solution-detail).
*
* Hero differs from solution-detail : eyebrow + H1 (tagline) only — no
* trademark concat, no upsell block.
*
* @package AsterionBricks
*/
defined('ABSPATH') || exit;
$industry = get_query_var('av_industry');
if (! is_array($industry)) {
return;
}
$home_url = home_url('/');
?>
<!-- HERO -->
<section class="av-hero" aria-labelledby="industry-headline">
<div class="av-hero__media" aria-hidden="true">
<div style="width:100%;height:100%;background:
radial-gradient(ellipse at 50% 40%, rgba(11,31,58,0.4), transparent 65%),
linear-gradient(135deg, #081427 0%, #0B1F3A 50%, #1F3252 100%);"></div>
</div>
<div class="av-container">
<div class="av-hero__inner">
<p class="av-hero__eyebrow"><?php echo esc_html($industry['eyebrow']); ?></p>
<h1 id="industry-headline" class="av-hero__headline"><?php echo esc_html($industry['tagline']); ?></h1>
<p class="av-hero__sub"><?php echo esc_html($industry['hero_lead']); ?></p>
<div class="av-hero__ctas">
<?php foreach ($industry['ctas'] as $cta) :
$variant = ($cta['variant'] === 'primary') ? 'av-btn--primary' : 'av-btn--secondary av-btn--on-dark';
?>
<a href="<?php echo esc_url($home_url . ltrim($cta['href'], '/')); ?>" class="av-btn <?php echo esc_attr($variant); ?> av-btn--lg">
<?php echo esc_html($cta['label']); ?>
</a>
<?php endforeach; ?>
</div>
</div>
</div>
</section>
<!-- SECTIONS -->
<?php
foreach ($industry['sections'] as $idx => $section) :
$is_dark = ($idx % 2 === 1);
$section_class = 'av-section' . ($is_dark ? ' av-section--dark' : '');
?>
<section class="<?php echo esc_attr($section_class); ?>" data-av-reveal>
<div class="av-container">
<div class="av-section__head">
<span class="av-eyebrow<?php echo $is_dark ? ' av-eyebrow--gold' : ''; ?>"><?php echo esc_html($section['eyebrow']); ?></span>
<h2 class="av-section__title"><?php echo esc_html($section['title']); ?></h2>
<?php if (! empty($section['lead'])) : ?>
<p class="av-section__lead"><?php echo esc_html($section['lead']); ?></p>
<?php endif; ?>
</div>
<?php if ($section['type'] === 'prose' && ! empty($section['body'])) : ?>
<p class="av-section__lead" style="max-width:72ch;font-size:var(--text-body-lg);">
<?php echo esc_html($section['body']); ?>
</p>
<?php elseif ($section['type'] === 'cards' && ! empty($section['items'])) : ?>
<div class="av-grid-3">
<?php foreach ($section['items'] as $card) : ?>
<article class="av-card<?php echo $is_dark ? ' is-on-dark' : ''; ?> av-card--feature">
<div class="av-card__body">
<h3 class="av-card__title" style="font-size:var(--text-h4);"><?php echo esc_html($card['title']); ?></h3>
<p class="av-card__excerpt"><?php echo esc_html($card['body']); ?></p>
</div>
</article>
<?php endforeach; ?>
</div>
<?php elseif ($section['type'] === 'list' && ! empty($section['items'])) : ?>
<ul style="list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:var(--space-3);max-width:72ch;font-size:var(--text-body-lg);line-height:var(--leading-body-lg);<?php echo $is_dark ? 'color:var(--color-text-on-dark-muted);' : 'color:var(--color-text-secondary);'; ?>">
<?php foreach ($section['items'] as $item) : ?>
<li style="padding-left:var(--space-6);position:relative;">
<span aria-hidden="true" style="position:absolute;left:0;top:0.6em;width:8px;height:8px;background:var(--color-brand-gold);border-radius:50%;"></span>
<?php echo esc_html($item); ?>
</li>
<?php endforeach; ?>
</ul>
<?php if (! empty($section['cta'])) : ?>
<p style="margin-top:var(--space-8);">
<a href="<?php echo esc_url($home_url . ltrim($section['cta']['href'], '/')); ?>" class="av-link<?php echo $is_dark ? ' av-link--on-dark' : ''; ?> av-link--with-arrow">
<?php echo esc_html($section['cta']['label']); ?>
</a>
</p>
<?php endif; ?>
<?php endif; ?>
</div>
</section>
<?php endforeach; ?>
<!-- CONVERSION BANNER (shared) -->
<section class="av-conversion-banner">
<div class="av-container">
<div class="av-conversion-banner__head">
<h2 class="av-conversion-banner__title">Train like the threat is now.</h2>
<p class="av-conversion-banner__lead">Three paths into the platform — pick the one that fits where you are.</p>
</div>
<div class="av-conversion-banner__grid">
<div class="av-conversion-banner__card">
<h3 class="av-conversion-banner__card-title">Request a Demo</h3>
<p class="av-conversion-banner__card-desc">A 30-minute tailored session with our team.</p>
<a href="<?php echo esc_url($home_url . 'request-demo/'); ?>" class="av-btn av-btn--primary av-btn--md">Schedule a demo</a>
</div>
<div class="av-conversion-banner__card">
<h3 class="av-conversion-banner__card-title">Request a T&E Kit</h3>
<p class="av-conversion-banner__card-desc">A PROSERVE case on loan at your facility for 5 to 10 days.</p>
<a href="<?php echo esc_url($home_url . 'request-te-kit/'); ?>" class="av-btn av-btn--on-dark av-btn--secondary av-btn--md">Request the kit</a>
</div>
<div class="av-conversion-banner__card">
<h3 class="av-conversion-banner__card-title">Request a Quote</h3>
<p class="av-conversion-banner__card-desc">A detailed quote and deployment plan within 5 working days.</p>
<a href="<?php echo esc_url($home_url . 'request-quote/'); ?>" class="av-btn av-btn--on-dark av-btn--secondary av-btn--md">Get a quote</a>
</div>
</div>
</div>
</section>

View File

@@ -0,0 +1,83 @@
<?php
/**
* Template Name: Industries Overview
*
* Hub page /industries/ — lists the 4 industries as cards.
*
* @package AsterionBricks
*/
defined('ABSPATH') || exit;
get_header();
$home_url = home_url('/');
$industries = [
[
'eyebrow' => 'National & Municipal',
'title' => 'Police',
'excerpt' => 'Vehicle stops, identity checks, urban CQB, de-escalation, riot containment. Built for the realities of contemporary policing.',
'href' => '/industries/police/',
'gradient' => 'linear-gradient(135deg,#1F3252,#0B1F3A)',
],
[
'eyebrow' => 'Tactical units',
'title' => 'Special Forces',
'excerpt' => 'Hostage rescue, dynamic entries, hostile crowd extraction, sniper-spotter coordination. Built for the units where every error has a name.',
'href' => '/industries/special-forces/',
'gradient' => 'linear-gradient(135deg,#1F3252,#0B1F3A)',
],
[
'eyebrow' => 'Armed forces',
'title' => 'Military',
'excerpt' => 'MOUT, convoy escort, FOB defense, IED awareness, joint operation drills. Built for armed forces that deploy fast and adapt faster.',
'href' => '/industries/military/',
'gradient' => 'linear-gradient(135deg,#1F3252,#0B1F3A)',
],
[
'eyebrow' => 'Emergency services',
'title' => 'Firefighters',
'excerpt' => "Structure fires, hazmat, multi-casualty triage, confined-space rescue, industrial accidents. Built for first responders who can't rehearse the worst day at full scale.",
'href' => '/industries/firefighters/',
'gradient' => 'linear-gradient(135deg,#1F3252,#0B1F3A)',
],
];
?>
<section class="av-hero" aria-labelledby="industries-headline">
<div class="av-hero__media" aria-hidden="true">
<div style="width:100%;height:100%;background:
radial-gradient(ellipse at 50% 40%, rgba(11,31,58,0.4), transparent 65%),
linear-gradient(135deg, #081427 0%, #0B1F3A 50%, #1F3252 100%);"></div>
</div>
<div class="av-container">
<div class="av-hero__inner">
<p class="av-hero__eyebrow"><?php esc_html_e('Industries', 'asterion-bricks'); ?></p>
<h1 id="industries-headline" class="av-hero__headline">Built with operators, for operators.</h1>
<p class="av-hero__sub">
PROSERVE&trade; is not a generic VR platform repackaged for the public sector. Every scenario, every weapon profile, every instructor metric was specified by serving and former operators in close partnership with our engineering team.
</p>
</div>
</div>
</section>
<section class="av-section" data-av-reveal>
<div class="av-container">
<div class="av-grid-4" style="grid-template-columns:repeat(auto-fit, minmax(280px, 1fr));">
<?php foreach ($industries as $i) : ?>
<article class="av-card">
<a href="<?php echo esc_url($home_url . ltrim($i['href'], '/')); ?>" class="av-card__media" aria-hidden="true" tabindex="-1" style="background:<?php echo esc_attr($i['gradient']); ?>;display:block;"></a>
<div class="av-card__body">
<span class="av-card__eyebrow"><?php echo esc_html($i['eyebrow']); ?></span>
<h2 class="av-card__title"><a href="<?php echo esc_url($home_url . ltrim($i['href'], '/')); ?>" style="color:inherit;text-decoration:none;"><?php echo esc_html($i['title']); ?></a></h2>
<p class="av-card__excerpt"><?php echo esc_html($i['excerpt']); ?></p>
<div class="av-card__cta">
<a href="<?php echo esc_url($home_url . ltrim($i['href'], '/')); ?>" class="av-link av-link--with-arrow"><?php echo esc_html($i['title']); ?> training</a>
</div>
</div>
</article>
<?php endforeach; ?>
</div>
</div>
</section>
<?php get_footer(); ?>

View File

@@ -0,0 +1,31 @@
<?php
/**
* Template Name: Industry Detail
*
* Custom page template for /industries/police/, /industries/special-forces/,
* /industries/military/, /industries/firefighters/.
*
* Looks up the page slug in inc/industries-data.php and hands the matched
* tier off to template-parts/industry-detail.php.
*
* @package AsterionBricks
*/
defined('ABSPATH') || exit;
$slug = get_post_field('post_name', get_queried_object_id());
$data = include AV_THEME_DIR . '/inc/industries-data.php';
if (! isset($data[$slug])) {
get_header();
echo '<section class="av-section"><div class="av-container">';
echo '<h1>' . esc_html(get_the_title()) . '</h1>';
echo '<p>' . esc_html__('Industry data not found for slug:', 'asterion-bricks') . ' ' . esc_html($slug) . '</p>';
echo '</div></section>';
get_footer();
return;
}
get_header();
set_query_var('av_industry', $data[$slug]);
get_template_part('template-parts/industry-detail');
get_footer();