Wie kann man die Suche in Wordpress um zwei gleichzeitige Suchfelder erweitern

  • Sollte es so in etwa aussehen?

    Nein, wenn Du eine Datei page-impressum.php im Theme mit ablegst und die Seite Impressum über WP anlegst, so hat doch der Name der Datei nichts mit dem Namen der Seite zu tun bzw. nur so viel, dass WP weiß, dass der Slug und die ID der Seite zur Datei gehören. So schwer ist das eigentlich nicht zu verstehen, habe aber auch nocht nicht alle Varianten ausprobiert.

    http://codex.wordpress.org/Page_Templates…m_Page_Template

    Also, wenn Du dann in der Seite "http://www.example.com/impressum/" ein Formular anlegen würdest, dann würdest Du doch wohl (ohne Zeilenumbruch) schreiben:

    PHP
    <form id="searchform" method="get" 
    action="<?php echo esc_html(home_url("/impressum/")); ?>">

    Damit am Ende das herauskommt:

    "http://www.example.com/impressum/"

    Es soll aber nicht das herauskommen, weil Deine Seite nicht so heißt:

    "http://www.example.com/impressum/page-impressum.php"

    • 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

  • Ich glaube, ich verstehe was du meinst.

    Müsste dann also so lauten:

    HTML
    <form id="searchform" method="get" action="/thesearch/">
    <input class="search-form_it" type="text" placeholder="Was?" value="<?php echo esc_html($was, 1); ?>" name="was" id="was">

    Und wenn ich einen Unterordner meine-suche im Template anlege und die thesearch.php dort ablege, findet er sie ebenfalls mit dem Action oben. Wenn ich das in dem Link von dir richtig verstanden habe :)

  • Habe nur gerade so wenig Zeit, sonst hätte ich mal einiges ausprobiert. Aber ein wenig schon.
    Also eine Seite (eigentlich Datei und nicht Seite!) angelegt und diese unter page-hustentropfen.php im Theme-Verzeichnis gespeichert.

    page-hustentropfen.php

    Anschließen mich eingeloggt und eine statische Seite angelegt, diese den Titel "Meine Suche" gegeben, womit die unter dem Permalink "http://localhost/wp/meine-suche/" erreichbar wird. In dieser Seite wurde außer dem Titel nicht eine Zeile Text gespeichert. Zum Schluss auf der rechten Seite unter Attribute -> Template -> "Meine Tropfen Page" ausgewählt und die Seite veröffentlicht.

    Nun erscheint die oben im Menü mit dem Link "Meine Suche" und wenn ich den Link anklicke, so öffnet sich meine "http://localhost/wp/meine-suche/" mit dem Inhalt

    Zitat

    Was ist, klappt oder klappt nicht? Hustentropfen gibt es keine!

    der ja in der page-hustentropfen.php enthalten ist.

    Also, die Seite /meine-suche/ benutzt als Template die Datei page-hustentropfen.php, in dem jetzt ein beliebiges Script eingebaut werden könnte. Und ja, Du rufst die unter dem Namen der Seite auf und nicht unter den Namen der Datei, die eigentlich nur als Template dient.

  • Melewo:
    Das klappt. Vielen Dank.

    > jedoch filtert man gleich den Eingang, zum Beispiel mit preg_replace und einer entsprechenden Zeichenklasse.
    Wie filtert man gleich den Eingang? Ich mache es ja schon direkt im Form?

    entwickler:
    Auch deine Lösung klappt. Musste nur das richtige div drumwickeln ;)

    Was mir jetzt noch fehlt, dass ich mein Suchformular auf jeder Seite habe. Das habe ich eigentlich auch schon, über ein

    PHP
    <?php get_search_form(); ?>

    im header.php. Allerdings musste ich dazu das Standard searchform.php durch mein Formular ersetzen. Wie kann ich mein Formular in einer eigenen Datei haben und dann im Header aufrufen?

    Einmal editiert, zuletzt von seka (29. Oktober 2013 um 18:08)

  • Ich mache es ja schon direkt im Form?


    Dort wo Du das entgegennimmst, was gesendet wurde, also bei der Eingangskontrolle.

    Vor dem Absenden kann eine Kontrolle erfolgen, zum Beispiel auf Vollständigkeit, ist richtig. Nur was versendet wurde, das schadet Deiner Seite nicht mehr, sobald es unterwegs ist. Doch das kann dem Empfänger schaden, zum Beispiel wenn POST oder GET manipuliert werden, um Schadcode einzuschleusen. Und wenn Du gleichzeitig Absender und Empfänger bist, so hast Du beide Seiten abzusichern. Nur ein Beispiel (muss angepasst werden):

    Code
    $eingang = trim($_GET["eingang"]);
    $eingang = preg_replace("/[^a-z]/i", "", $eingang);
  • Man arbeitet mit $_REQUEST.

    Davon abgesehen sollte man in diesem Fall die API von WordPress einbinden, um die vorhandenen Sicherheitsfunktionen nutzen zu können. Bitte hier die Guides & Tutorials von Google ignorieren, weil sie allesamt falsch sind (wp-load.php inkludiert man nicht)! Macht zudem keinen Sinn, weil die Anwendung dann gänzlich als Plugin in WordPress aufgebaut sein sollte.

    seka:
    Wenn Du der objektorientierten Programmierung nicht mächtig bist, solltest Du wenigstens Funktionen für Deine Anforderungen etablieren. Ungeachtet dessen kannst Du Dir ganz plump in der functions.php Deines Themes eben solche hinterlegen, die für die Ausgabe des Formulars sorgt. Das gehört zwar nicht ins Theme, sondern eher in ein Plugin, aber es mag seinen Zweck erfüllen.

  • Davon abgesehen sollte man in diesem Fall die API von WordPress einbinden, um die vorhandenen Sicherheitsfunktionen nutzen zu können.



    Könntest du mir dafür ein praktisches Beispiel geben? Denn spontan kann ich mit deiner Aussage nicht viel anfangen.

    Wenn Du der objektorientierten Programmierung nicht mächtig bist, solltest Du wenigstens Funktionen für Deine Anforderungen etablieren.

    Ja, ich weiß das leider immer noch nicht wirklich, trotz einiger Programmiererfahrungen. Ich weiß zwar theoretisch was das ist, aber abgesehen, dass die Templates in Wordpress modular aufgebaut sind, kann ich da nichts objektorientiertes sehen. Kannst du mir da womöglich irgendwas als Lesestoff empfehlen um da rein zukommen?

    Ungeachtet dessen kannst Du Dir ganz plump in der functions.php Deines Themes eben solche hinterlegen, die für die Ausgabe des Formulars sorgt.

    Ah cool. Aber vielleicht besser über ein include, oder?

    Das gehört zwar nicht ins Theme, sondern eher in ein Plugin, aber es mag seinen Zweck erfüllen.

    Ist das dann wie diese, die nachinstalliert werden können?

  • Man arbeitet mit $_REQUEST.


    Wenn es sich anbietet und nicht auf die Datenbank zugegriffen werden soll, dann könnte man auch den Request, den Server und somit ebenso WP übergehen und mit DOM-Storage arbeiten. Die XML, welche durchsucht werden soll, ist wohl etwas zu groß dafür. Doch je nach Browser lassen sich 2 bis 4 und mehr MB als sessionStorage oder localStorage zwischenspeichern.

    Das Beispiel versendet nur mit POST, wenn JavaScript deaktiviert ist. In allen anderen Fällen wird die Aktion POST nach Aufruf der Funktion sendeStorage durch den Eventhandler onsubmit mit return false abgebrochen. Mit sendeStorage wird dafür dann mit DOM-Storage gearbeitet.

    HTML
    <form action="errorpage.php" method="post" onsubmit="sendeStorage(); return false">

    Somit müsste es eigentlich möglich sein, bei Aufruf der Seite die XML in ein etwas sparsameres Format umzuwandeln, als Storage zu speichern und wenn jemand die Suche betätigt, durchsucht er nur noch die in seinem Browser als DOM-Storage gespeicherten Daten, ohne den Server mit einem Request zu belästigen. Da die Same Origin Policy nicht verletzt wird, sollte es eigentlich möglich sein, habe es nur noch nicht ausprobiert.

    Ein einfaches Beispiel (ohne Suchfunktion) hatte ich vor längerer Zeit mal gefertigt, wobei auch ein Seitenwechsel erfolgen kann, nur nicht durch das Attribut action, sondern window.location:

    http://www.coder-welten.de/javascript/pos…abrufen-11.html

    Einmal editiert, zuletzt von Melewo (30. Oktober 2013 um 07:01)

  • DOM Storage ist für eine Suche ein schlechter Witz, oder? Mal davon abgesehen, dass das Data-Handling da zum Graus wird und der Benutzer den Datenmüll auch noch auf seiner Kiste liegen hat, gibts Browserstress. Und solche Klugscheisserchen wie ich haben Privacy-Erweiterungen in den Browsern laufen, um dem allgemeinen Datenwahn entgegen zu wirken.

    Davon abgesehen hast Du den Request sowieso auf'm Server - wie sollen die Daten sonst in den DOM wandern? ;)

    @TE:
    1. Nein. Muss ich raussuchen, hab ich weder Zeit noch Bock zu. Google mal selber danach...
    2. Die Themes sind übelster Spaghetti-Code - reden wir nicht drüber. Fang einfach mal im WordPress Codex an - dort finden sich auch allgemeine Artikel wie ein Plugin erstellt wird und so weiter. Viele davon sind recht frisch aktualisiert, weil sich unter der Haube ja was getan hat.
    3. Wieso ein Include? Für eine Funktion? Schreib sie einfach rein, lass sie HTML-Code ausgeben und leg das Ganze als Hook für einen Shortcode an. Dann kannst Du diesen überall verwenden (Widgets, Seiten, Beiträge) und per do_shortcode() auch ohne weiteres im Theme an beliebiger Stelle platzieren...
    4. Yap.

    Beispiel Shortcode:

    Einbinden mit [foe-search url="xmlsearch.php" submit="Suchen" icon="icon-car"] - das Icon ist Optional. Gibt Leute, die sowas am Button haben... :D

  • Die Rede ist auch nicht von einer Suche, sondern von einer Suche in einer XML, die letztendlich auch ganz einfach mit DOM ausgelesen werden könnte.

    Ich habe eine Suche die in eine XML Datei durchsucht.

    Und wenn dafür eine Datei als Template erstellt wird, dann kann diese auch den Code und das Formular aufnehmen, ohne dafür zusätzlich noch ein Plugin zu verwenden.
    Die zusätzliche Sicherheit von WP ist ab und an auch nicht über zu bewerten. Siehst Du bei $s, dort werden Sonderzeichen nur in Entities verwandelt, anstatt diese gleich zu entfernen. Soll heißen, die Wandlung in Entities mag genügen, doch warum nicht selbst absichern und gleich entfernen, was an Zeichen nichts in einem Parameter-Wert verloren hat.

    Ich weiß zwar theoretisch was das ist, aber abgesehen, dass die Templates in Wordpress modular aufgebaut sind, kann ich da nichts objektorientiertes sehen. Kannst du mir da womöglich irgendwas als Lesestoff empfehlen um da rein zukommen?

    In WP wird OOP mit prozeduraler Entwicklung vermischt. Wenn Du eigenen Code schreibst, so kannst Du dafür OOP verwenden, um Deinen Code letztendlich mehr in eine abgesicherte Schnittstelle zu verwandeln.

    Einmal editiert, zuletzt von Melewo (30. Oktober 2013 um 12:42)

  • Warum sollte ich, Du weißt doch auch alleine, dass man eine XLM gleich mit ausliefern kann (insofern es sich um keine 14 MB große Monster-XML handelt, wovon hier aber auszugehen ist), sich somit allein schon durch die Möglichkeit der Auslieferung von der Suche in einer DB unterscheidet, bei der nur die gefundenen Ergebnisse ausgeliefert werden.

    Im Allgemeinen würde sich da Ajax anbieten, doch es sollte eigentlich auch möglich sein, die XML gleich als String zu verpacken, der dann nur noch mit JS durchsucht zu werden braucht. Gut, ich habe es noch nicht getestet, so dass es sich zuweilen nur um Gedanken handelt, die Fehler enthalten können.

  • Klar, am Besten nach JSON wandeln. Mit Zend natürlich... http://framework.zend.com/manual/1.12/de…n.xml2json.html :D

    Das letzte Mal, als ich mir den XML-Remmel gegeben hab, war Anno 2000 im Rahmen einer CD-ROM-Programmierung... Flash, XML.. war ne echte Herausforderung. Selbst die Hardcore-Buden sind weg davon.

    Spielt aber alles keine Rolle. Entweder arbeite ich mit den XML-Nodes und hüpfe da munter durch oder ich pack das Ding einfach in die Datenbank. Ich hab das nicht gerne, wenn ich Datenbestände in unterschiedlichen Formaten vorliegen habe - deswegen arbeitet die Telekom im Backoffice heute mit bis zu 5 verschiedenen Systemen, die nix miteinander anfangen können.

    MySQL bietet das sogar selber an: https://dev.mysql.com/doc/refman/5.5/en/load-xml.html

    Ohne die Struktur der XML-Datei zu kennen:

    Code
    LOAD XML LOCAL INFILE 'foo.xml'
        INTO TABLE mytable
        ROWS IDENTIFIED BY '<foorow>';

    Selbst wenn das XML aus einer anderen Anwendung exportiert wird, kann man bequem über eine XSLT die notwendigen Deklarationen für die Nodes, Namespaces und Attributes erstellen. Richtig angelegt, erreicht man auf diesem Weg eine kleine Schnittstelle mit 100% Migration.

    Grad mal gegoogelt: http://www.codeproject.com/Articles/61765…rate-SQL-Script

    Den Weg würde ich trotzdem in Frage stellen...

    So, Schluss jetzt. Ich glaub, der TE steht längst am Bahnhof und versteht nur noch "Zug". ;)

  • Nönö, ich versteh schon um was es geht und bin euch für alle Information dankbar, auch wenn ich sie wahrscheinlich praktisch nicht umsetzen kann ;)

  • Für POST habe ich jetzt kein Beispiel, doch für GET hatte ich mal eins, erst einfach und nach Mecker von formateins (wofür ich ihm ja dankbar bin) dann weiter unten noch einmal WP freundlicher. Enthält zwar kein Formular, doch Beispiele, wie man GET-Parameter mit

    PHP
    $query_vars[] = "parameter";

    hinzufügen kann, um diese dann wieder mit

    PHP
    $parameter = $wp_query->query_vars["parameter"];

    auswerten zu können.

    http://forum.wpde.org/konfiguration/…r-einbauen.html

    Beantwortet das eventuell gleich Deine Frage von:

    http://forum.wpde.org/allgemeines/12…rschwinden.html

    Einmal editiert, zuletzt von Melewo (31. Oktober 2013 um 12:09)

  • Mal so die Frage. Ich durchsuche ja die xml Datei und gebe mir gerade als Debug die Gesamtzahl der Funde nach den Ergebnissen aus. Kann man diese Zahl auch über den Ergebnissen positionieren ohne die Datei zwei mal durchlaufen lassen zu müssen? Weil die Gesamtzahl weiß man ja eigentlich erst nach Ausgabe der Ergebnisse.

  • Ohne Code-Schnipsel? Antwort: Ja. ;)

    Wie verarbeitet das Skript denn? SimpleXML? Und Grundsätzlich: Die Ergebnisse müssen ja eh in einer Schleife verarbeitet werden. Einfachen einen Zähler mitlaufen lassen und gut ist.

  • Da bleibt mir ja weiter nichts übrig, als formateins zu zitieren:

    seka:
    Wenn Du der objektorientierten Programmierung nicht mächtig bist, solltest Du wenigstens Funktionen für Deine Anforderungen etablieren.


    Das ist doch wohl so was von egal, in welcher Reihenfolge Du die Ergebnisse ausgibst.

    Prozeduraler Stil mit Funktionen:

    Oder OOP, geht noch besser, nur mal ein schnelles Beispiel:

Jetzt mitmachen!

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