it-swarm.com.de

Wie zeige ich eine Liste der Benutzer an, die mindestens einen Beitrag verfasst haben?

Was ich tun möchte, ist eine Liste von Benutzern, die mindestens einen Beitrag beigetragen haben.

Ich muss folgendes zeigen:

[Benutzerfoto] | [Benutzername] | [Anzahl der Benutzerbeiträge]

z.B.

[Foto] Joe Bloggs (8)

Ich habe angefangen und bin diesen Weg gegangen:

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

Dies scheint jedoch nur alle Benutzer zurückzugeben, die für das Blog registriert sind, und nicht diejenigen, die einen Beitrag geleistet haben, sodass ich es mit Sicherheit nicht richtig mache.

Ich bin neu in WordPress und PHP, daher wäre jede Hilfe willkommen.

8
steakpi

Sie müssen den Parameter who in get_users einstellen.

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

EDIT

Scheint, als hätte ich zu schnell geantwortet. Der Code in Ihrer Frage und in meiner Antwort ist der Beginn dessen, was Sie erreichen möchten.

Ich habe jetzt keine Zeit, Code zu schreiben, um Rugby zu schauen, aber hier ist der vollständige Code, der in den vierundzwanzig Jahren verwendet wurde, um Autoren und ihre Beitragsanzahl anzuzeigen. Hoffe das hilft

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

Nennen Sie es einfach in Ihren Vorlagendateien als

twentyfourteen_list_authors();
8
Pieter Goosen

Es gibt in WordPress keine Standardmethode, um diese Aufgabe auszuführen. Wie Pieter Goosen hervorhob, gibt es das Argument who für get_users(), das Benutzer zurückgibt, die können posten, nicht die Benutzer, die haben gebucht.

Sie können jedoch 'pre_user_query' verwenden, um eine JOIN-SQL-Klausel hinzuzufügen, mit der nur Benutzer abgerufen werden, die über mindestens einen Beitrag verfügen.

Um ehrlich zu sein, wenn Sie Benutzer abfragen, die sie nach Anzahl der Posts bestellen, wird der Join bereits von WordPress erstellt, jedoch mit einem OUTER LEFT JOIN, sodass auch Benutzer ohne Posts zurückgegeben werden. Sie müssen also nur den OUTER LEFT JOIN durch einen INNER JOIN ersetzen.

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' );
6
gmazzap

Seit der Version 4.3.0 können Sie den Parameter has_published_posts für den Funktionsaufruf get_users(); angeben.

Übergeben Sie eine array von Beitragstypen, um die Ergebnisse an Benutzer zu filtern, die Beiträge in diesen Beitragstypen veröffentlicht haben. true ist ein Alias ​​für alle öffentlichen Beitragstypen.


Beispiel

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

Ressourcen

2
Michael Ecklund