innhold/custom/templates/base.php
Ruben a558bf3afb Update title and add social media metadata
Add Open Graph and Twitter Card metadata for better social sharing
Implement dynamic title formatting with site title suffix Add support
for social sharing images with fallback to hero image Include default
description for better SEO Ensure proper URL handling for both HTTP and
HTTPS
2025-11-04 23:01:36 +01:00

119 lines
6.3 KiB
PHP

<?php
$startTime = microtime(true);
$publicDir = realpath($_SERVER['DOCUMENT_ROOT']);
$customCssPath = __DIR__ . '/../styles/base.css';
$defaultCssPath = __DIR__ . '/../../default/styles/base.css';
$cssPath = file_exists($customCssPath) ? $customCssPath : $defaultCssPath;
$cssUrl = file_exists($customCssPath) ? '/app/styles/base.css' : '/app/default-styles/base.css';
$cssHash = file_exists($cssPath) ? hash_file('md5', $cssPath) : 'file_not_found';
if (isset($GLOBALS['_SERVER']['SCRIPT_FILENAME'])) { $includingFile = $_SERVER['SCRIPT_FILENAME']; }
if (!empty($includingFile)) { $pageName = pathinfo($includingFile, PATHINFO_FILENAME); }
if (!in_array(basename(dirname($includingFile)), ['latest', 'live', 'frozen']) && basename(dirname($includingFile)) !== '') { $dirName = basename(dirname($includingFile)); }
function getActiveClass($href) { return rtrim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/') === rtrim($href, '/') ? 'active' : ''; }
?>
<!DOCTYPE html>
<html lang="no">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<?php
// Prepare social media metadata
$siteTitle = 'Stopp lidelsen';
$fullTitle = !empty($pageTitle) ? htmlspecialchars($pageTitle) . ' - ' . $siteTitle : $siteTitle;
$description = !empty($metaDescription) ? htmlspecialchars($metaDescription) : 'Vi arbeider for at pasienter som kan ha nytte av medisinsk cannabis skal motta likeverdig og trygg behandling med oppfølging fra lege.';
$currentUrl = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
// Determine social media image
$socialImage = null;
if (!empty($socialImageUrl)) {
// Use provided social image URL
$socialImage = $socialImageUrl;
} elseif ($_SERVER['REQUEST_URI'] === '/' || rtrim($_SERVER['REQUEST_URI'], '/') === '') {
// Use hero-bg.webp for frontpage
$socialImage = '/hero-bg.webp';
}
// Convert relative URLs to absolute for social media
if ($socialImage && !str_starts_with($socialImage, 'http')) {
$socialImage = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $socialImage;
}
?>
<title><?= $fullTitle ?></title>
<!-- Standard metadata -->
<meta name="description" content="<?= $description ?>">
<meta name="fediverse:creator" content="@stopplidelsen@oslo.town">
<!-- Open Graph metadata (Facebook, Mastodon, etc.) -->
<meta property="og:type" content="website">
<meta property="og:site_name" content="<?= $siteTitle ?>">
<meta property="og:title" content="<?= $fullTitle ?>">
<meta property="og:description" content="<?= $description ?>">
<meta property="og:url" content="<?= htmlspecialchars($currentUrl) ?>">
<?php if ($socialImage): ?>
<meta property="og:image" content="<?= htmlspecialchars($socialImage) ?>">
<meta property="og:image:alt" content="<?= $fullTitle ?>">
<?php endif; ?>
<!-- Twitter Card metadata -->
<meta name="twitter:card" content="<?= $socialImage ? 'summary_large_image' : 'summary' ?>">
<meta name="twitter:title" content="<?= $fullTitle ?>">
<meta name="twitter:description" content="<?= $description ?>">
<?php if ($socialImage): ?>
<meta name="twitter:image" content="<?= htmlspecialchars($socialImage) ?>">
<meta name="twitter:image:alt" content="<?= $fullTitle ?>">
<?php endif; ?>
<link rel="stylesheet" href="<?= $cssUrl ?>?v=<?= $cssHash ?>">
<?php if (!empty($pageCssUrl)): ?>
<link rel="stylesheet" href="<?= $pageCssUrl ?>?v=<?= $pageCssHash ?? '' ?>">
<?php endif; ?>
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<link rel="icon" href="/favicon.png" type="image/png">
<link href="/app/fonts/pt-serif/pt-serif.css" rel="stylesheet">
</head>
<body class="<?php if (isset($dirName)) echo 'section-' . $dirName . ' '; ?><?php if (isset($pageName)) echo 'page-' . $pageName; ?>">
<div class="grid-container">
<header class="contain">
<div>
<div class="logo">
<a href="/"><?php include $publicDir . '/logo.svg'; ?></a>
</div>
<nav>
<ul>
<li><a href="/" class="button <?php echo getActiveClass('/'); ?>"><?= htmlspecialchars($homeLabel ?? 'Forsiden') ?></a></li>
<?php if (!empty($navigation)): ?>
<?php foreach ($navigation as $item): ?>
<li><a href="<?= htmlspecialchars($item['url']) ?>" class="button <?php echo getActiveClass($item['url']); ?>"><?= htmlspecialchars($item['title']) ?></a></li>
<?php endforeach; ?>
<?php endif; ?>
</ul>
</nav>
</div>
</header>
<main>
<?php echo $content ?? ''; ?>
</main>
<footer>
<div class="contain">
<?php if ($currentLang === 'no'): ?>
<p>Følg oss på <a href="https://www.facebook.com/StoppLidelsen/">Facebook</a>, <a href="https://www.instagram.com/stopplidelsen/">Instagram</a> og <a rel="me" href="https://oslo.town/@stopplidelsen">Mastodon</a></p>
<?php $endTime = microtime(true); $pageLoadTime = round(($endTime - $startTime) * 1000, 2); ?>
<p class="generated">Nettsiden er håndkodet av Ruben Solvang ved hjelp av HTML, CSS og minimale doser PHP. Det tok <?php echo $pageLoadTime; ?>ms å generere siden.</p>
<?php elseif ($currentLang === 'en'): ?>
<p><a rel="me" href="https://oslo.town/@stopplidelsen">Follow us on Mastodon</a></p>
<?php $endTime = microtime(true); $pageLoadTime = round(($endTime - $startTime) * 1000, 2); ?>
<p class="generated">This website was hand-coded by Ruben Solvang using HTML, CSS and minimal doses of PHP. It took <?php echo $pageLoadTime; ?>ms to generate this page.</p>
<?php endif; ?>
</div>
</footer>
</div>
<img style="display:none" src="https://stopplidelsen.goatcounter.com/count?p=<?= htmlspecialchars($_SERVER['REQUEST_URI']) ?>">
</body>
</html>