Was ist eine Breadcrumb-Navigation?
Eine Breadcrumb-Navigation ist eine sekundäre Navigationsform, die Nutzerinnen und Nutzern zeigt, wo sie sich aktuell innerhalb der Seitenstruktur Deiner Webseite befinden. Sie stellt den Pfad von der Startseite bis zur aktuell aufgerufenen Seite dar und besteht aus klickbaren Links.
Typisches Beispiel:
Startseite → Kategorie → Unterkategorie → Aktuelle Seite
Breadcrumbs verbessern sowohl die Benutzerfreundlichkeit (Usability) als auch die Suchmaschinenoptimierung (SEO), da Suchmaschinen die interne Seitenstruktur besser verstehen können.
Vorteile einer Breadcrumb-Navigation
- bessere Orientierung für Besucher
- schnellere Navigation zu übergeordneten Seiten
- geringere Absprungrate
- bessere interne Verlinkung
- Darstellung der Breadcrumbs direkt in den Google-Suchergebnissen möglich
- besonders hilfreich bei großen Webseiten, Online-Shops und Blogs
Breadcrumb-Navigation für HTML-Webseiten
Wenn Du Deine Webseite klassisch mit HTML, CSS und PHP erstellst, solltest Du von Beginn an auf eine logische Ordner- und Dateistruktur achten. Inhalte mit gleichem Themenbereich gehören in entsprechend benannte Verzeichnisse.
Beispiel:
/urlaub/
/urlaub/spanien/
/urlaub/spanien/mallorca.html
Eine saubere Struktur erleichtert nicht nur die Pflege Deiner Webseite, sondern ist auch die Grundlage für eine automatisch generierte Breadcrumb-Navigation.
Dynamische Breadcrumbs mit PHP
Eine effiziente Lösung besteht darin, auf jeder Seite lediglich einen PHP-Code-Schnipsel einzubinden, der den aktuellen Verzeichnispfad automatisch ausliest und als Breadcrumb-Navigation ausgibt. So bleibt der Pflegeaufwand minimal, selbst bei großen Webseiten.
Unten findest Du einen lizenzfreien (Public-Domain/Unlicense) PHP-Code für dynamische Breadcrumbs. Er funktioniert ohne externe Bibliotheken, ist SEO-freundlich, unterstützt Pretty-URLs und klassische Dateinamen, und Du kannst ihn sowohl in reinen HTML/PHP-Projekten als auch in Template-Setups verwenden. Nutzung ausdrücklich auf eigenes Risiko!
1) PHP-Datei: breadcrumbs.php
<?php
/**
* Breadcrumbs – Public Domain (Unlicense)
* Du darfst diesen Code ohne Einschränkungen nutzen, ändern und weitergeben.
*
* Nutzung:
* - include_once __DIR__ . '/breadcrumbs.php';
* - echo render_breadcrumbs([...]);
*/
/**
* Standard: Segment-Name hübsch formatieren (slug -> Titel)
*/
function bc_pretty_label(string $segment): string
{
// Query/Fragment entfernen
$segment = preg_replace('~[?#].*$~', '', $segment);
// Dateiendungen entfernen (html, php, etc.)
$segment = preg_replace('~\.(html?|php|aspx?)$~i', '', $segment);
// Bindestriche/Underscores zu Leerzeichen
$segment = str_replace(['-', '_'], ' ', $segment);
// Mehrfache Leerzeichen zusammenfassen
$segment = preg_replace('~\s+~', ' ', trim($segment));
// Umlaute/UTF-8: mb_* nutzen, falls verfügbar
if (function_exists('mb_convert_case')) {
return mb_convert_case($segment, MB_CASE_TITLE, 'UTF-8');
}
return ucwords($segment);
}
/**
* Aktuellen Request-Pfad robust ermitteln (ohne Domain)
*/
function bc_current_path(): string
{
$uri = $_SERVER['REQUEST_URI'] ?? '/';
// Nur Pfadteil, ohne Querystring
$path = parse_url($uri, PHP_URL_PATH) ?? '/';
// Doppelte Slashes entfernen
$path = preg_replace('~/{2,}~', '/', $path);
// trailing slash beibehalten? Für Breadcrumbs meist egal, wir normalisieren:
$path = rtrim($path, '/');
return $path === '' ? '/' : $path;
}
/**
* Breadcrumb-HTML rendern
*
* Optionen:
* - home_label: Text für Startseite
* - home_url: URL der Startseite
* - separator: Trennzeichen (reiner Text)
* - container_class: CSS-Klasse des nav
* - list_class: CSS-Klasse des ol
* - item_class: CSS-Klasse der li
* - active_class: CSS-Klasse für letztes Element
* - label_map: Assoziatives Array 'segment' => 'Titel'
* - skip_segments: Array mit Segmenten, die übersprungen werden sollen (z.B. 'index.php')
* - base_path: Falls Dein Projekt in einem Unterordner läuft (z.B. '/meinprojekt')
* - include_file_label: Wenn true, wird eine Datei (z.B. page.html) als letztes Element berücksichtigt
*/
function render_breadcrumbs(array $opts = []): string
{
$defaults = [
'home_label' => 'Startseite',
'home_url' => '/',
'separator' => '→',
'container_class' => 'breadcrumbs',
'list_class' => 'breadcrumbs__list',
'item_class' => 'breadcrumbs__item',
'active_class' => 'is-active',
'label_map' => [],
'skip_segments' => ['index.php', 'index.html', 'index.htm'],
'base_path' => '', // z.B. '/meinprojekt'
'include_file_label'=> true,
];
$o = array_merge($defaults, $opts);
$path = bc_current_path();
// base_path abziehen, falls gesetzt (z.B. Projekt läuft unter /meinprojekt)
if (!empty($o['base_path']) && $o['base_path'] !== '/') {
$bp = rtrim($o['base_path'], '/');
if ($bp !== '' && strpos($path, $bp) === 0) {
$path = substr($path, strlen($bp));
$path = $path === '' ? '/' : $path;
}
}
if ($path === '/' || $path === '') {
// Auf Startseite keine Breadcrumbs oder nur Startseite – Du kannst das Verhalten hier ändern
return '';
}
$segments = array_values(array_filter(explode('/', trim($path, '/')), 'strlen'));
// Optional: Wenn letzte Komponente eine Datei ist, kann man sie anzeigen oder ausblenden
if (!$o['include_file_label'] && !empty($segments)) {
$last = end($segments);
if (preg_match('~\.[a-z0-9]{2,5}$~i', $last)) {
array_pop($segments);
}
}
// Skip-Segmente entfernen
$segments = array_values(array_filter($segments, function ($seg) use ($o) {
return !in_array($seg, $o['skip_segments'], true);
}));
if (empty($segments)) {
return '';
}
$items = [];
// Home
$homeUrl = $o['home_url'];
if (!empty($o['base_path']) && $o['base_path'] !== '/') {
$homeUrl = rtrim($o['base_path'], '/') . '/';
}
$items[] = [
'label' => $o['home_label'],
'url' => $homeUrl,
'active'=> false
];
// Aufbau der URLs pro Segment
$accum = '';
$count = count($segments);
for ($i = 0; $i < $count; $i++) {
$seg = $segments[$i];
$accum .= '/' . $seg;
// URL (mit base_path)
$url = $accum;
if (!empty($o['base_path']) && $o['base_path'] !== '/') {
$url = rtrim($o['base_path'], '/') . $accum;
}
$isLast = ($i === $count - 1);
// Label: Map bevorzugen, sonst automatisch
$label = $o['label_map'][$seg] ?? bc_pretty_label($seg);
$items[] = [
'label' => $label,
'url' => $url,
'active'=> $isLast
];
}
// HTML ausgeben (ARIA + geordnete Liste)
$sep = ' <span class="breadcrumbs__sep" aria-hidden="true">' . htmlspecialchars($o['separator'], ENT_QUOTES, 'UTF-8') . '</span> ';
$html = '<nav class="' . htmlspecialchars($o['container_class'], ENT_QUOTES, 'UTF-8') . '" aria-label="Breadcrumbs">';
$html .= '<ol class="' . htmlspecialchars($o['list_class'], ENT_QUOTES, 'UTF-8') . '">';
$total = count($items);
for ($i = 0; $i < $total; $i++) {
$it = $items[$i];
$classes = $o['item_class'] . ($it['active'] ? ' ' . $o['active_class'] : '');
$html .= '<li class="' . htmlspecialchars($classes, ENT_QUOTES, 'UTF-8') . '">';
if ($it['active']) {
$html .= '<span aria-current="page">' . htmlspecialchars($it['label'], ENT_QUOTES, 'UTF-8') . '</span>';
} else {
$html .= '<a href="' . htmlspecialchars($it['url'], ENT_QUOTES, 'UTF-8') . '">' . htmlspecialchars($it['label'], ENT_QUOTES, 'UTF-8') . '</a>';
}
$html .= '</li>';
if ($i < $total - 1) {
$html .= '<li class="breadcrumbs__sep-item" aria-hidden="true">' . $sep . '</li>';
}
}
$html .= '</ol></nav>';
return $html;
}
2) Einbindung in Deine Seite (Beispiel)
In jeder PHP-Seite (oder im Template-Header):
<?php
include_once __DIR__ . '/breadcrumbs.php';
echo render_breadcrumbs([
'home_label' => 'Start',
'home_url' => '/', // oder '/index.php'
'separator' => '→',
// Optional: Wenn Dein Projekt in /web/ liegt:
// 'base_path' => '/web',
// Optional: einzelne Segmente schöner benennen:
'label_map' => [
'urlaub' => 'Urlaub',
'spanien' => 'Spanien',
'mallorca' => 'Mallorca',
],
]);
?>
3) Minimal-CSS (optional, aber empfohlen)
.breadcrumbs { font-size: 0.95rem; }
.breadcrumbs__list { list-style: none; padding: 0; margin: 0; display: flex; flex-wrap: wrap; gap: 0.25rem; }
.breadcrumbs__item a { text-decoration: none; }
.breadcrumbs__item.is-active { font-weight: 600; }
.breadcrumbs__sep-item { display: flex; align-items: center; }
Hinweise zur Praxis
- Wenn Du sprechende URLs nutzt (z. B.
/ratgeber/seo/breadcrumbs/), werden die Segmente sauber erkannt. - Wenn Du Dateinamen nutzt (
/seo/breadcrumbs.php), wird auch das letzte Element korrekt als „Breadcrumbs“ angezeigt (Dateiendung wird entfernt). - Mit
base_pathkannst Du Installationen in Unterordnern sauber abbilden (z. B./projektname). - Mit
label_mapkannst Du sehr gezielt einzelne Segmente „übersetzen“ oder schöner benennen.
Breadcrumb-Navigation für WordPress
Wenn Du WordPress nutzt, musst Du keine eigene Lösung programmieren. Es gibt zahlreiche WordPress-Plugins, mit denen Du Breadcrumb-Navigationen schnell und sauber integrieren kannst – auch ohne Programmierkenntnisse.
WordPress-Plugins für Breadcrumb-Navigationen
| Link zum Anbieter | Beschreibung des Angebots |
|---|---|
| https://de.wordpress.org/plugins/bread-crumb-matching-any-theme-skin/ | Breadcrumb-Navigation auf Basis der URL-Struktur |
| https://de.wordpress.org/plugins/breadcrumb | Schlankes, leichtgewichtiges Breadcrumb-Plugin |
| https://de.wordpress.org/plugins/breadcrumb-block/ | Gutenberg-Block, WooCommerce-kompatibel |
| https://de.wordpress.org/plugins/breadcrumb-navxt/ | Sehr umfangreiches und SEO-freundliches Plugin |
| https://de.wordpress.org/plugins/breadcrumb-tmc/ | Einfaches Plugin für klassische Themes |
| https://de.wordpress.org/plugins/catch-breadcrumb/ | Flexibel konfigurierbare Breadcrumb-Lösung |
| https://de.wordpress.org/plugins/flexy-breadcrumb/ | Modernes Plugin mit Anpassungsmöglichkeiten |
| https://de.wordpress.org/plugins/woocommerce-breadcrumbs/ | Speziell für WooCommerce-Shops |
Alle Plugins sind kostenlos über das offizielle WordPress-Pluginverzeichnis verfügbar.
Breadcrumb-Navigation mit CSS (manuell)
Für sehr kleine Webseiten oder spezielle Layouts kannst Du eine Breadcrumb-Navigation auch manuell mit HTML und CSS erstellen.
Eine anschauliche Anleitung mit Beispielcode findest Du bei W3Schools:
https://www.w3schools.com/howto/howto_css_breadcrumbs.asp
Diese Lösung ist statisch und eignet sich vor allem für einfache Seiten ohne komplexe Struktur.
SEO-Tipps für Breadcrumb-Navigationen
- verwende sprechende URLs
- integriere strukturierte Daten (Schema.org / BreadcrumbList)
- vermeide doppelte Breadcrumb-Pfade
- setze klare Trennzeichen (z. B. „→“ oder „/“)
- achte auf konsistente interne Verlinkung