WordPress: Die bessere Suchfunktion

20. November 2007 Kategorie: WordPress Stichworte: ,

Interne Suchfunktion verbessern: WordPress liefert eine eigene Suchfunktion mit, welche allerdings einige Wünsche offen lässt. Im folgenden erkläre ich, wie man Die Anzahl der Suchttreffer ausgibt, Suchergebnisse durchnummeriert, den Suchbegriff zur Überprüfung nochmals anzeigt, die Suchausgabe als Anzahl beliebig einstellt und auf sämtliche Inhalte der Seite erweitert. Zusätzlich gebe ich Hinweise, wie man sogar die Suche als Funktion” verbessern kann, wenn keine Treffer erzielt wurden. Die Anleitung wird Schritt für Schritt aufgebaut, so das am Ende eine vollends zufriedenstellende Suche für Deine Seite ensteht.

1. Schritt: – Vorbereitungen -

Du benötigst mind. eine WordPress in Version 2.3. beta oder höher! Sichere Deine alte search.php im theme Ordner als search2.php. Öffne nun wieder die search.php, lösche alle Zeilen und füge folgenden Code ein:

< ?php get_header(); ?>
 
      < ?php previous_posts_link('&lt;&lt; Seite') ?>
      < ?php next_posts_link('Seite &gt;&gt;') ?>
 
  < ?php if (have_posts()) : ?>
 
      < ?php while (have_posts()) : the_post(); ?>
 
      <li id="post-<?php the_ID(); ?>">
      <div class="post">
      <h3><a href="<?php the_permalink() ?>" rel="bookmark" title="Link zu: < ?php the_title(); ?>">< ?php the_title(); ?></a></h3>
      <table width="100%">
      <tr>
      <td>
      < ?php the_time('j. F Y') ?>
      </td>
      </tr>
      <tr>
      <td>
      < ?php the_excerpt(); ?>< ?php the_tags('<strong> Stichworte: ',' &gt; '); ?>
      </td>
      </tr>
      <tr>
      <td>
      <small> ein Artikel aus der Kategorie: < ?php the_category(', ') ?></small>
      <small>< ?php comments_popup_link('bisweilen noch keine Kommentare', '#1 Kommentar dazu', '#% Kommentare dazu'); ?></small>
      </td></tr></table>
      </div>
      </li>
 
     	< ?php endwhile; ?>
 
	< ?php else : ?>
 
   <h3>Leider keine Ergebnisse gefunden.</h3>
   <p>Versuche es erneut oder nutze die Stichwortvorschl&auml;ge.</p>
   < ?php include (TEMPLATEPATH . '/searchform.php'); ?>
   <p>
     Tags*: </p>
     <ul>
     < ?php wp_tag_cloud('smallest=10&largest=18&unit=pt&number=150&format=flat&orderby=name&order=ASC&exclude=&include='); ?>
     </ul>
     <p>
     * Schriftgr&ouml;sse, ist Index f&uuml;r H&auml;ufigkeit
     </p>
    < ?php endif; ?>
 
    < ?php get_sidebar(); ?>
 
< ?php get_footer(); ?>

Hinweise:

Diese Datei enstpricht jetzt der hauseigenen WordPress-Suchfunktion. Ergebnisse werden seitenweise mit Blätterfunktion ausgegeben, mit Kurzform zu jedem Beitrag und ein paar relevanten Metadaten (erweiterbar). NEU ist jedoch das Verhalten bei missglückter Suche! Falls keine Übereinstimmungen gefunden werden, gibt das System eine entsprechende Meldung inkl. neuem Suchfeld. Gleichzeitig wird eine Stichwortwolke (tagcloud) geliefert, die dem Suchenden eine gewisse Hilfestellung bietet und nicht gleich vergrault! Man weiß ja nie, evtl. findet er ja etwas über eines der “tag”-Archive.

2. Schritt: Suchtrefferanzahl und Suchbegriff anzeigen -

Ersetze

< ?php if (have_posts()) : ?>

durch

< ?php if (have_posts()) : ?>
<br />
      Du hast nach <b>'< ?php echo the_search_query(); ?>'</b> gesucht und  <b>< ?php echo $wp_query->found_posts; ?> Treffer</b> gelandet.

Warum das Ganze? Hin und wieder vertippt man sich bei der Eingabe im Suchfeld und merkt es nicht beim Abschicken. Falls bei inkorrekter Schreibweise keine Treffer erzielt werden, weiß der Nutzer sofort woran es gelegen hat und kann erneut anfragen. Die Trefferanzahl ist in diesem Zusammenhang ebenso wichtig. Habe ich 3 oder 83 Übereinstimmungen? Muss ich also meine Suche begrifflich eingrenzen oder evtl. erweitern?

3. Schritt – Nummerierung der Suchtreffer auf allen Seiten weiterführen -

WordPress interne Suche nummeriert jede weitere Seite mit Treffern immer wieder von 1 bis XX durch. Das ist unübesichtlich. Besser: man weiß, wo man sich gerade umschaut. Hinweis: Wer lieber alle Suchtreffer auf einer einzigen Seite OHNE Nummerierungen haben möchte, kann gleich zu Schritt 4 übergehen.

Ersetze jetzt

< ?php get_header(); ?>
 
      < ?php previous_posts_link('&lt;&lt; Seite') ?>
      < ?php next_posts_link('Seite &gt;&gt;') ?>

durch

< ?php get_header(); ?>
 
      < ?php previous_posts_link('&lt;&lt; Seite') ?>
      < ?php next_posts_link('Seite &gt;&gt;') ?>
 
      < ?php
    if( isset($paged) && ( intval($paged) > 1 ) ) {
        echo '<ol start="' . ( ($paged - 1) * $posts_per_page + 1 ) . '">';
    } else {
        echo '</ol><ol>';
    } ?>
</ol>

Die Nummerierungen laufen jetzt kontinuierlich über alle Seiten hinweg.

4. Schritt – alle Suchergebnisse auf einer Seite darstellen -

In Schritt 3 zählst Du die Suchtreffer seitenübergreifend durch. In der nächsten Variante werden alle Suchtreffer auf nur einer Seite abgebildet, die man dann gemütlich abscrollen bzw. durchforsten kann. Lästige page-reloads entfallen. Das Problem: WordPress gibt die Anzahl der Beitragsausgabe indirekt für alle Bereiche wie Archive, Kategorien, Tags etc. vor. Die Suchausgabe ist also abhängig von der eingestellten Beitragssumme, welche man unter “Lesen” im Adminbereich eintragen kann. Zur Umgehung dieser Blockade habe ich eine neue Funktion geschrieben:

Öffne Deine functions.php aus Deinem theme Ordner und füge folgenden Code ein:

// searchpostmax von Daniel Jäger, Berlin, 11/2007, www.danieljaeger.de
 
// wordpress > 2.3
 
function searchmaxposts($query_string) {
 
global $posts_per;
 
       $query = new WP_Query();
       $query->parse_query($query_string);
 
        if ($query->is_search) {
 
                $num = 20;
 
        }
 
        if (isset($num)) {
 
                if (preg_match("/posts_per_page=/", $query_string)) {
 
                        $query_string = preg_replace("/posts_per_page=[0-9]*/", "posts_per_page=$num", $query_string);
 
                } else {
 
                        if ($query_string != '') {
 
                                $query_string .= '&';
 
                        }
 
                $query_string .= "posts_per_page=$num";
 
                }
        }
 
return $query_string;
 
}
add_filter('query_string', 'searchmaxposts');

Hinweis: Wieviele Suchtreffer sollen ausgegeben werden? Das ist Dir überlassen, denn Du kannst den Wert (hier 20) im Term

$num = 20;

anpassen, wie Du gerne möchtest. Ich persönlich habe hier einen sehr großen Wert eingetragen, da ich so auf alle Fälle nur eine Seite Suchausgabe heraufbeschwöre.

Abspeichern. Beachte, dass sich die Funktion innerhalb der globalen php-Klammern befindet! Wechsle nun wieder in Deine neue search.php und

füge ÜBER

< ?php if (have_posts()) : ?>

diese Zeile ein

< ?php if(function_exists(searchmaxposts)) { searchmaxposts(search); } ?>

Die Suchausgabe wird ab sofort über die neue Funktion angesteuert und verhält sich nach Euren Werten & Normen :-) In Verbindung mit Schritt 3 funktioniert das natürlich auch :-)

5. Schritt – Suche auf alle Inhalte der Seite erweitern -

WordPress durchsucht ab Werk AUSSCHLIEßLICH die geschriebenen posts. Was ist aber mit statischen Seiten? Kommentaren? Stichworten? Angehängten Dateien? Dazu lege ich Euch das kleine plugin search everything ans Programmiererherz. Auspacken, in plugin-Ordner hochladen, aktivieren, fertig. Im Adminbereich unter “Einstellungen” bzw. “options” kann man dann festlegen, was demnächst alles in die Suche mit einbezogen werden soll. Tolle Sache! So bleibt nichts unbeachtet.

6. Schritt – Abschluß -

Die neue search.php muss jetzt nur noch abgespeichert und hochgeladen werden. Was haben wir erreicht? Eine sinnvolle, nutzerfreundliche und umfassende Suchfunktion, die weit über die Standardversion hinausgeht.

Zusatz: Wie man u.a. das Suchfeld widgetunabhängig platziert, habe ich hier beschrieben.

Fragen? Probleme? Alles prima?

Schreibe Deinen Kommentar




Spam?
gängiges XHTML erlaubt, max. 2 Links

5 Kommentare:

  • Hallo Chris,

    kann es sein, dass Du die Leerzeichen zwischen dem “<” und dem “?php” nicht weggelöscht hast? Die werden beim copy-paste in meinen Code-Zeilen mitunter einfach reingesetzt, obwohl das nicht stimmt. Ansonsten schicke mir mal Deine functions.php UND search.php – ich schau mal drüber, ok? Ist ne Sache von Minuten. LG

  • Chris

    Hi Daniel,
    hab alles exakt so gemacht wie beschrieben.

    Was mache ich falsch?
    Das hier ist das Ergebnis:
    < ?php previous_posts_link(’< >’) ?> 1 ) ) { echo ‘

    ‘; } else { echo ‘

    ‘; } ?>

    # Du hast nach ” gesucht und found_posts; ?> Treffer gelandet.

    ‘); ?>
    ein Artikel aus der Kategorie:

    Leider keine Ergebnisse gefunden.

    Versuche es erneut oder nutze die Stichwortvorschläge.

    Tags*:

    * Schriftgrösse, ist Index für Häufigkeit

  • Ganz oben steht ein < ?php und ganz weit unten ein ?> als Wrap sozusagen -> dort dazwischen muss Schritt 4 hinein, also wo auch die anderen functions stehen. Die Reihenfolge der Funktionen ist beliebig, da sie eh alle auf einen Schlag geparsed werden.

    LG!

  • Chris

    Zu Schritt 4:
    Meine functions.php ist groß. Wo genau soll ich den code aus Schritt 4 einfügen?

  • Eike

    Danke für die Tipps!
    Ich habe nur Schritt 4 bei mir eingefügt, da ich genau diese Funktion gesucht habe, alles auf einer Seite anzeigen.

Ein Pingback