WordPress Seite als 404 Seite ausliefern

Es ist immer wieder ein Problem mit WordPress eine wirklich individuell gestaltete 404-Seite auszuliefern, die alle Features einer „normalen“ Seite (Page) von dem jeweiligen Theme hat. Umso komplexer das Theme ist, umso spartanischer wirkt die 404-Seite.

Was man sich da dann oft wünscht, ist, warum kann ich nicht einfach eine Seite erstellen, und diese WordPress Seite als 404 Seite ausliefern?

Ich bin dann schon auf wirklich schöne Premium Themes gestoßen, die das versucht haben umzusetzen. Nur leider total falsch! 🙁

Aber gottseidank lässt sich das recht einfach fixen.

OK, fangen wir erstmal an, wie WordPress grundsätzlich mit nicht-existenten URLs umgeht.

Grundsätzlich existieren die URLs von WordPress ja physisch überhaupt nicht. Es sei denn man hat die Permalinks (Unter „Einstellungen“ im Standardmenü) auf „Standard“ stehen gelassen. Was nun ja wirklich nicht zu empfehlen ist. Idealerweise hat sollte man auf jeden Fall den „Beitragsnamen“ mit in die URL aufnehmen.

WordPress geht also hin und schaut erst einmal nach, ob irgendeine Seite oder ein Beitrag mit der vom Browser angefragten URL verknüpft ist, und wenn ja, dann liefert WordPress diese Seite/Post aus. Ähnlich natürlich auch mit entsprechenden Kategorie- oder Schlagwort-Seiten.

Wenn aber WordPress nun nichts findet, was es für diese URL ausliefern soll, dann ruft es (sofern vorhanden) eine spezielle Datei im aktiven Theme auf: die 404.php (und gibt im Header, automatisch und korrekt, den HTTP-Statuscode „404 Not Found“ aus. Das ist ein Code, der insbesondere für Suchmaschinen, bzw. deren Bots/Crawler, ein untrügliches Anzeichen dafür ist, dass sie diese URL und den Inhalt, der jetzt kommt, nicht in ihren Index aufnehmen brauchen/sollen, da ja diese URL gar nicht (mehr) existiert. Soweit so gut. Aber wir wollen ja dem Besucher der irgendwie auf diese falsche nicht existierende URL gekommen ist, sei es, dass er sich vertippt hat, oder auf einen Link geklickt hat, der entweder alt ist und noch auf eine URL zeigt, die es inzwischen nicht mehr gibt, oder der Link-gebende hat sich seinerseits einfach vertippt, auch eine schöne zur restlichen Website und ihrem Theme passenden Seite präsentieren, die ihn freundlich oder u.U. auch mit Humor darauf hinweist, dass diese URL nicht existiert. Und genau dafür ist die 404.php da.

WordPress selbst schägt dazu vor (und so kann man es hundertfach im Web wiederfinden) die 404-Seite einfach mit statischem oder auch dynamischem Inhalt auszuliefern. Also in etwa folgendermaßen:

<?php get_header(); ?>
<h2>404 Nicht gefunden</h2>

Diese URL existiert leider nicht, bitte Suche benutzen...

<?php get_search_form(); ?>
<h3>Die letzten 3 Posts</h3>

<?php get_latest_posts(3); ?>

<?php get_sidebar(); ?>
<?php get_footer(); ?>

Aber wie kriege ich WordPress jetzt dazu eine von mir als ganz normale Seite angelegte Seite als 404-Nachricht auszugeben?

Nun, wie gesagt, ich habe Themes gesehen, die das versuchen. Z.B. so:

<?php
/* Template Name: 404 Page Not Found */
header("location:" . get_permalink(ot_get_option("ic_404_page")) );
?>

Für den Benutzer hat das auch wunderbar geklappt. D.h. der Benutzer hat genau diese extra angelegte 404-Seite angezeigt bekommen. Aber leider haben die Suchmaschinen-Bots und -Crawler keinen „404 Not Found“ Code mehr erhalten, sondern einen „302 Found“ und wurden zu der 404-Seite weitergeleitet, die wiederum einen sauberen „200“ er Code zurückgeliefert hat. Somit haben die Suchmaschinen kein Information darüber erhalten, dass diese URL gar nicht existiert, sondern nur die Information, dass der Inhalt dieser Seite derzeit unter einer anderen URL, nämlich der der 404-Seite zu finden ist. Was aber ja gar nicht in unserem Interesse ist.

Die Lösung ist nun die, dass man den Inhalt der  page.php Datei des Themes in die 404.php Datei kopiert. Hmm, soweit so gut, aber den Inhalt der 404-Seite sehe ich damit aber nicht, denn jetzt müssen wir WordPress ja noch sagen von welcher Seite der Inhalt denn hier angezeigt werden soll. Da ja die URL nicht existiert ist es WordPress natürlich auch nicht möglich herauszufinden von welcher Seite jetzt der Inhalt genommen werden soll. Da WordPress jetzt aber auch so aufgebaut ist, dass es die ID der Seite nicht ständig irgendwo als erreichbare/veränderbare Variable herumschleppt, sondern das Anzeigen von Inhalten in einer „magischen“ Loop vornimmt – Bei WordPress spricht man hier immer wieder von „THE LOOP“ – müssen wir einen Weg finden diese Loop zu manipulieren, oder, wie in dieser Lösung hier, zu ersetzen.

Dazu müssen wir erst einmal die Loop in dem, aus der page.php Datei kopierten php-Code finden. Das ist aber meist gar nicht so schwierig. „THE LOOP“ hat in der Regel ein Aussehen, dass u.U. in der page.php auch etwas anders aussehen kann.

Hier erst einmal das Standard-Aussehen der Loop:


while ( have_posts() ) : the_post();

oder auch:


if ( have_posts()) : while ( have_posts() ) : the_post();

oft aber eben auch – besonders, wenn man weiß, dass man eh nur genau einen Beitrag/eine Seite anzeigen will:


if ( have_posts()) : the_post();

Nun, genau diesen Code müssen wir nun durch unsere eigene Loop ersetzen. Dazu müssen wir erst einmal unsere eigene Loop erstellen. Und der geben wir dann eleganterweise gleich mit, welche Seite diese Loop enthalten soll:

$the404loop = new WP_Query('page_id='.ot_get_option("ic_404_page"));

In diesem Beispiel existiert vom Theme die Möglichkeit eine Seite als 404-Seite über die Theme-Options zu definieren, und mit dem Theme-eigenen Funktionsaufruf

ot_get_option("ic_404_page")

wird die ID dieser Seite abgefragt.

Jetzt müssen wir nur noch die original-Loop durch unsere eigene ersetzen, z.B.:

// if ( have_posts()) : the_post();
if($the404loop->have_posts()) : $the404page->the_post();

wobei wir in dem obigen Beispiel die original Loop nicht gelöscht oder überschrieben haben, sondern nur auskommentiert haben. So wissen wir immer, was hier mal im Original gestanden hat.

Allerdings kann das Theme auch noch an anderen Stellen auf die ID der eigentlichen Seite zurückgreifen wollen, z.b. durch die Verwendung der Funktion

the_ID();

Diese Stellen müssen wir dann auch noch durch die ID unserer 404-Seite ersetzen. Entweder statisch, wenn das Theme gar keine Möglichkeit vorsieht eine normale Seite als 404-Seite zu definieren, oder wie in dem Beispiel durch einen Funktionsaufruf, der die ID aus den Options abfragt.

Jetzt gibt WordPress unsere Seite aus und liefert trotzdem an die Suchmaschinen Bots den richtigen HTTP-Code „404 Not Found“ aus.

This post is also available in: Englisch

Schreibe einen Kommentar