Làm cách nào để hiển thị danh sách người dùng đã thực hiện ít nhất 1 bài?


8

Những gì tôi muốn làm là có một danh sách người dùng đã đóng góp ít nhất một bài đăng.

Tôi cần thể hiện như sau:

[Ảnh người dùng] | [Tên người dùng] | [Số lượng người dùng đăng]

ví dụ

[ảnh] Joe Bloggs (8)

Tôi đã bắt đầu và đi xuống tuyến đường này:

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

Tuy nhiên, điều này dường như chỉ trả lại tất cả người dùng đã đăng ký vào blog chứ không phải những người đã đóng góp nên tôi chắc chắn không làm đúng.

Tôi chưa quen với wordpress và PHP nên mọi sự trợ giúp đều được đánh giá cao.


Bạn muốn một cái gì đó theo kiểu? Hãy dùng thử wpsites.net/web-design/author-contologists-page-template
Brad Dalton

Câu trả lời:


8

Bạn cần đặt whotham số trongget_users

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

BIÊN TẬP

Có vẻ như tôi đã nhanh chóng trả lời. Mã trong câu hỏi của bạn và trong câu trả lời của tôi là sự khởi đầu cho những gì bạn muốn đạt được.

Bây giờ tôi không có thời gian để viết mã, để xem bóng bầu dục, nhưng đây là mã hoàn chỉnh được sử dụng trong hai mươi mười bốn để hiển thị các tác giả và số lượng bài đăng của họ. Hi vọng điêu nay co ich

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

Chỉ cần gọi nó trong các tệp mẫu của bạn là

twentyfourteen_list_authors();

Bạn cũng có thể thêm một tham số trạng thái codex.wordpress.org/Class_Reference/WP_Query#Status_Parameter
Brad Dalton

IIRC hiển thị người dùng có khả năng đăng bài, không phải người dùng đã đăng một cách hiệu quả.
gmazzap

Tôi đang đề cập đến nếu đã xuất bản bài đăng if (! $ Post_count) {continue;
Brad Dalton

Pieter, tôi nghĩ rằng tôi có thể cải thiện hiệu suất của chức năng của bạn, hãy xem câu trả lời của tôi;)
gmazzap

count_many_users_posts()chức năng nên được sử dụng cho hiệu quả, khi tính cho một tập hợp nhiều người dùng.
Rarst

6

Không có cách nào mặc định trong WordPress để làm nhiệm vụ này, như Pieter Goosen chỉ ra, tồn tại tranh luận whocho get_users()rằng người sử dụng lợi nhuận đó có thể gửi, không phải là người dùng đã đăng.

Tuy nhiên, bạn có thể sử dụng 'pre_user_query'để thêm JOINmệnh đề SQL để chỉ nhận người dùng có ít nhất một bài đăng.

Thành thật mà nói, khi bạn truy vấn người dùng ra lệnh cho họ qua đường bưu điện đếm, JOIN đã được tạo ra bởi WordPress, nhưng sử dụng một OUTER LEFT JOIN, vì vậy ngay cả người dùng không có bài viết được trả về, do đó, điều duy nhất bạn cần là để thay thế OUTER LEFT JOINcho mộtINNER 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' );

Bạn phải vỡ bong bóng của tôi, lol :-). Câu trả lời tuyệt vời, phải nói. Không bao giờ nghĩ theo hướng đó là trung thực. +1
Pieter Goosen

Đó là thông tin tuyệt vời để biết! Cảm ơn bạn đã giúp đỡ. Chỉ cần thử giải pháp của bạn và điều đó cũng đưa tôi đến gần nơi tôi cần. :)
bít tết

3

Kể từ phiên bản 4.3.0, bây giờ bạn có thể chỉ định tham số has_published_postscho lệnh get_users();gọi hàm.

Truyền một arrayloại bài đăng để lọc kết quả cho người dùng đã xuất bản bài đăng trong các loại bài đăng đó. truelà một bí danh cho tất cả các loại bài đăng công khai.


Thí dụ

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

Tài nguyên

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.