meta_query: Alterberechnung über zwei custom fields

  • Hallo Wordpress-Freunde,

    ich habe eine Personen-Datenbank, deren Einträge ich nach dem Alter der Personen mittels meta_query filtern möchte. Jeder Person habe ich benutzerdefinierte Felder mit Geburts- und Sterbedatum zugewiesen. Bei lebenden Personen z.B. 1964-02-15 und 0000-00-00, bei verstorbenen Personen z.B. 1940-05-20 und 1999-06-25.

    Ich habe die Ausgabe auf meiner alten Homepage direkt mit SQL gemacht und dort über Timestampdiff(YEAR, geburtsdatum, sterbedatum) bereits im SELECT-Befehl bequem nur die entsprechenden Personen eines Alters herausfiltern können.

    Für meine neue Homepage möchte ich gern mit wp_query bzw. meta_query arbeiten, tue mich aber mit der Umsetzung etwas schwer, da ich irgendwie die unterschiedlichen keys und values unter einen Hut bringen muss.

    Die Ausgabe der lebenden Personen ist kein Problem. Um z.B. alle 55jährigen auszugeben, lautet der Code folgendermaßen:


    Wenn ich nun jedoch bereits verstorbene Personen ausgeben möchte, benötige ich den Inhalt des benutzerdefinierten Feldes 'sterbedatum'. Dieser liegt mir vor dem Filtern jedoch noch nicht vor. So kann ich die Variable $end nicht befüllen, bzw. das würde ja wohl auch nicht gehen, da ja nur das Feld 'geburtsdatum' abgefragt wird.

    Kann mir jemand sagen, wie ich das Alter einer verstorbenen Person mittels des Inhalts zweier verschiedener keys und deren values ermitteln kann? Idealerweise wäre die meta_query so angelegt, dass ich in der Ausgabeliste sowohl die lebenden wie auch die verstorbenen Personen im Alter von 55 Jahren erhalte.

    Für eure Hilfe schon mal im voraus ganz herzlichen Dank :-)
    Andreas

    • 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

  • Erster Schritt, lesbarerer Code:


    Zweiter Schritt, Dokumentation lesen, dort z.B. Display posts from several custom fields: usw.

  • Danke für deine Antwort. Das hatte ich mir schon durchgelesen, aber es hat mir bei meinem Problem nicht geholfen. Ich will ja den End-Wert nicht selbst vorgeben, weil ich ihn gar nicht weiß. Dieser Wert soll ja irgendwie automatisch aus dem Feld 'sterbedatum' ausgelesen werden.

  • Ich muss gerade selbst noch mal die Herangehensweise bzw. die Logik überdenken, das ist für mich das eigentlich knifflige.

    Bei noch lebenden Personen ist der Bezugspunkt der heutige Tag, da rechnet man anhand der Formel einfach zurück und gibt mittels der date-range $start und $end alle in Frage kommenden Personen aus.

    Sobald eine Person im Feld 'sterbedatum' nicht mehr den Wert '0000-00-00' stehen hat, müsste dann der Bezugspunkt der Wert des 'geburtsdatums' zu einem x-beliebigen Punkt in der Vergangenheit sein. Die zeitliche Differenz zu dem Wert aus 'sterbedatum' bildet dann das Alter. Aber diese Range ist ja je nach Person variabel.

    Wie kann ich dies trotzdem mit wp_query umsetzen, sodass ich schon on-the-fly sortieren kann, um die entsprechenden Personen auszugeben? Also analog zu der SQL-Variante mit Timestampdiff(YEAR, geburtsdatum, sterbedatum)?

    Ich könnte natürlich einfach ALLE Personen der Datenbank abrufen und dann per PHP aussortieren. Aber es handelt sich um fast 10.000 Personen, daher denke ich, ist das nicht der richtige Weg, allein wegen der Performance...

  • Ich verstehe das Problem nicht. Frage das Feld Sterbedatum vor der Abfrage ab. Wenn es nicht existiert, leer ist oder 0 enthält erstellst Du Deinen Query wie gehabt. Enthält das Feld hingegen ein Datum erstellst Du einen alternativen Query.

    WordPress ist "frei" wie in Freiheit es zu nutzen, aber nicht im Sinne von Freibier. Wer also glaubt man bekommt rund um WordPress alles kostenlos, der irrt. Hilfe ist ein Geschenk für das man sich bedankt, dafür gibt es den 'Gefällt mir' Button. Wer das nicht kann und sich selbst nicht zu helfen weiss, muss sich bezahlte Unterstützung suchen.

  • Enthält das Feld hingegen ein Datum erstellst Du einen alternativen Query.

    Genau darum geht es ja. WIE erstelle ich eine Abfrage, wenn ich eine date-range abfragen will, die Werte aus zwei verschiedenen keys benötigt? Hast du da einen Tipp für mich?

  • Du kannst Meta Queries belliebig in die Tiefe verschachteln. Erkläre doch mal genau wie Du das mit verstorbenen Personen meinst. Lebende und verstorbene Personen in einer Abfrage mit dem Ziel nur die 55 Jährigen auszugeben macht ja wenig Sinn. Man kann ja höchsten die Personen finden die mit 55 gestorben sind.

    WordPress ist "frei" wie in Freiheit es zu nutzen, aber nicht im Sinne von Freibier. Wer also glaubt man bekommt rund um WordPress alles kostenlos, der irrt. Hilfe ist ein Geschenk für das man sich bedankt, dafür gibt es den 'Gefällt mir' Button. Wer das nicht kann und sich selbst nicht zu helfen weiss, muss sich bezahlte Unterstützung suchen.

  • Die 55 war natürlich nur ein Beispiel ;)
    Ich habe eine variable $alter, die ich aus jedem Dateipfad der einzelnen Alter-Jahreszahlen auslese (.../55-jahre-alt/) und die ich dann im besagten Codeschnipsel einfüge:

    Code
    $start = date( 'Y-m-d', strtotime( '-'.($alter+1).' years +1 day', time() ) );

    Das funktioniert, wenn ich als Bezugspunkt den heutigen Tag nehme. Sobald ich bei verstorbenen Personen jedoch den Startpunkt in die Vergangenheit verschiebe, bin ich auf das Feld 'geburtsdatum' UND das Feld 'sterbedatum' angewiesen.

    Mit reinem SQL funktioniert das so korrekt:

    Allerdings wollte ich gern auf alle Elemente wie get_permalink() oder get_post_meta($post->ID, 'geburtsort', true) zugreifen und daher die Ausgabe mit wp_query machen:

    Code
    if ( $alter->have_posts() ) :
    while ( $alter->have_posts() ) : $alter->the_post();


    Mit der Ausgabe über foreach( $results as $result ) konnte ich besagte Elemente nicht abrufen...

  • Ich vermute mal, dass es mit wp_query keine Lösung für das Problem gibt. Ich werde dann die Abfrage mittels
    $wpdb->get_results und meinem selbstgestrickten SQL vornehmen. Oder ist die Performance dann schlechter als mit wp_query?

  • Du kannst die [FONT=Courier New]meta_query[/FONT] mit dem Parameter [FONT=Courier New]relation[/FONT] über z.B. AND und OR usw. kombinieren und auch verschachteln, dazu empfiehlt es sich wie bereits beschrieben, die Dokumentation zu lesen und ggf. mit einer Testseite zu experimentieren. Diese Abfrageart ist sehr mächtig, wenn man sie richtig nutzt.

Jetzt mitmachen!

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