Dynamische 404er Seiten

Gestern habe ich von meiner neuen 404er-Fehlerseite berichtet. Heute gibt es eine ausführliche Anleitung zu dem “Vorschläge”-Prinzip. Doch zunächst noch einmal, was geleistet werden soll:

Was soll geleistet werden?

Falls ein Nutzer die Adresse einer bestimmten Seite falsch in Erinnerung hat, sollen beim Erscheinen der Fehlerseiten mögliche Kandidaten als Vorschläge erscheinen. Diese sollen einen Hyperlink herausgeben zum gewünschten Artikel oder Seite. Die Datenbank soll dabei durchsucht werden. Das zur Suche verwendete Stichwort ist im Falle einer Trennung mit Backslash (“/”) das zuletzt verwendete Wort, bei einer Trennung mit Punkt (z.B. bei einer Dateiangabe wie .html oder .jpg) das Wort vor dem Punkt.

Die Umsetzung

Im folgenden Teil wird zunächst die aktuelle Adresse ausgelesen. Dann wird sie in ein Array gepackt welches nach “/” abgetrennt wird. Es wird das letzte Wort ermittelt nach einem Backslash. Falls kein Wort mehr dort steht wird das Wort davor weiterverarbeitet.
Dann kommt eine Untersuchung auf Datei-Endungen. Es wird wieder das Wort getrennt, bei einem Punkt. Das Wort vor dem Punkt ist ausschlaggebend und wird als Suchwort benutzt. In dem Array $liste2 befindet sich das Suchwort an “Platz” Null.

<code>
<?php $string = $_SERVER['REQUEST_URI'];
		$liste = explode("/",$string);
		$count = (count($liste)-1);
		if ($liste[$count] == "") {$string2 = $liste[($count-1)];} else {$string2 = $liste[$count];}
		$liste2 = explode(".",$string2);
		// Bis hierin wird der letzte Begriff ausgewählt, welcher in der Adresszeile steht, da dieser höchst wahrscheinlich sinnvoll ist.
</code>

Nun geht es weiter mit der Suchanfrage auf die Datenbank. Es wird dabei im Titel und in einem “Post” selbst nach dem Begriff gesucht. Es muss sich um eine Seite oder ein Artikel handeln und darf kein Entwurf sein. Letztlich wird ein Link in einer ungeordneten List ausgegeben. Falls keine Ergebnisse gefunden wurden, erscheint eine Mitteilung.

<code>
//Nun soll die Suche gestartet werden!
$abfrage = "SELECT * FROM $wpdb->posts WHERE (post_content LIKE '%".addslashes(strip_tags($liste2[0]))."%' OR post_title LIKE '%".addslashes(strip_tags($liste2[0]))."%') AND (post_type = 'page' OR post_type = 'post') AND NOT(post_status = 'draft') GROUP BY post_title ASC";
$posts = $wpdb->get_results($abfrage);?>
<?php if (!empty($posts)) { ?>
<p><em>Hier könnte was passendes dabei sein:</em></p>
<ul>
	<?php foreach($posts as $the_post) { ?>
  	<?php $post = get_postdata($the_post->ID); ?>
	<li>
	<a href="<?php echo get_permalink($post['ID']); ?>" title="<?php echo $post['Title']; ?>">
	<?php echo $post['Title']; ?></a>
      	</li> <?php } ?>
</ul>

		<?php } else { ?>
		<p><em>Leider konnten keine möglichen Ergebnisse angezeigt werden! Benutze bitte die Suche und achte auf die Rechtschreibung!</em></p>
		<?php } ?>

</code>

Bei der Suchanfrage ist dem ein oder anderen vielleicht aufgefallen, dass es nicht die übliche Anfrage ist. Diese Version lässt es offen welches Präfix man für seine Tabellen benutzt. Bei der herkömmlichen Methode muss man das mitangeben. Somit ist diese Version unabhängig von der WP-Installation. Diese Art der Abfrage habe ich auf i-jeriko gefunden als ich nach einer Möglichkeit gesucht habe die letzten WordPress-Kommentare anzuzeigen.

Was gibt es noch zu bemängeln?

Ja – Es ist nicht perfekt! Vieles bleibt bei dieser Art unberücksichtigt. Zum einen muss der Nutzer bereitwillig die vollständige Adresse eintippen (die jedoch nicht existiert). Er darf dabei keine Rechtschreibfehler machen (sofern ich nicht selbst welche dabei habe). Dies wird in den wenigsten Fällen der Fall sein, da wenn man sich schon eine Adresse merkt, dann wird man sie höchstens falsch schreiben. Zudem wird es bei WP-Blogs dann schwierig, wenn sowieso keine sprechenden URLs verwendet werden.
Keine sinnvollen Ergebnisse erhält man bei einer Angabe wie “/die/”, da dies letztlich wohl alle Beiträge anzeigt. Die Sortierung ist auch nicht gerade ausgefeilt. Es wird nicht nach Priorität ausgegeben sondern alphabetisch. Somit könnte ein wesentlich besserer Artikel weiter unten stehen und ein unpassender ganz vorne. Jedoch ist es schwierig dies umzusetzen. Man könnte gegebenenfalls die Häufigkeit der Suchwörter als Merkmal benutzen, ob aber dies wirklich viel effektiver ist, bezweifle ich noch.

Weitere Tipps, Kritik und Ideen werden gern angenommen.

Kommentieren