query_posts: post order nach Metainformtionen

  • query_posts: post order nach Metainformationen

    Hallo,
    ich habe eine Art Veranstaltungskalender mit wp realisiert. Die Nutzer geben ihren Beitrag ganz normal ein und müssen nur noch bei den custom fields jeweilsl das Datum der Veranstaltung angeben. im Index-template habe ich dann zwei loops stehen, der eine geht die Beiträge durch, fischt das Datum aus den Metadaten (und den Titel der Veranstaltung) und gibt sie in eine Tabelle aus, der zweite loop gibt die Artikel ganz normal aus. Mein Problem; ich möchte diese Tabelle mit den Veranstaltungen natürlich am liebsten so gestalten, dass die Termine in der richtige Reihenfolge sind, d.h. ich müsste die Datenbankquery nicht nach dem Postingdatum, sondern nach dem im custom fied gespeicherten Datum sortieren. Kann mir jemand sagen, wie das am einfachsten zu machen ist?

    Einmal editiert, zuletzt von wasserl (22. April 2008 um 21:21)

    • 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

  • Vielen Danke cywhale.
    Jetzt habe ich da nur ein Problem; der für mich relevante Trick an dem Skript ist ja der hier


    PHP
    $querystr = "
        SELECT wposts.* 
        FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
        WHERE wposts.ID = wpostmeta.post_id 
        AND wpostmeta.meta_key = 'tag' 
        AND wpostmeta.meta_value = 'email' 
        AND wposts.post_status = 'publish' 
        AND wposts.post_type = 'post' 
        ORDER BY wposts.post_date DESC
     ";


    Ich möchte jetzt nach einem custom field mit meta_key = datum und meta_value = <ein Text, der ein Datum repräsentiert> sortieren. Wie kriege ich sowas in eine ORDER BY-Anweisung rein? Die entspr. Tabelle sieht ja so aus;

    [...] meta_key meta_value
    datum 04.05.08
    titel einTitel
    datum [...]

    D.h. ich kann weder einfach sagen ORDER BY meta_key noch ORDER BY meta_value. Weiß jemand weiter? :(

  • Code
    [COLOR=#000000][COLOR=#0000CC]$querystr [/COLOR][COLOR=#006600]= [/COLOR][COLOR=#CC0000]"
        SELECT wposts.*,  [/COLOR][/COLOR][COLOR=#000000][COLOR=#CC0000]wpostmeta.meta_value AS metadate[/COLOR][/COLOR][COLOR=#000000][COLOR=#CC0000] 
        FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
        WHERE wposts.ID = wpostmeta.post_id 
        AND wpostmeta.meta_key = 'datum' 
        AND wpostmeta.meta_value != '' 
        AND wposts.post_status = 'publish' 
        AND wposts.post_type = 'post' 
        ORDER BY metadate DESC
     "[/COLOR][COLOR=#006600];  [/COLOR][/COLOR]


    In der Art müsste es funktionieren. Es werden nur Posts mit dem meta_key 'datum' gesucht und dann nach meta_value (alias metadate) absteigend (DESC) sortiert.
    Zur Beschleunigung der Abfrage wäre es noch besser statt wposts.* nur die benötigten Felder abzufragen, das '*' kostet ungemein Zeit.

  • Hey, Danke für die schnelle Antwort. Der Code funktioniert, soweit ich das beurteilen kann. Jetzt habe ich leider noch ein kleines Problem;
    In der DB ist ja das Feld als Text und nicht als Datum gespeichert. Um also wirklich zu sortieren, müsste ich sowas wie (korrigiert mich, wenn das schon falsch ist)

    PHP
    [...]
    ORDER BY CAST(metadate AS DATE)
    [...]

    Das habe ich ausprobiert. Ich habe die Daten im Format DD.MM.YY eingegeben, was nach meinen Recherchen von SQL nicht erkannt wird. Also habe ich testweise mal zwei der Daten in das Format YY-MM-DD geändert - amüsanterweise tauchen sie dann in der Abfrage nicht mehr auf (d.h. sie werden nicht ausgegeben)
    Ich habe daher zwei Fragen:
    1.) kann ich das so wie oben casten?
    2.) Gibt es u.U. eine Möglichkeit, die Daten direkt in der Abfrage so zu konvertieren, dass sie als DATE vearbeitet werden?

  • Hi,
    ich habe es hinbekommen. Das oben war mein Fehler, weiter unten in meinem Code hatte ich das Datum ausgelesen und zu nem timestamp konvertiert, um Termine aus dem Kalender zu entfernen, die bereits vergangen sind. Die Veränderung des Datumsformats hat dann dazu geführt, dass die entsprechenden Einträge nicht mehr richtig zerlegt wurden.

    Vielen Dank nochmal für deine Hilfe.

    Einmal editiert, zuletzt von wasserl (23. April 2008 um 20:01)

  • kannst du den Code, mit dem man vergangene Termin aus dem Kalender entfernt evtl. mal posten?


    Ja, hier:

    Die letzte Zeile entspricht ungefähr einem Tag, d.h. erst nachdem der Termin vergangen ist, wird er auch gelöscht, nicht an dem Tag selbst. Danach kommt halt die Ausgabe der einzelnen Datensätze und - nicht vergessen - rewindposts.

    Ich bin übrigens für kritische Anmerkungen dankbar. Ich bin kein nativer PHP-Programmierer und genau genommen nicht mal ein nativer Programmierer, schätze mal, das wird ein ziemlich unsauberer Hack sein, was ich da fabriziert habe.

Jetzt mitmachen!

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