it-swarm.com.de

Gruppiere WP_Query nach Kategorie

OK, hier ist mein Setup:

Benutzerdefinierter Beitragstyp "Issues" (für ein Magazin) Beiträge mit benutzerdefiniertem Metafeld, das mit der Beitrags-ID der entsprechenden Ausgabe übereinstimmt.

Wenn ich mich auf einer einzelnen "Issue" -Post-Seite befinde, möchte ich alle verwandten Posts abfragen und sie nach ihrer zugeordneten Kategorie gruppiert anzeigen. Ich habe die Post-Abfrage funktioniert, ich kann einfach nicht meinen Kopf über die Kategoriegruppierung bekommen.

hier ist meine Frage

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

Sie könnten versuchen, die WP_Query mit einem SQL-Befehl zu gruppieren, aber das geht ein bisschen über mein aktuelles MySQL hinaus. Ich habe es jedoch immer getan, indem ich foreach für die Taxonomie selbst mit diesem http: // Codex ausgeführt habe. wordpress.org/Function_Reference/get_categories

Hier ist ein Beispielcode:

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

Dies durchläuft jede Kategorie mit Beiträgen (hide_empty ist auf true gesetzt) ​​und führt dazu ein get_posts aus (und prüft auch, ob Beiträge vorhanden sind, bevor etwas ausgegeben wird).

War nicht sicher, was Sie für eine Überschrift wollten, um die Gruppierungen zu trennen, also benutzte ich eine h2 und fügte der Auflistung auch einen Link hinzu.

Ich habe es in get_posts geändert, weil es meiner Meinung nach effizienter ist, da es die globale $ post-Variable nicht überschreibt (weniger Datenbankaufrufe, weniger Verwendung von wp_reset_query ()).

7
CookiesForDevo