Grupare WP_Query după categorie

27 dec. 2011, 07:57:18
Vizualizări: 14.8K
Voturi: 5

OK, iată configurația mea:

Tip de postare personalizat numit "issues" (pentru o revistă) Postări cu câmp meta personalizat care se potrivește cu ID-ul postării pentru numărul corespunzător.

Când sunt pe o pagină de postare individuală "issue", vreau să interoghez toate postările asociate și să le afișez grupate după categoria lor asociată. Am reușit să fac interogarea de postări, dar nu reușesc să înțeleg cum să fac gruparea pe categorii.

Iată interogarea mea:

   <?php
    global $post;

    // Listare postări după termenii unei taxonomii personalizate pentru orice tip de postare   
    $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; // sfârșitul buclei ?>
    <?php else : ?>
    <?php endif; // if have_posts() ?>
    </ul>
    <?php wp_reset_query(); ?>
0
Toate răspunsurile la întrebare 1
4

Ai putea să modifici WP_Query cu o comandă SQL pentru a le grupa, dar asta depășește nivelul meu actual de cunoștințe MySQL. În schimb, am obișnuit să fac acest lucru rulând un foreach pe taxonomia în sine folosind http://codex.wordpress.org/Function_Reference/get_categories.

Iată un exemplu de cod:

<?php
    global $post;

    $current = get_the_ID($post->ID);
    $cargs = array(
        'child_of'      => 0,
        'orderby'       => 'name',
        'order'         => 'ASC',
        'hide_empty'    => 1,
        'taxonomy'      => 'category', //schimbă aceasta la orice taxonomie
    );
    foreach (get_categories($cargs) as $tax) :
        // Listează postări după termenii pentru o taxonomie personalizată a oricărui tip de postare   
        $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; 
?>

Acest cod va parcurge fiecare categorie cu postări (hide_empty este setat pe true) și va face o interogare get_posts pentru aceasta (de asemenea, verifică dacă există postări înainte de a afișa orice).

Nu eram sigur ce antet dorești pentru a separa grupurile, așa că am folosit un h2 și am adăugat și un link la listare.

Am schimbat la get_posts pentru că am constatat că este mai eficient, deoarece nu suprascrie variabila globală $post (mai puține interogări la baza de date, utilizare redusă a wp_reset_query()).

27 dec. 2011 15:28:24
Comentarii

Aceasta este o metodă ineficientă de a face acest lucru, dacă ai multe categorii preluate, deoarece pentru fiecare categorie faci un apel get_posts separat, care interoghează baza de date de fiecare dată.

Maor Barazany Maor Barazany
6 oct. 2012 20:09:16

Deci, care este abordarea optimă @MaorBarazany?

lkraav lkraav
26 ian. 2013 04:02:27

Mulțumesc pentru acest răspuns, m-am tot chinuit să găsesc o modalitate de a grupa rezultatele pentru taxonomii...

Warface Warface
3 sept. 2013 17:38:57

Această soluție funcționează pentru mine. Cache-ul poate ajuta dacă performanța este slabă din cauza prea multor interogări.

squarecandy squarecandy
23 dec. 2016 02:20:02