web-dev-qa-db-fra.com

Grouper WP_Query par meta_key date

J'ai un wp_query qui répertorie les publications d'un type de publication personnalisé, triées par un champ personnalisé "temps".

J'aimerais regrouper cette liste par un autre champ personnalisé, "date", afin que chaque publication ayant le même champ personnalisé "date" soit répertoriée sous cette date. Je ne connais pas ces dates à l'avance.

La sortie serait comme:

Date x
- poste 3
- poste 6
- poste 8

Date y
- poste 1
- poste 4

Date z
- poste 2
- poste 5
- poste 7
- poste 9

Voici mon WP_Query actuel:

<?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

Une bonne solution consiste à aller d'abord chercher tous les articles triés par date, puis à les regrouper.

Lorsque vous indiquez que le champ personnalisé time est au format Y-m-d, vous pouvez donc trier correctement vos publications à l'aide de orderby => 'meta_value' (et non de meta_value_num, comme c'est le cas actuellement, qui convertit la valeur en un type numérique).

Ensuite, si vous souhaitez éditer un titre pour chaque date différente, vous pouvez enregistrer la dernière date affichée et l'afficher si la date (et modifier la date mémorisée) si la publication suivante diffère de cette date. Cela donnerait quelque chose de similaire à ceci:

$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