Come visualizzare un elenco di utenti che hanno effettuato almeno 1 post?


8

Quello che vorrei fare è avere un elenco di utenti che hanno contribuito ad almeno un post.

Devo mostrare quanto segue:

[Foto dell'utente] | [Nome utente] | [Conteggio post utente]

per esempio

[foto] Joe Bloggs (8)

Ho iniziato e ho seguito questo percorso:

<?php
   $blogusers = get_users( 'orderby=post_count' );
      foreach ( $blogusers as $user ) {
      echo '<li>' . esc_html( $user->display_name ) . '</li>';
   }
?>

Tuttavia, questo sembra solo restituire tutti gli utenti registrati al blog piuttosto che quelli che hanno contribuito, quindi certamente non lo sto facendo correttamente.

Sono nuovo di WordPress e PHP, quindi tutto l'aiuto sarebbe apprezzato.


Vuoi qualcosa di stilizzato? Prova questo wpsites.net/web-design/author-contributors-page-template
Brad Dalton

Risposte:


8

È necessario impostare il whoparametro inget_users

<?php
   $blogusers = get_users( 'orderby=post_count&who=authors' );
      foreach ( $blogusers as $user ) {
      echo '<li>' . esc_html( $user->display_name ) . '</li>';
   }
?>

MODIFICARE

Sembra che stavo rispondendo velocemente. Il codice nella tua domanda e nella mia risposta è l'inizio di ciò che vuoi ottenere.

Non ho tempo di programmare ora, fuori per guardare il rugby, ma ecco il codice completo usato nei ventiquattro quattordici per mostrare gli autori e il loro conteggio dei post. Spero che sia di aiuto

function twentyfourteen_list_authors() {
    $contributor_ids = get_users( array(
        'fields'  => 'ID',
        'orderby' => 'post_count',
        'order'   => 'DESC',
        'who'     => 'authors',
    ) );

    foreach ( $contributor_ids as $contributor_id ) :
        $post_count = count_user_posts( $contributor_id );

        // Move on if user has not published a post (yet).
        if ( ! $post_count ) {
            continue;
        }
    ?>

    <div class="contributor">
        <div class="contributor-info">
            <div class="contributor-avatar"><?php echo get_avatar( $contributor_id, 132 ); ?></div>
            <div class="contributor-summary">
                <h2 class="contributor-name"><?php echo get_the_author_meta( 'display_name', $contributor_id ); ?></h2>
                <p class="contributor-bio">
                    <?php echo get_the_author_meta( 'description', $contributor_id ); ?>
                </p>
                <a class="button contributor-posts-link" href="<?php echo esc_url( get_author_posts_url( $contributor_id ) ); ?>">
                    <?php printf( _n( '%d Article', '%d Articles', $post_count, 'twentyfourteen' ), $post_count ); ?>
                </a>
            </div><!-- .contributor-summary -->
        </div><!-- .contributor-info -->
    </div><!-- .contributor -->

    <?php
    endforeach;
}

Basta chiamarlo nei file modello come

twentyfourteen_list_authors();

È inoltre possibile aggiungere un parametro di stato codex.wordpress.org/Class_Reference/WP_Query#Status_Parameters
Brad Dalton,

IIRC che mostra gli utenti che hanno la capacità di pubblicare, non l'utente che ha effettivamente pubblicato qualcosa.
gmazzap

Mi riferisco a se hanno pubblicato post if (! $ Post_count) {continua;
Brad Dalton,

Pieter, penso di poter migliorare le prestazioni della tua funzione, guarda la mia risposta;)
gmazzap

count_many_users_posts()La funzione deve essere utilizzata per l'efficienza, quando si conteggia un set di più utenti.
Rarst

6

In WordPress non esiste un modo predefinito per eseguire questa attività, come ha sottolineato Pieter Goosen , esiste l'argomento whoper get_users()cui vengono restituiti gli utenti che possono pubblicare, non gli utenti che hanno pubblicato.

Tuttavia, è possibile utilizzare 'pre_user_query'per aggiungere una JOINclausola SQL per ottenere solo utenti con almeno un post.

Per essere onesti, quando si esegue una query degli utenti li ordinano dal numero dei tuoi messaggi, il join è già creato da WordPress, ma utilizzando una OUTER LEFT JOIN, quindi, anche gli utenti con messaggi vengono restituiti, quindi l'unica cosa che serve è di sostituire l' OUTER LEFT JOINunaINNER JOIN

function filter_users_have_posted( $user_query ) {
   $user_query->query_from = str_replace( 'LEFT OUTER', 'INNER', $user_query->query_from );
   remove_action( current_filter(), __FUNCTION__ );
}

add_action( 'pre_user_query', 'filter_users_have_posted' );

$blogusers = get_users( 'orderby=post_count&order=desc' );

Devi scoppiare la mia bolla, lol :-). Ottima risposta, devo dire. Non ho mai pensato in quella direzione per essere onesti. +1
Pieter Goosen

Questa è un'ottima informazione da sapere! Grazie per l'aiuto. Ho appena provato la tua soluzione e anche questo mi avvicina a dove devo essere. :)
steakpi

3

Dalla versione 4.3.0, ora è possibile specificare il parametro has_published_postsper la get_users();chiamata di funzione.

Passa un tipo arraydi post per filtrare i risultati agli utenti che hanno pubblicato post in tali tipi di post. trueè un alias per tutti i tipi di post pubblici.


Esempio

if ( $users = get_users( array(
    'orderby'             => 'nicename',
    'order'               => 'ASC',
    'has_published_posts' => array( 'post' ),
    'blog_id'             => absint( get_current_blog_id() )
) ) ) {
    print_r( $users );
}

risorse

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.