|

WordPress Pflicht-Links im Footer absichern: mein kleines Basis-Footer-Plugin

Manche WordPress-Lösungen entstehen nicht, weil man unbedingt noch ein Plugin braucht. Sie entstehen, weil man irgendwann vor einem ziemlich simplen Problem steht und feststellt: So, wie es gerade läuft, möchte ich mich darauf nicht verlassen.

Bei mir waren das die WordPress Pflicht-Links im Footer – insbesondere Impressum und Datenschutzerklärung.

Für meine WordPress-Installationen halte ich normalerweise zusätzlich ein originales WordPress-Theme als Reserve bereit. Falls das eigentlich verwendete Theme einmal Probleme verursacht, möchte ich möglichst schnell auf ein funktionierendes Ersatz-Theme wechseln können.

Genau bei einem solchen Test fiel mir allerdings etwas auf: Die Links zu Impressum, Datenschutzerklärung und weiteren wichtigen Seiten wurden beim Wechsel des Themes nicht automatisch so dargestellt, wie ich sie benötigte. Teilweise wären dafür erst wieder Einstellungen oder Anpassungen am jeweiligen Theme notwendig gewesen.

Technisch war die Website damit vielleicht wieder erreichbar. An einer anderen Stelle hätte ich mir aber gleich das nächste Problem gebaut.

WordPress Pflicht-Links im Footer

Die Links sollten nicht vom Theme abhängen

Meine Überlegung war deshalb ziemlich einfach: Warum sollen solche grundlegenden Links überhaupt an die Gestaltung oder Menüstruktur eines bestimmten Themes gekoppelt sein?

Ein Theme darf von mir aus Farben ändern, Menüs anders darstellen oder den Footer komplett umgestalten. Die grundlegenden Verweise auf die rechtlich und organisatorisch relevanten Seiten meiner Website möchte ich davon möglichst unabhängig halten.

Aus dieser Überlegung entstand mein kleines Plugin „Basis Footer Pflicht-Links“.

Die Aufgabe ist bewusst unspektakulär: Das Plugin gibt die vorgesehenen Links im unteren Bereich der Website aus. Dadurch muss ich sie nicht für jedes verwendete Theme erneut über dessen Footer-, Menü- oder Widget-Einstellungen einrichten.

Für mich ist das vor allem eine zusätzliche Rückfallebene. Sollte ich wegen eines Fehlers kurzfristig das Theme wechseln müssen, hängt die grundsätzliche Ausgabe dieser Links nicht ausschließlich davon ab, wie das Ersatz-Theme gerade konfiguriert ist.

Ein kleines Plugin statt einer großen Lösung

Das Ganze ist keine komplexe WordPress-Erweiterung und soll auch keine sein. Ich wollte keine zusätzliche Verwaltungsoberfläche, kein Baukastensystem und keine zwanzig Optionen für etwas, das am Ende nur eine klar definierte Aufgabe erfüllen soll.

Genau für solche Dinge mag ich kleine eigene WordPress-Plugins: Eine überschaubare Funktion bleibt an einer überschaubaren Stelle. Wird das Theme gewechselt, bleibt das Plugin bestehen.

Das ist für mich sauberer, als dieselbe Anpassung direkt in verschiedene Themes einzubauen und später herausfinden zu müssen, in welcher Datei ich vor zwei Jahren eigentlich was verändert habe.

Trotzdem ist „funktioniert bei mir“ keine Garantie

So eine Lösung sollte man nicht einfach ungeprüft auf irgendeine WordPress-Installation werfen.

WordPress entwickelt sich weiter. Themes unterscheiden sich voneinander. Plugins können miteinander reagieren und selbst ein kleiner Codeabschnitt kann irgendwann auf Bedingungen treffen, die beim ursprünglichen Test nicht vorhanden waren.

Deshalb gehört für mich vor dem Einsatz immer dazu:

  • prüfen, ob der verwendete Code noch zur aktuellen WordPress-Version passt,
  • testen, ob die Ausgabe mit dem verwendeten Theme funktioniert,
  • Desktop- und Mobilansicht kontrollieren,
  • die tatsächlichen Zielseiten und Links überprüfen,
  • nach Theme-Wechseln kontrollieren, ob die Ausgabe weiterhin wie vorgesehen erscheint,
  • und vor Änderungen ein funktionierendes Backup besitzen.

Gerade die letzte Zeile klingt banal, bis sie irgendwann nicht mehr banal ist.

Auch ein Footer-Plugin ersetzt keine Kontrolle

Wichtig ist außerdem die Grenze der Idee: Das Plugin kann Links ausgeben. Es kann nicht garantieren, dass eine Website damit automatisch rechtlich vollständig oder korrekt ist.

Ob Impressum, Datenschutzerklärung oder weitere Angaben benötigt werden und welchen Inhalt diese Seiten haben müssen, ist eine andere Frage. Auch die technische Umsetzung sollte nach Änderungen an WordPress, Theme oder Pluginbestand erneut geprüft werden.

Je nach technischer Umsetzung kann außerdem die Ausgabe davon abhängig sein, dass das verwendete Theme die vorgesehenen WordPress-Schnittstellen korrekt bereitstellt. Eine absolute Garantie, dass ein selbst gebautes Plugin mit jedem denkbaren Theme und jeder zukünftigen WordPress-Version funktioniert, wäre deshalb ziemlich gewagt.

Warum ich die Lösung trotzdem sinnvoll finde

Mein Ziel war nie, damit ein großes Problem der WordPress-Welt zu lösen. Ich wollte ein kleines Problem meiner eigenen Installation zuverlässig entschärfen.

Und genau dafür gefällt mir die Lösung bis heute.

Ich kann mein eigentliches Theme verwenden, ein alternatives WordPress-Theme als Reserve bereithalten und muss mich bei einem Theme-Wechsel nicht ausschließlich darauf verlassen, dass dort bereits alle für mich wichtigen Footer-Links eingerichtet sind.

Das Plugin macht eine Sache. Mehr muss es nicht können.

Wer so etwas selbst übernehmen oder nachbauen möchte, sollte den Code vorher verstehen, ihn an die eigene Installation anpassen und die Funktion in einer sicheren Umgebung testen. Ein Backup gehört ebenfalls dazu.

Denn auch für kleine WordPress-Basteleien gilt: Nur weil ein Stück Code überschaubar aussieht, übernimmt es noch lange nicht die Verantwortung für das, was man damit macht.

WordPress Pflicht-Links im Footer als Code

<?php
/**
* Plugin Name: Basis-Footer Pflichtlinks
* Description: Zeigt vorhandene rechtliche und organisatorische Seiten automatisch in einem schlanken, themeunabhängigen Footer an.
* Version: 1.2.3
* Requires at least: 6.0
* Requires PHP: 7.4
*/

if ( ! defined( 'ABSPATH' ) ) {
exit;
}

function bfp_page_url_by_slug( $slug ) {
$page = get_page_by_path( $slug, OBJECT, 'page' );

if ( ! $page || 'publish' !== get_post_status( $page ) ) {
return '';
}

return get_permalink( $page );
}

function bfp_sitemap_url() {
if ( defined( 'WPSEO_VERSION' ) ) {
return home_url( '/sitemap_index.xml' );
}

if ( function_exists( 'wp_sitemaps_get_server' ) && function_exists( 'get_sitemap_url' ) ) {
$server = wp_sitemaps_get_server();

if ( is_object( $server ) && method_exists( $server, 'sitemaps_enabled' ) && $server->sitemaps_enabled() ) {
$url = get_sitemap_url( 'index' );
return $url ? $url : '';
}
}

return '';
}

function bfp_filter_links( $links ) {
return array_values(
array_filter(
$links,
static function ( $item ) {
return ! empty( $item['url'] );
}
)
);
}

function bfp_render_footer() {
if ( is_admin() || is_feed() || wp_doing_ajax() ) {
return;
}

$privacy_url = get_privacy_policy_url();

if ( empty( $privacy_url ) ) {
$privacy_url = bfp_page_url_by_slug( 'datenschutzerklaerung' );
}

$links = bfp_filter_links(
array(
array(
'label' => 'Datenschutzerklärung',
'url' => $privacy_url,
),
array(
'label' => 'Impressum',
'url' => bfp_page_url_by_slug( 'unser-impressum' ),
),
array(
'label' => 'Kontakt',
'url' => bfp_page_url_by_slug( 'unsere-kontaktseite' ),
),
array(
'label' => 'Rechtliche Hinweise',
'url' => bfp_page_url_by_slug( 'unsere-rechtlichen-hinweise' ),
),
array(
'label' => 'Sitemap',
'url' => bfp_sitemap_url(),
),
array(
'label' => '* = Affiliate-/Werbelinks',
'url' => bfp_page_url_by_slug( 'unsere-affiliatelinks-werbelinks' ),
),
array(
'label' => 'Unsere AGB',
'url' => bfp_page_url_by_slug( 'unsere-allgemeinen-geschaeftsbedingungen' ),
),
array(
'label' => 'Widerrufsbelehrung',
'url' => bfp_page_url_by_slug( 'unsere-widerrufsbelehrung' ),
),
)
);

if ( empty( $links ) ) {
return;
}
?>
<style id="bfp-footer-styles">
#bfp-footer {
box-sizing: border-box !important;
display: block !important;
position: relative !important;
inset: auto !important;
float: none !important;
clear: both !important;
width: 100vw !important;
max-width: none !important;
margin: 1.25rem 0 0 !important;
padding: 1.25rem 1.5rem 1.5rem !important;
z-index: 2147483000 !important;
text-align: center !important;
font-size: 1.32rem !important;
line-height: 1.5 !important;
background: var(--wp--preset--color--base, #fff);
color: var(--wp--preset--color--contrast, #111);
isolation: isolate;
}

#bfp-footer .bfp-footer__links {
box-sizing: border-box;
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: center;
width: 100%;
max-width: none;
gap: 0.45rem 1.5rem;
}

#bfp-footer a {
display: inline-block;
flex: 0 0 auto;
white-space: nowrap;
color: inherit !important;
text-decoration: underline !important;
text-underline-offset: 0.15em;
}

@media (max-width: 600px) {
#bfp-footer {
font-size: 1rem !important;
padding-left: 1rem !important;
padding-right: 1rem !important;
}

#bfp-footer .bfp-footer__links {
column-gap: 1rem;
}
}
</style>

<nav id="bfp-footer" aria-label="Rechtliche und organisatorische Links">
<div class="bfp-footer__links">
<?php foreach ( $links as $item ) : ?>
<a href="<?php echo esc_url( $item['url'] ); ?>"><?php echo esc_html( $item['label'] ); ?></a>
<?php endforeach; ?>
</div>
</nav>

<script id="bfp-footer-position">
(function () {
var footer = document.getElementById('bfp-footer');

if (footer && document.body && footer.parentNode !== document.body) {
document.body.appendChild(footer);
}
}());
</script>
<?php
}

add_action( 'wp_footer', 'bfp_render_footer', 1000 );

Ähnliche Beiträge