Für Menschen · Seien Sie begeistert und Sie werden begeistern !
WordPress sorgt dafür, wenn aktiviert, dass „schöne“ lesbare URLs genutzt werden. Lediglich die Suche ist davon bisher nicht betroffen; sie kommt mit der bekannten Syntax ?s im Standard aus. Aber auch hier kann man ansetzen und die URL seinen Bedürfnissen entsprechend anpassen.
Das folgenden Beispiel soll es verdeutlichen. Im Standard von WordPress, trotz aktiver Permalinks, sieht die URL zu den beiden Suchbegriffen wordpress und beratung wie folgt aus: bueltge.de/?s=wordpress+beratung&submit=Search. Mit Hilfe einer kleinen Funktion, die den Redirect anspricht, kann die URL angepasst werden. In meinem Fall, mit der zugehörigen nachfolgenden Funktion sieht die URL zu diesen beiden Suchbegriffen dann wie folgt aus: bueltge.de/search/wordpress+beratung.
Die Funktion, die ich einsetze, seht im folgenden Abschnitt. Innerhalb der WP-Funktion wp_redirct lege ich die Ausgabe fest, in dem ich den Begriff search zur home-url der Installation addiere und im Anschluss die Suchbegriffe ergänze. Dies kann man beliebig gestallten und je nach Anforderung so dass beste Ergebnis erziehlen.
function fb_change_search_url_rewrite() {
if ( is_search() && ! empty( $_GET['s'] ) ) {
wp_redirect( home_url( "/search/" ) . urlencode( get_query_var( 's' ) ) );
exit();
}
}
add_action( 'template_redirect', 'fb_change_search_url_rewrite' );
Die Funktion legt man im besten Falle in einem Plugin ab oder alternativ in der functions.php des Themes. Schöne und verbesserte Lösungen sind wie immer willkommen und das Kommentarfeld steht dazu bereit.
Update
Aus den Kommentaren und Diskussionen ist ebenso eine Lösung entstanden, die explizit eine Lösung via Hook anspricht und so eine frei Benennung ohne Probleme zulässt; nicht desto trotz sollte man sich die Lösung via .htaccess überlegen.
function custom_search_url( $search_rewrite ) {
if( ! is_array( $search_rewrite ) )
return $search_rewrite;
$new_array = array();
foreach( $search_rewrite as $pattern => $s_query_string ) {
$new_array[ str_replace( 'search/', 'my-search-url/', $pattern ) ] = $s_query_string;
}
$search_rewrite = $new_array;
unset( $new_array );
return $search_rewrite;
}
add_filter( 'search_rewrite_rules', 'custom_search_url' );
bueltge.de [by:ltge.de] wird von Frank Bültge geführt, administriert und gestaltet. Alle Inhalte sind persönlich von mir ausgewählt und erstellt, nach bestem Gewissen und Können, was die Möglichkeit von Fehlern nicht ausschließt.
Das Weblog wird angetrieben von WordPress und aktuell gibt es 980 Beiträge, 18722 Kommentare in 14 Kategorien und 464 Tags.
Das Blog wird liebevoll mit xHTML & CSS in Handarbeit gestaltet. Erstellt mit ♥ zum Befüllen und Erhalten.
Design und Code ist unter Copyright
© 2001 - 2012 bueltge.de [by:ltge.de]
29. August 2011 um 11:47
Ich habe seit Jahren das in der .htaccess stehen
# Suche /s=xyz auf /search/xyz umleitenRewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^s=(.+)$
RewriteRule .* /search/%1/? [R,L]
Dürfte etwas schneller sein, weil nicht WordPress für die Weiterleitung bemüht werden muß.
29. August 2011 um 12:00
Ob das eine gute Idee ist? Ich würde mir das 2 mal überlegen.
1. Wenn man die Suche nirgendwo verlinkt, ist es egal. Suchmaschinen füllen (noch) keine Formulare aus und Google hat in den Webmaster Richtlinien auch so einen Abschnitt: "Google möchte keine Suchergebnisseiten crawlen".
2. Wenn man verlinkt, verstößt man gegen die Richtlinie und erzeugt im schlimmsten Fall auch noch Duplicate Content ohne Ende. Daher müsste man /search/ in die robots.txt aufnehmen und damit ist wenigstens der SEO Effekt weg.
Damit bleibt die Frage, warum ich das machen sollte?
29. August 2011 um 14:19
@Michael: klar, solltest du die robots.txt anpassen; aber lesbare URLs sind nicht nur für Maschinen interessant, sondern ebenso für Menschen.
@Schnurpsel; korrekt, geht ebenso und ist sicher schneller; wobei auch die htaccess jedes mal gelesen wird und jede Zeile mehr Zeit verursacht; die Funktion soll auch nur als Bsp. dienen; der Hook und die kleine Lösung stellen auch dar, was man mit dem redirect so anstellen kann und dass man ihn in WP super abfassen kann.
29. August 2011 um 14:40
@Michael
Doch, Google hat mal vor einiger Zeit eben genau das Suchformular ausgefüllt. Es gab dazu eine längere Diskussion im WPD-Forum:
http://forum.wordpress-deutschland.org/netzwelten/29740-googlebot-erstellt-selbst-suchanfragen.html29. August 2011 um 22:40
Sorry, ich als Noob sehe da keinen großen Unterschied in den URL´s. Es sind doch die wichtigen Keys in beiden enthalten. Warum also solche Umstände machen?
30. August 2011 um 04:57
Ich bezweifele den Sinn allerdings auch ein wenig. Wenn der Nutzer einen Begriff in das Suchfeld eingegeben hat, dürfte ihn die URL nicht mehr so wahnsinnig interessieren. Und von Hand wird kaum jemand eine Suche in die Adresszeile eingeben.
Interessanter fände ich da die Idee die Suchbegriffe im Cookie zu speichern und bei einem Aufruf der Suche dem Besucher anzuzeigen nach welchen Begriffen er bereits gesucht hatte.
Um es dann wirklich komfortabel zu machen, könnte man bei einer Suche neben dem Artikel einen Link einblenden mit dem der Besucher den Artikel quasi als passend/unpassend markieren kann. Speichert man dies auch noch im Cookie, kann bei einer erneuten Suche gleich angezeigt werden welche Artikel bei der letzten Suche zu dem Suchbegriffen markiert wurden.
Zumindest mir ergeht es häufiger so das ich etwas suche und dann zu den Suchbegriffen etliche Treffer angezeigt bekomme. Suche ich erneut nach den gleichen Begriffen, darf ich mich wieder durch die komplette Ergebnisliste wühlen um den passenden Artikel zu finden.
30. August 2011 um 12:39
Hm, ich glaube, ich verstehe auch nicht ganz, warum du die Such-URLs so anpassen willst - der Standard mag nicht ganz so flüssig sein, aber es ist klar erkennbar, was was in der URL ist, ergo lesbar für Menschen.
Vielleicht kannst du näher erläutern, warum du das für sinnvoll empfindest? Eventuell überseh ich ja auch einfach was oder steh auf der Leitung.
30. August 2011 um 15:38
Danke! Kann man den Begriff "search" auch in suche ändern?
30. August 2011 um 19:42
@I. Wengel: klar; schreib rein, was du magst; ist nur die Adresse nach dem Rewrite
30. August 2011 um 19:46
@Ralf, @Jonas: doch, ich kenne Ansätze, wo man die URL nutzt um das Suchergebnis zu erziehlen und da kommt der Ansatz her. So kann es sein, dass wenn du von anderen System auf WP via Suche zugreifst, dass die URL schlüssig sein soll und einfach oder/und nicht direkt mit dem Standard-Syntax von WP zu erkennen. Die Funktion hier stellt nur da, was man simple realisieren kann; quasi wie so oft bei mir hier im Blog ein Grundgerüst mit dem man eigene Lösungen erstellt und eine Grundidee hat. Aber man glaubt nicht, was Kunden wollen; daher sollte man nicht aus eigenem Ansatz ran gehen, sondern die Lösung werten und prüfen, ob es für die eigene Person wertvoll ist.
30. August 2011 um 21:04
@I. Wengel und Frank:
Nein, geht nicht so einfach. search ist in WordPress als Basis für die Suchpermalinks festgelegt. WordPress erkennt sonst nicht, dass es eine Suche ist.
Um suche zu benutzen muss
$wp_rewrite->search_baseebenfalls geändert werden.Habe da letztens einen Schnipsel veröffentlicht, ansatt
pagination_baseeinfachsearch_baseeinsetzen.31. August 2011 um 12:52
@Dominik: danke dir, sehr schöne Ergänzung und Korrektur!
1. September 2011 um 00:43
@Frank:
Wäre da nicht eine rewrite rule (WP oder htaccess) besser geeignet? Die Beschreibung zu "template_redirect" lautet ja "Loads the correct template based on the visitor's url".
Deine Lösung ist in sofern nicht ganz propper, als das die Datei template-loader.php (enthält den Hook template_redirect) die Abfrage "is_search()" benutzt. is_search bastelt sich aus der URL die Antwort auf die Frage ob es eine Suche ist oder nicht. An dem Punkt könnte es durchaus mal kritisch werden sofern ein anderes Plugin anhand der neuen URL versucht festzustellen ob es sich um eine Such-Seite handelt oder nicht.
Alternative müsstest du noch den Hook "parse_query" ansprechen und das Synonym für "s" ergänzen.
$searchsynonym = 'suche';
add_action('parse_query', 'fb_fb_change_search_url_parse_query');
function fb_fb_change_search_url_parse_query ( $query ){
global $wp_query;
if( ! empty( $query->query_vars[$searchsynonym] ) )
$wp_query->is_search = true;
}
1. September 2011 um 12:53
@Ralf: es def. ebenso eine spannende Lösung; bin mir aktuell nicht sicher, ob es besser oder nur anders ist. is_search() ist doch auch nur eine Funktion für $wp_query->is_search, inhaltlich gleich. Die Suche sollte man wohl eher über is_search abfangen, als die URL auszuwerten, aber sicher gibt es dann auch dafür wieder Gründe und nicht alles ist bedacht; wie so oft die untersch. Ideen der Kunden aufzeigen und man nach einer Beratung oft einsehen muss, dass es gebraucht wird.
Sehr schön finde ich, dass hier eine kleine Diskussion entstanden ist. Dominik und Ralf sind auch sonst in meinem Fokus, aber nicht tagtäglich, wie einige anderen Kollegen. Endlich mal wieder Leben in den Kommentaren abseits von Support und Spam
@Ralf @Dominik: wann macht ihr endlich Vollzeit bei uns mit?
1. September 2011 um 14:06
Schau mal in query.php Zeile 1470.
if ( !empty($qv['s']) ) { $this->is_search = true; }.$qist ein Array welches die Query Vars (also quasi die $_POST & $_GET-Variablen) enthält.Der Hook template_redirect eignet sich eher dazu die Suche z.B. auf Google umzuleiten. Mit diesem Hook kann man WP davon abhalten die Standard-Templates zu laden.
1. September 2011 um 16:26
Für die einfache Usability bzw User experience sehe ich jetzt auch nicht so den Vorteil der verbesserten Such URL. Ich hab aber vor ein kleines Longtail experiment zu starten, bei dem eben genau diese WP Suchseiten von Google indexiert werden sollen, auch wenn Serps in Serps wie erwähnt nicht im Sinne von Google sind..
5. September 2011 um 10:38
Auf WordPress.com-Blogs ist diese Such-URL übrigens auch standardmäßig eingerichtet. Da hier einige nach dem Sinn fragten: Auf WP.com kann man hinter das /search/[Suchbegriffe(e)] auch noch ein /feed/ setzen und sich so seinen eigenen Suchfeed erstellen. Praktisch wenn man nur ganz spezifische Artikel aus einem Blog lesen möchte.
@Frank: Wie müsste man den Code denn erweitern, um das auch umzusetzen?
5. September 2011 um 16:26
@Torsten: dies macht WordPress im Standard schon, so reicht eben bei aktiven Permalinks das Anhängen von feed um aus dem Suchergebnis einen Feed zu erstellen und sich informieren zu lassen, zum obigen Beispiel wäre das diese Feed-Adresse:
bueltge.de/search/wordpress+beratung/feedErgänzen kann man dies noch mit schlüsseln wie rss oder atom um spezielle Formate zu erstellen.bueltge.de/search/wordpress+beratung/feed/atom/1. Oktober 2011 um 16:18
Die Lösung von @Schnurpsel ist schnell und sauber. Feine Sache ... und Google freut sich über SERPS mit "sprechenden" URLs. Mal schauen ob die indiziert werden.