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

8

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

Ich muss folgendes zeigen:

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

z.B

[Foto] Joe Bloggs (8)

Ich machte einen Anfang und ging diesen Weg:

<?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 im Blog registriert sind, und nicht diejenigen, die dazu beigetragen haben, sodass ich es mit Sicherheit nicht richtig mache.

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

Steakpi
quelle
Willst du etwas gestylt? Versuchen Sie dies wpsites.net/web-design/author-contributors-page-template
Brad Dalton

Antworten:

8

Sie müssen den whoParameter in einstellenget_users

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

BEARBEITEN

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

Ich habe jetzt keine Zeit zum Codieren, um Rugby zu schauen, aber hier ist der vollständige Code, der in den vierundzwanzig Jahren verwendet wurde, um Autoren und ihre Anzahl an Posts 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();
Pieter Goosen
quelle
Sie können auch einen Statusparameter codex.wordpress.org/Class_Reference/WP_Query#Status_Parameters
Brad Dalton
IIRC, das Benutzer anzeigt, die in der Lage sind zu posten, nicht Benutzer, die effektiv etwas gepostet haben.
gmazzap
Ich beziehe mich auf, wenn Beiträge veröffentlicht wurden if (! $ Post_count) {continue;
Brad Dalton
Pieter, ich denke ich kann die Leistung deiner Funktion verbessern, sieh dir meine Antwort an;)
gmazzap
count_many_users_posts()Die Funktion sollte aus Effizienzgründen verwendet werden, wenn für mehrere Benutzer gezählt wird.
Rarst
6

Wie Pieter Goosen betonte, gibt es in WordPress keine Standardmethode für diese Aufgabe. Es gibt das Argument whodafür, get_users()dass Benutzer zurückgegeben werden, die Beiträge verfassen können , nicht die Benutzer, die Beiträge veröffentlicht haben.

Sie können 'pre_user_query'jedoch eine JOINSQL-Klausel hinzufügen , um nur Benutzer mit mindestens einem Beitrag abzurufen.

Um ehrlich zu sein, wenn Sie Benutzer abfragen, die sie nach Anzahl der OUTER LEFT JOINBeiträge bestellen, wird der Join bereits von WordPress erstellt, aber mit a werden auch Benutzer ohne Beiträge zurückgegeben. Sie müssen also nur den OUTER LEFT JOINdurch a ersetzenINNER 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' );
gmazzap
quelle
Müssen Sie meine Blase platzen lassen, lol :-). Tolle Antwort, muss ich sagen. Ich habe nie in diese Richtung gedacht, um ehrlich zu sein. +1
Pieter Goosen
Das sind großartige Informationen! Danke für Ihre Hilfe. Ich habe gerade Ihre Lösung ausprobiert und das bringt mich auch in die Nähe, wo ich sein muss. :)
Steakpi
3

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

Übergeben Sie einen arrayder Beitragstypen, um die Ergebnisse an Benutzer zu filtern, die Beiträge in diesen Beitragstypen veröffentlicht haben. trueist 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

Michael Ecklund
quelle