web-dev-qa-db-fra.com

Groupez WP_Query par catégorie

OK, voici ma configuration:

Type de message personnalisé appelé "numéros" (pour un magazine) Articles avec méta-champs personnalisé correspondant à l'ID de message du numéro correspondant.

Lorsque je suis sur une seule page de publication "numéro", je souhaite interroger toutes les publications associées et les afficher regroupées par catégorie. Le post-requête fonctionne, je n'arrive pas à comprendre le groupe de catégories.

voici ma requête

   <?php
    global $post;

    // List posts by the terms for a custom taxonomy of any post type   
    $current    = get_the_ID($post->ID);
    $args = array(
        'post_type'         => 'post',
        'post_status'       => 'publish',
        'posts_per_page'    => -1,
        'orderby'           => 'title',
        'meta_key'          => '_rkv_issue_select',
        'meta_value'        => $current
    );

    $issue_cats = new WP_Query($args);

    if( $issue_cats->have_posts() ) :
    ?>
    <ul>
    <?php while ( $issue_cats->have_posts() ) : $issue_cats->the_post(); ?>

        <li><?php the_title(); ?></li>
    <?php endwhile; // end of loop ?>
    <?php else : ?>
    <?php endif; // if have_posts() ?>
    </ul>
    <?php wp_reset_query(); ?>
5
Norcross

Vous pourriez envisager de modifier WP_Query avec une commande SQL pour les regrouper, mais cela dépasse un peu ma version actuelle de MySQL. Cependant, je l’ai toujours fait en exécutant un foreach sur la taxonomie elle-même avec ce code http: //. wordpress.org/Function_Reference/get_categories

Voici un exemple de code:

<?php
    global $post;

    $current = get_the_ID($post->ID);
    $cargs = array(
        'child_of'      => 0,
        'orderby'       => 'name',
        'order'         => 'ASC',
        'hide_empty'    => 1,
        'taxonomy'      => 'category', //change this to any taxonomy
    );
    foreach (get_categories($cargs) as $tax) :
        // List posts by the terms for a custom taxonomy of any post type   
        $args = array(
            'post_type'         => 'post',
            'post_status'       => 'publish',
            'posts_per_page'    => -1,
            'orderby'           => 'title',
            'meta_key'          => '_rkv_issue_select',
            'meta_value'        => $current,
            'tax_query' => array(
                array(
                    'taxonomy'  => 'category',
                    'field'     => 'slug',
                    'terms'     => $tax->slug
                )
            )
        );
        if (get_posts($args)) :
    ?>
        <h2><?php echo $tax->name; ?></h2>
        <ul>
            <?php foreach(get_posts($args) as $p) : ?>
                <li><a href="<?php echo get_permalink($p); ?>"><?php echo $p->post_title; ?></a></li>
            <?php endforeach; ?>
        </ul>
    <?php 
        endif;
    endforeach; 
?>

Cela va parcourir toutes les catégories avec posts (hide_empty est défini sur true) et effectue un get_posts sur celle-ci (et vérifie également qu'il a bien été posté avant de rien afficher).

Vous ne saviez pas exactement ce que vous vouliez pour un en-tête séparant les groupements; j'ai donc utilisé un h2 et ajouté un lien vers la liste.

Je l'ai changée en get_posts car je l'ai trouvée plus efficace, car elle ne remplace pas la variable globale $ post (moins d'appels à la base de données, moins d'utilisation de wp_reset_query ()).

7
CookiesForDevo