it-swarm.com.de

Gruppiere WP_Query nach meta_key Datum

Ich habe eine wp_query, die Posts eines benutzerdefinierten Post-Typs auflistet, sortiert nach einem benutzerdefinierten Feld 'time'.

Ich möchte diese Liste nach einem anderen benutzerdefinierten Feld "Datum" gruppieren, sodass jeder Beitrag mit demselben benutzerdefinierten Feld "Datum" unter diesem Datum aufgeführt wird. Ich kenne diese Daten nicht im Voraus.

Die Ausgabe wäre wie folgt:

Datum x
- nach 3
- nach 6
- nach 8

Datum y
- nach 1
- nach 4

Datum z
- nach 2
- nach 5
- nach 7
- nach 9

Unten ist meine aktuelle WP_Query:

<?php
        // WP_Query arguments
        $args = array (
            'post_type'              => 'movie',
            'posts_per_page'         => '50',
            'orderby'                => 'meta_value_num',
            'order'                  => 'ASC',
            'meta_key'               => 'time',
        );

        // The Query
        $query = new WP_Query( $args );

        // The Loop
        if ( $query->have_posts() ) {
            while ( $query->have_posts() ) {
                $query->the_post();
                echo "<li><a href='".get_permalink()."'>";
                echo "<div class='xyz'>".get_the_title()."</div>";
                echo "</a></li>";

                $vbrand = get_post_meta( get_the_id(), 'brand', true ); 
                $vyear = get_post_meta( get_the_id(), 'year', true ); 
                $vtime = get_post_meta( get_the_id(), 'time', true ); 

                        echo "<p>".$vbrand;
                echo "<p>".$vyear;
                echo "<p>".$vtime;
            }

        } else {
            // no posts found
        }
        /* Restore original Post Data */
        wp_reset_postdata();
?>
1
BoBoz

Ein guter Ansatz wäre, zuerst alle Beiträge nach Datum sortiert abzurufen und dann zu gruppieren.

Wenn Sie angeben, dass das benutzerdefinierte time-Feld das Format Y-m-d hat, können Sie Ihre Posts ordnungsgemäß mit orderby => 'meta_value' sortieren (nicht wie derzeit mit meta_value_num, wodurch der Wert in einen numerischen Typ umgewandelt wird).

Wenn Sie als Nächstes einen Titel für jedes Datum ausgeben möchten, können Sie das zuletzt angezeigte Datum speichern und es ausgeben, wenn sich das Datum von diesem Datum unterscheidet (und das gespeicherte Datum ändern). Dies würde etwas Ähnliches ergeben:

$dategroup = '';

if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        // Fetch date for current post
        $postdate = get_post_meta( get_the_ID(), 'time', true );

        // Check if the post date differs from the current date
        if ( $postdate != $dategroup ) {
            // In that case, this is a new date that hasn't yet been displayed
            // So, we output the title...
            echo '<h3>' . $postdate . '</h3>';

            // ...and change the stored date for the current group
            $dategroup = $postdate;

            [your output stuff]
        }
    }
}
2
engelen