web-dev-qa-db-fra.com

Requête pour renvoyer au maximum une publication par auteur

Nous introduisons une zone "auteur vedette" sur notre site et aimerions afficher les articles les plus récents d'un groupe sélectionné d'auteurs. Cependant, nous souhaitons afficher au maximum un message par auteur. Donc, un auteur aurait pu potentiellement poster 5 fois depuis qu'un autre auteur avait posté, mais indépendamment d'un seul de leurs posts devrait apparaître. Actuellement, c'est le code que j'ai:

<?php
$args = array(
'showposts' => 5,
'author' => "6800,3845,1720,7045,4949"
);

$the_query = new WP_Query( $args );

while ( $the_query->have_posts() ) : $the_query->the_post(); 

?>

// DISPLAYING STUFF

<?php endwhile; wp_reset_query(); ?>

Une solution potentielle que j'ai envisagée consiste à interroger plus de publications et à configurer un tableau, puis à vérifier le tableau à chaque fois pour voir si un auteur y est déjà. S'ils le sont, cela continuera à la rangée suivante. Mais un problème évident avec cela serait que je risque de devoir éventuellement retirer 100 messages si un "auteur-vedette" en particulier n’avait pas écrit depuis un moment.

Je suis encore relativement novice en PHP/MySQL et une solution me tient sans doute en face. Apprécier toute aide.

3
Peter Willis III

Vous devez GROUP BY l'ID de l'auteur, ce qui nécessitera un filtre sur posts_groupby . La page Codex pour ce filtre est inexistante mais elle fonctionne comme posts_join . Quelque chose comme...

function filter_authors($groupby) {
  global $wpdb;
  $groupby = " {$wpdb->posts}.post_author";
 return $groupby;
}
add_filter('posts_groupby','filter_authors');

$args = array(
 'showposts' => 3,
 'author' => "1,2,3"
);

$the_query = new WP_Query( $args );

while ( $the_query->have_posts() ) : $the_query->the_post();
 echo $post->post_title.' :: '.$post->post_author."<br/>";
endwhile;

Utilisez vos propres valeurs dans $args bien sûr.

cela affectera toute autre requête sur la page qui s'exécute après ce bloc de code. Vous voudrez peut-être supprimer le filtre après avoir terminé.

remove_filter('posts_groupby','filter_authors');
5
s_ha_dum

Une autre approche pourrait consister à utiliser une fonction qui parcourt get_posts et affiche le résultat.

Cochez cette question: Quand devriez-vous utiliser WP_Query vs query_posts () vs get_posts ()?

// function located in the theme's functions.php
function wpse_78117_print_authors_last_post() 
{
    $user_ids = array( '1', '2' );
    foreach( $user_ids as $user )
    {
        $args = array( 
                'post_type'     => 'post',
                'numberposts'   => 1,
                'author'        => $user
            ); 

        // as we are getting only 1 post, extract it from the returned array
        $user_post = array_shift( get_posts( $args ) );

        // similar
        $nick = array_shift( get_user_meta( $user, 'nickname' ) );

        // custom output, $user_post contains all the post normal data
        echo $user_post->post_title . ', by: ' . $nick;
    }
}

Et utilisez-le dans n’importe quel modèle de thème:
<?php wpse_78117_print_authors_last_post(); ?>.

3
brasofilo

J'ai eu ce problème pour ne vouloir qu'un post par auteur à mettre dans un curseur, et je l'ai résolu comme ceci:

$query_args = array('post_type' => 'post');
$query = new WP_Query($query_args);
$author_ids = array(); // Array of author id's to check before executing 
if ($query->have_posts()) : $query->the_post();
  if (!in_array(get_the_author_meta('ID'), $author_ids)) {
    // DO YOUR STUFF
    // Afterwards, add that id to our array so we don't get another one
    array_Push($author_ids, get_the_author_meta('ID'));
  }
endif;
0
Zachary