Support » Allgemeine Fragen » Altersberechnung mit custom fields?

  • Gelöst Andreas 2013

    (@andreas-2013)


    Hallo WordPress-Freunde,

    ich habe über einen Custom Post Type tausende Seiten von Personen generiert, deren Daten wie Geburtsdatum, Geburtsort etc. aus Custom Fields ausgelesen werden.

    Für jede Person berechne ich das Alter auf folgende Weise:

    $geburtsdatum = get_post_meta($post->ID, 'geburtsdatum', true) ;
    
    $gebdat = new DateTime($geburtsdatum);
    $heute = new DateTime('now');
    $interval = $heute->diff($gebdat);
    
    echo $interval->format('%y'); // Alter in Jahren

    Nun möchte ich am Ende jeder Personenseite einige andere Personen aufführen, die das gleiche Alter haben. Wie kann ich das o.g. Skript mittels new WP_Query bzw. meta_query umsetzen, um die entsprechenden Personen rauszufiltern?

    Auf meiner alten Website habe ich die Daten aus einer mySQL-Tabelle direkt geholt und das so gelöst:

    SELECT ... TIMESTAMPDIFF(YEAR, geburtsdatum, CURDATE()) AS alter ...

    Gibt es etwas ähnliches, das man mit WP_Query machen kann? Oder gibt es irgendwelche Berechnungsmöglichkeiten, die man direkt in den Custom Fields anstellen kann?

    Vielen Dank für eure Hilfe im voraus! 🙂
    Andreas

Ansicht von 9 Antworten - 1 bis 9 (von insgesamt 9)
  • Du kannst eine Meta-Query durchführen, die alle Beiträge auflistet, bei denen ein Datum in einem bestimmten Bereich liegt („Range Meta Query“). Ein Beispiel findest du hier: https://wordpress.stackexchange.com/a/34892/129212

    Wenn ich den Code etwas anpasse, solltest du so alle Personen mit einem Alter von 50 Jahren mit folgendem Code abrufen können:

    
    $start = date( 'Y-m-d', strtotime( '-50 years', time() ) );
    $end   = date( 'Y-m-d', strtotime( '-50 years 11 month 30 days', time() ) );
    
    $args = array(
        'post_type' => 'personen',
        'posts_per_page' => -1,
        'orderby' => 'meta_value',
        'order' => 'ASC',
        'meta_key' => 'geburtsdatum',
        'meta_query' => array(
            array(
                'key' => 'geburtsdatum',
                'value' => array($start, $end),
                'compare' => 'BETWEEN',
                'type' => 'DATE'
            )
        )
    );
    // Make the query
    $alter_query = new WP_query( $args );
    
    Thread-Starter Andreas 2013

    (@andreas-2013)

    Hallo Bego Mario Garde,
    danke für deine Antwort!

    Ich habe das Script ausprobiert, aber das Resultat ist immer um 1 Jahr falsch. Also wenn ich eine Person habe, die 50 Jahre alt ist, dann werden als Vorschläge Personen genannt, die 49 Jahre alt sind.

    Könntest du bitte einmal deine Zeitberechnung erläutern, also das, was hinter „strtotime“ in den Klammern steht? Da bin ich ehrlich gesagt nicht durchgestiegen 😉

    Vielen Dank im voraus!

    Hm, war wohl noch zu früh für mich. 😀

    <?php
    
    $start = date( 'Y-m-d', strtotime( '-51 years +1 day', time() ) );
    echo 'von ' . $start;
    
    $end = date( 'Y-m-d', strtotime( '-50 years', time() ) );
    echo ' bis ' . $end;

    sollte ausgeben „von 1969-11-13 bis 1970-11-12“.

    Wer am oder nach dem 13.11.1969 und vor oder am 12.11.1970 geborgen wurde, ist am 12.11.2020 50 Jahre alt.

    $end = date( 'Y-m-d', strtotime( '-50 years', time() ) );

    bedeutet umgangssprachlich: weise der Variable $end das Datum in der Ausgabeform Jahr-Monat-Tag (1942-12-31) zu, das aus der aktuellen Zeit minus 50 Jahre berechnet wird.

    Thread-Starter Andreas 2013

    (@andreas-2013)

    Perfekt, hat super geklappt, vielen Dank!!! 😀

    Und wer macht jetzt das Licht aus markiert jetzt den Thread als „gelöst“? 😛

    Thread-Starter Andreas 2013

    (@andreas-2013)

    Ist noch nicht ganz gelöst, eine Frage habe ich nämlich noch 🙂

    Da die Performance bei meta_query-Abfragen sehr schlecht ist, hatte ich die jeweils in einen transient-cache geschrieben, ohne Zeitbegrenzung.
    Ich kenne mich mit der Gültigkeit von transients nicht so gut aus. Wie verhält es sich denn mit den von dir genannten Abfragen, behalten die ihre Gültigkeit, oder muss der Cache regelmäßig wieder gelöscht werden?

    Das kann ich dir nicht beantworten.

    Da deine Fragen über einen Anwender-Support hinaus gehen, bist du vermutlich bei Stackexchange besser aufgehoben. Ich bin nur Anwender mit sehr begrenzten Kenntnissen.

    Die Dokumentation zu Transients findest du hier: https://developer.wordpress.org/apis/handbook/transients/

    Thread-Starter Andreas 2013

    (@andreas-2013)

    Alles klar, kein Problem.

    Trotzdem vielen Dank für die bisherige Hilfe 🙂

    Gern geschehen. Aber im Ernst: frag mal bei Stackexchange nach.

Ansicht von 9 Antworten - 1 bis 9 (von insgesamt 9)
  • Das Thema „Altersberechnung mit custom fields?“ ist für neue Antworten geschlossen.