1. Herzlich willkommen bei WPDE.org, dem grössten und ältesten deutschsprachigen Community-Forum rund um das Thema WordPress. Du musst angemeldet oder registriert sein, um Beiträge verfassen zu können.
    Information ausblenden

meta_query: Alterberechnung über zwei custom fields

Dieses Thema im Forum "Allgemeines" wurde erstellt von Andreas 2012, 3. März 2021.

  1. Andreas 2012

    Andreas 2012 Well-Known Member

    Registriert seit:
    25. November 2012
    Beiträge:
    71
    Zustimmungen:
    0
    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:

    Code:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!

    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
     
  2. b3317133

    b3317133 Well-Known Member

    Registriert seit:
    21. November 2014
    Beiträge:
    11.658
    Zustimmungen:
    1.781
    Erster Schritt, lesbarerer Code:
    Code:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Zweiter Schritt, Dokumentation lesen, dort z.B. Display posts from several custom fields: usw.
     
  3. Andreas 2012

    Andreas 2012 Well-Known Member

    Registriert seit:
    25. November 2012
    Beiträge:
    71
    Zustimmungen:
    0
    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.
     
  4. Andreas 2012

    Andreas 2012 Well-Known Member

    Registriert seit:
    25. November 2012
    Beiträge:
    71
    Zustimmungen:
    0
    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...
     
  5. mensmaximus

    mensmaximus Well-Known Member

    Registriert seit:
    24. Juli 2014
    Beiträge:
    8.857
    Zustimmungen:
    437
    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.
     
  6. Andreas 2012

    Andreas 2012 Well-Known Member

    Registriert seit:
    25. November 2012
    Beiträge:
    71
    Zustimmungen:
    0
    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?
     
  7. mensmaximus

    mensmaximus Well-Known Member

    Registriert seit:
    24. Juli 2014
    Beiträge:
    8.857
    Zustimmungen:
    437
    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.
     
  8. Andreas 2012

    Andreas 2012 Well-Known Member

    Registriert seit:
    25. November 2012
    Beiträge:
    71
    Zustimmungen:
    0
    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:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    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:

    Code:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    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:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!

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

    Andreas 2012 Well-Known Member

    Registriert seit:
    25. November 2012
    Beiträge:
    71
    Zustimmungen:
    0
    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?
     
  10. b3317133

    b3317133 Well-Known Member

    Registriert seit:
    21. November 2014
    Beiträge:
    11.658
    Zustimmungen:
    1.781
    Du kannst die meta_query mit dem Parameter relation ü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.
     
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden