web-dev-qa-db-fra.com

Comment regrouper les articles de la boucle dans un particulier par auteur?

J'ai des liens allant aux pages de catégories sur un blog WordPress. Ces pages de catégories affichent tous les articles de cette catégorie et de ces sous-catégories. Je veux regrouper ces listes par les auteurs.

Je suppose qu'il est nécessaire de modifier category.php pour répertorier d’abord tous les auteurs ayant des publications dans cette catégorie, puis exécuter WP_Query plusieurs fois pour chaque auteur. La deuxième partie est correcte, mais je ne vois pas comment obtenir la liste des auteurs de ces publications uniquement dans cette catégorie.

1
aalaap

Je ne pense pas que vous ayez besoin d'obtenir la liste des auteurs dans une catégorie donnée ou d'utiliser un groupe d'individus WP_Query, il vous suffit de pour commander les publications en auteur et vérifiez quand l'auteur change.

Deux parties à cela. Une pour modifier la boucle sur les pages de catégories sur commande par auteur. Vous pouvez vous connecter à pre_get_posts pour le faire.

<?php
add_action('pre_get_posts', 'wpse56168_order_author');
/**
 * Change the order of posts only on the category pages.
 *
 * @param   WP_Query $q The current WP_Query object
 * @author  Christopher Davis <http://christopherdavis.me>
 * @return  void
 */
function wpse56168_order_author($q)
{
    if($q->is_main_query() && $q->is_category())
    {
        $q->set('orderby', 'author');
        $q->set('order', 'ASC'); // alphabetical, ascending
    }
}

Maintenant pour obtenir une liste des auteurs .

Étant donné que WP_Query extrait toutes les publications en même temps - il ne transfère pas les données en entrée - vous pouvez array_map les publications pour obtenir les ID d’auteur et créer votre liste. Parce que vous avez modifié l’ordre des messages ci-dessus, les auteurs doivent paraître en ordre. Envelopper cela dans une fonction pourrait être une bonne idée:

<?php
/**
 * Extract the authors from a WP_Query object.
 *
 * @param   WP_Query $q
 * @return  array An array of WP_User objects.
 */
function wpse56168_extract_authors(WP_Query $q)
{
    // this is PHP 5.3+, you'll have to use a named function with PHP < 5.3
    $authors = array_map(function($p) {
        return isset($p->post_author) ? $p->post_author : 0;
    }, $q->posts);

    return get_users(array(
        'include'   => array_unique($authors),
    ));
}

Ensuite, vous pouvez utiliser quelque chose comme ceci dans votre modèle category.php pour générer la liste.

<ul>
<?php foreach(wpse56168_extract_authors($wp_query) as $author): ?>
    <li><?php echo esc_html($author->display_name); ?></li>
<?php endforeach; ?>
</ul>

Le regroupement des publications par auteurs doit simplement être comparé à l'auteur des publications précédentes et à l'auteur des publications actuelles.

Exemple:

<?php
$old_author = 0;
while(have_posts()): the_post();
?>
    <?php if($post->post_author != $old_author): ?>
        <h2><?php the_author(); ?></h2>
    <?php endif; ?>

    // display post here

<?php
$old_author = $post->post_author;
endwhile;
2
chrisguitarguy

faire votre demande à l'ordre par auteur
exemple pour WP_Query

$query = new WP_Query( array ( 'orderby' => 'author') );

ou si vous utilisez query_posts

query_posts ( array ( 'orderby' => 'author') );
0
Gembel Intelek