Bagaimana cara menampilkan daftar pengguna yang telah membuat setidaknya 1 posting?

8

Yang ingin saya lakukan adalah memiliki daftar pengguna yang telah berkontribusi setidaknya satu posting.

Saya perlu menunjukkan yang berikut:

[Foto pengguna] | [Nama Pengguna] | [Jumlah posting pengguna]

misalnya

[foto] Joe Bloggs (8)

Saya memulai dan melewati rute ini:

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

Namun, ini sepertinya mengembalikan semua pengguna yang terdaftar ke blog daripada mereka yang telah berkontribusi jadi saya tentu tidak melakukannya dengan benar.

Saya baru mengenal wordpress dan PHP sehingga semua bantuan akan dihargai.

steakpi
sumber
Ingin sesuatu ditata? Coba ini wpsites.net/web-design/author-contributors-page-template
Brad Dalton

Jawaban:

8

Anda perlu mengatur whoparameterget_users

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

EDIT

Sepertinya saya harus menjawab cepat. Kode dalam pertanyaan Anda dan jawaban saya adalah awal dari apa yang ingin Anda capai.

Saya tidak punya waktu untuk kode sekarang, untuk menonton rugby, tapi di sini adalah kode lengkap yang digunakan dalam dua belas empat belas untuk menampilkan penulis dan jumlah posting mereka. Semoga ini membantu

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

Sebut saja dalam file template Anda sebagai

twentyfourteen_list_authors();
Pieter Goosen
sumber
Anda juga dapat menambahkan parameter status codex.wordpress.org/Class_Reference/WP_Query#Status_Parameters
Brad Dalton
IIRC yang menampilkan pengguna yang memiliki kemampuan untuk mengirim, bukan pengguna yang telah memposting sesuatu secara efektif.
gmazzap
Saya merujuk jika telah mempublikasikan posting jika (! $ Post_count) {lanjutkan;
Brad Dalton
Pieter, saya pikir saya dapat meningkatkan kinerja fungsi Anda, lihat jawaban saya;)
gmazzap
count_many_users_posts()fungsi harus digunakan untuk efisiensi, saat menghitung untuk beberapa pengguna.
Rarst
6

Tidak ada cara default di WordPress untuk melakukan tugas ini, seperti yang Pieter Goosen tunjukkan, ada argumen whountuk get_users()yang mengembalikan pengguna yang dapat memposting, bukan pengguna yang telah memposting.

Namun, Anda dapat menggunakan 'pre_user_query'untuk menambahkan JOINklausa SQL untuk hanya mendapatkan pengguna yang memiliki setidaknya satu posting.

Sejujurnya, ketika Anda meminta pengguna memesannya dengan jumlah posting, bergabung sudah dibuat oleh WordPress, tetapi menggunakan OUTER LEFT JOIN, sehingga bahkan pengguna tanpa posting dikembalikan, jadi satu-satunya hal yang Anda butuhkan adalah mengganti OUTER LEFT JOINkeINNER 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
sumber
Haruskah Anda memecahkan gelembung saya, lol :-). Jawaban yang bagus, harus mengatakan. Tidak pernah berpikir ke arah itu jujur. +1
Pieter Goosen
Itulah informasi hebat untuk diketahui! Terima kasih atas bantuan Anda. Baru saja mencoba solusi Anda dan itu juga membuat saya dekat dengan tempat yang saya butuhkan. :)
steakpi
3

Sejak versi 4.3.0, Anda sekarang dapat menentukan parameter has_published_postsuntuk get_users();panggilan fungsi.

Berikan beberapa arraytipe posting untuk memfilter hasil kepada pengguna yang telah mempublikasikan posting dalam tipe posting tersebut. trueadalah alias untuk semua jenis posting publik.


Contoh

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

Sumber daya

Michael Ecklund
sumber