WP_Query mit Suchbegriff

  • Hallo Zusammen,

    ich möchte mittels WP_Query die Suchergebnisse (bzw. eigentlich die Anzahl der Suchergebnisse) für eine bestimmte Kategorie auslesen aber irgendwie klappt das nicht.

    Folgenden Code habe ich in meiner search.php derzeit im Einsatz:

    Damit sollen für den aktuellen Suchstring ($s) alle Suchergebnisse bzw. Titel innerhalb der definierten Kategorie mit der ID 1 angezeigt werden.

    Allerdings wird leider nichts angezeigt. Es scheint also, ob er für die Abfrage nichts findet, wobei der verwendete Suchstring definitiv in einigen Posts aus der Kategorie vorhanden ist.

    Vielleicht hat jemand einen Tipp für mich.

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • Auszug aus: http://codex.wordpress.org/Class_Reference/WP_Query

    Zitat

    [COLOR=#ff0000]posts_per_page (int) - number of post to show per page (available with [/COLOR][COLOR=#ff0000]Version 2.1[/COLOR][COLOR=#ff0000], replaced showposts parameter). Use 'posts_per_page'=>-1 to show all posts.[/COLOR] Set the 'paged' parameter if pagination is off after using this parameter. Note: if the query is in a feed, wordpress overwrites this parameter with the stored 'posts_per_rss' option. To reimpose the limit, try using the 'post_limits' filter, or filter 'pre_option_posts_per_rss' and return -1

  • Danke für den Tipp.

    Ich habe den showpost-Parameter durch posts_per_page ersetzt, allerdings findet er leider immer noch nichts. Die Abfrage scheint irgendwie immer leer zu sein.

    Auch wenn ich dem Such-Parameter einen festen Wert zuweise, der auch in Posts der jeweiligen Kategorie vorkommt, findet er nichts.

  • Das wäre ein Ansatz, den Du nachgehen könntest.

    Ich habe jetzt nur einmal einige Zeilen in der search.php für einen kleinen Test geändert, somit ein anderer Ansatz, wobei sich das dann aber nur auf die ausgegebenen Suchergebnisse bezieht:

    Von:

    PHP
    <?php if ( have_posts() ) : ?>
    
    
        <header class="page-header">
            <h1 class="page-title"><?php printf( __( '...
        </header>

    In:

    Und erhalte als Ausgabe:

    5 Suchergebnisse für: Suchwort

  • Also, die Anzahl der bzw. aller Suchergebnisse an sich habe ich soweit schon integrieren können und das funktioniert auch.

    Mir geht es jetzt darum, herauszufinden wie die Anzahl der Suchergebnisse für einzelne Kategorien ist. Deshalb wollte ich eben über WP_Query für meine drei fixen Kategorien die Anzahl der Suchergebnisse für den aktuellen Suchstring ermitteln.

    Aber mein Query scheint nie irgendwelche Ergebnisse zu enthalten.

    Das möchte ich letztlich erreichen:

    ---

    Insgesamt wurden 5 Ergebnisse zu dem Begriff XYZ gefunden

    Alle (5) | Kategorie 1 (2) | Kategorie 2 (3) | Kategorie 3 (0)[INDENT=2]|
    |-> und dort wird verlinkt auf die Suchergebnisse nur für diese Kategorie[/INDENT]

    ---

    Da ich mir jetzt nicht anders zu helfen wußte, war der Gedanke, dass ich eben für jede der 3 vorhandenen Kategorien (es wird auch nicht mehr geben) mittels WP_Query sowie der Parameter Suchstring ($s)und Kategorie-ID (cat) ermittle, wie hoch die Anzahl der Suchergebnisse für die jeweilige Kategorie denn ist.

    Das war der Ansatz dazu, der allerdings nie irgendwelche Ergebnisse liefert:

    Vielleicht hat jemand auch einen ganz anderen Ansatz, der mir weiterhelfen könnte.

  • Ich verstehe Dich schon, nur bin ich mir nicht einmal sicher, ob Du dafür ein neues Objekt new WP_Query() erzeugen musst oder einfach nur mit $query auf alle $query->query_vars zugreifen kannst. Beim Filtern der Sucheingaben habe ich das zumindest so gehandhabt. Nur dabei betraf es ja erst einmal nur s und mit s hat die search.php was zu tun? Die gibt doch wohl die Ergebnisse nur noch aus. Die Anfragen werden hingegen an / gesendet. Um s abzugreifen, gehört nach meiner Meinung die Funktion dafür in die functions.php.

    Deshalb würde ich das jetzt hier nur als mögliche Ansätze verstehen. Wobei s in einem neuen Ojekt nicht mehr das enthalten kann, was mit s an / gesendet wurde. Oder befinde ich mich jetzt auf einem Holzweg?

    Einmal editiert, zuletzt von Melewo (4. Oktober 2013 um 14:01)

  • Falls Du kein neues Objekt instanziierst, sondern auf das vorhandene mit $wp_query zugreifst, dann erhältst Du bereits etwas. Hier einmal mit

    Code
    $wp_query->found_posts;
    $wp_query->query["s"];

    Was ansonsten noch enthalten ist, könntest Du zum Beispiel mit print_r abfragen und da ist recht viel enthalten.

    PHP
    <?php if ( have_posts() ) : ?>
    
    
    <?php  
    echo "<pre>";
    print_r($wp_query);
    echo "</pre>";
    ?>


    <header class="page-header">

    Wobei aber was Du suchst leer bleibt.

    Code
    [category_name] => 
    [cat] =>

    Einmal editiert, zuletzt von Melewo (4. Oktober 2013 um 17:52)

  • So, nun hätte ich einen möglichen Anfang für Dich und denke, dass ein neues Objekt instanziieren in diesem Fall nicht der richtige Weg ist. Verstehe ab und an auch noch nicht viel in dieser Richtung von WP, doch allgemein in OOP kann ja ein neues Objekt nur das enthalten, was Du an diesem übergibst als Werte für die Eigenschaften, insofern die Eigenschaften noch keine vordefinierten Werte enthalten.

    search.php:

    Ausgabe:

    Nun brauchst Du das nur noch auszählen und für die Ausgabe aufbereiten. Plugins und Allgemein sind die beiden Namen der Kategorien, die Zahlen die IDs von den Posts mit Treffern.

    Einmal editiert, zuletzt von Melewo (4. Oktober 2013 um 20:13)

  • Weil ich schon dabei war, habe ich mal noch ein etwas besseres Beispiel fertig gemacht:

    search.php:

    Ausgabe:

    Zitat

    Suchbegriff: Hula-Hoop
    Treffer insgesamt: 3

    2 Treffer in der Kategorie: Plugins
    1 Treffer in der Kategorie: Allgemein

    Suchergebnisse für: Hula-Hoop

  • Noch einmal, weil in der For-Schleife fehlte noch eine if-Statement zur Überprüfung, ob die IDs auch zu einer Kategorie gehören, da sonst array_count_values eine Warnung auslöste. Da könnte aber im Einsatz ohnehin noch ein @ vorgesetzt werden.


    Nun sollte es jedoch für den Anfang genügen.

    Einmal editiert, zuletzt von Melewo (4. Oktober 2013 um 21:37)

  • Vielen Dank für deine Mühe.

    Allerdings ergeben deine Code-Beispiele (noch) nicht ganz das, was ich erreichen wollte - aber es kommt der Sache schon um einiges näher, als was ich bisher erreicht habe. Es wird zwar immer die korrekte Gesamt-Anzahl der Suchergebnisse angezeigt, aber es variiert dann von Seite zu Seite der Suchergebnisse die Anzahl der Suchergebnisse pro Kategorie und die Anzahl der Suchergebnisse pro Kategorie stimmt dann auch zum Teil nicht mehr.

    Es scheint so, dass sofern die Anzahl der Suchergebnisse geringer als die maximale Anzahl der Suchergebnisse pro Seite ist (bei mir sind es 5) dein Beispiel funktioniert.

    also zur Verdeutlichung:

    Auf der Suchergebnisseite Nr. 1 zum Suchbegriff xyz kommt raus: 3 Treffer in Kategorie A und 2 Treffer in Kategorie B

    Dann aber wenn ich innerhalb der Suchergebnis-Seiten weiterblättere ändert sich die Anzahl der Treffer pro Kategorie bzw. neue Kategorien kommen dazu.

    Unter http://test.energieundbau.de kann man (vorübergehend) die Problematik direkt auf der Website, um die es geht anschauen. Dazu einfach mal die Suchfunktion z. B. mit "lorem" (ergibt mehrere Suchergebnisse), "blub" oder "test" (ergibt 1 bzw. 2 Ergebnisse) füttern.

  • Gut, dann muss das noch etwas weiter entwickelt werden. Stimmt bei "lorem" ein Ergebnis oder sind die alle fehlerhaft? Was ich beim Blättern gesehen habe, danach stimmte wohl eher nichts.

    Werde mich da wohl noch etwas mit beschäftigen, falls es die Zeit erlaubt.

  • Habe jetzt nicht genügend Seiten in der Testumgebung bzw. "und" ist nicht gerade der ideale Suchbegriff, um mit Tests Abweichungen zu ermitteln. Müsste mir da erst einmal mehr Kategorien mit auffälligeren Suchwörtern zulegen.

    Dann könnte man die Anzahl heruntersetzen und dann mit den Ergebnissen der Blätterseiten vergleichen, wo da was aus dem Ruder läuft. Alles andere wäre für mich jetzt beinahe so wie herumraten.

  • Wobei diese Zeile nicht funktioniert:

    PHP
    $wp_query->set("posts_per_page", 20);


    Doch so:

    PHP
    query_posts($query_string."&showposts=20");
    
    
    /* Kontrolle */
    $alleps = $wp_query->query_vars["posts_per_page"];
    echo $alleps." Ergebnisse pro Seite<br />\n<br />\n";

    So langsam begreife ich das eine oder andere.

  • Die für einen Halbwissenden mit Abstand einfachste Lösung fiel mir heute Morgen nach dem Erwachen ein. Nur "s" übernehmen und mit s die Datenbank erneut abzufragen. Dabei könnte SQL gleich entsprechend formuliert werden. Und dabei wird dann ja auch ein neues WP_Query Objekt erzeugt, was dann beinahe einen Sinn ergibt.

    $search = new WP_Query($search_query);
    http://codex.wordpress.org/Creating_a_Search_Page

    Die begonnene Variante muss aber ebenfalls funktionieren, denn die DB-Abfrage wurde ja bereits ausgeführt und ist abgreifbar.

    Wie hast Du das mit der Pagnitation bzw. mit der Blätterfunktion gelöst?

  • Wenn ich jetzt die search.php ändere, um eine erneute Abfrage zu senden, dann ist die einfache Ausgabe erst einmal wieder relativ leicht realisierbar. Doch die ID lässt sich scheinbar nur über die Tabelle wp_term_relationships der ID einer Kategorie zuordnen und der ID der Kategorie müsste dann über der Tabelle wp_terms der Name einer Kategorie zugeordnet werden, falls ich das richtig verstehen sollte.

    Und wie müsste der SQL-Code aussehen, um so eine verknüpfte Anfrage an die DB zu senden? Da hätte ich wohl drei Tage zu tun, so fit bin ich in SQL nicht unbedingt.

    Die search.php sieht augenblicklich so aus:

    Einmal editiert, zuletzt von Melewo (6. Oktober 2013 um 10:09)

  • SQL kann ich Dir nicht beibringen, aber mal mit einem JOIN gearbeitet? ;) Anonsten hier mal ein Denkanstoß:

    Gültige compare-values findest Du im Codex. Ich hab sowas umgesetzt, aber im Rahmen eines Plugins und mit eigenen Queries, da hier Wordpress (respektive die abgewandelte ez-sql-Klasse) einfach Grenzen hat.

  • aber mal mit einem JOIN gearbeitet?


    Ja, heute, hatte ich ja schon längere Zeit vor mich da mal einzuarbeiten, doch vermutlich war das Beispiel gleich wieder etwas zu viel des Guten. Bisher ging das bei mir meist mit einer Tabelle ab, was ich so für den Eigenbedarf programmierte.

    Ich danke Dir für Deinen Denkanstoß.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!