WP_User_Query để loại trừ người dùng không có bài đăng


9

Tôi thấy rằng có thể sắp xếp một truy vấn người dùng theo số lượng bài đăng của mỗi người dùng, nhưng liệu có thể loại trừ người dùng không có bài đăng nào khỏi kết quả không? Trong lớp Wp_User_Query có một pre_user_queryhành động, nhưng các chuỗi truy vấn là một điểm yếu rất lớn, vì vậy tôi không chắc loại hành động lọc nào tôi muốn sử dụng ở đây.


Sẽ là ít thuế hơn nếu chỉ loại bỏ kết quả, những người dùng đó post_count== 0?
GhostToast

3
Tôi đã sẵn sàng để đóng nó như là một câu hỏi hoàn toàn sai lầm. WordPress thực hiện điều này tự động với get_posts_by_author_sqlchức năng tạo SQL cho get_authors()truy vấn. Người dùng phải có một bài đăng được công bố hoặc riêng tư để được đưa vào kết quả. #facepalm
helgatheviking

rất vui vì bạn đã tìm thấy câu trả lời
GhostToast

Tôi cũng vậy! Mặc dù không có tùy chọn để đóng câu hỏi vì lý do ngu ngốc. Cảm ơn cho chiming mặc dù. Tôi sẽ áp dụng lời khuyên của bạn vì tôi muốn lưu get_authors()kết quả dưới dạng tạm thời ... sau đó tôi có thể chỉ cần bỏ qua tác giả hiện tại mà không cần phải thực hiện truy vấn mỗi lần.
đạp xe

1
Câu hỏi này không phải là ngu ngốc, nó đã được nâng cấp, vui lòng cung cấp giải pháp của bạn như một câu trả lời vì nó có thể giúp đỡ người khác.
Wyck

Câu trả lời:


10

Vâng, tôi đã đưa ra 2 giải pháp.

Giải pháp 1 - vòng lặp foreach và xác minh từng người dùng

Công cụ này dựa trên giải pháp của @ GhostToast, nhưng với các chức năng WordPress được cập nhật

//new query with default args
$author_query = new WP_User_Query();

// Get the results
$authors = $author_query->get_results();

if( $authors ) {

    foreach( $authors as $author ) {

     if ( count_user_posts( $author->id ) >= 1 ) {

        echo $author->display_name . '</br>';
    }
}
} else { 
    echo "no users found"; 
}

Giải pháp 2 - pre_user_queryhành động quần lạ mắt

Đây là những gì tôi đã nghĩ đến khi tôi đăng câu hỏi của mình khi tôi tìm thấy pre_user_queryhành động trong WP_User_Querylớp. Nếu bạn truyền vào post_countnhư orderbytham số của mình thì một số truy vấn SQL ưa thích mà tôi không bao giờ có thể tự mình tìm ra để tham gia các bảng thích hợp với nhau. Vì vậy, những gì tôi đã làm là sao chép tuyên bố tham gia đó và thêm nó vào chính tôi. Điều này sẽ tốt hơn nếu tôi có thể kiểm tra sự hiện diện của nó trước khi thêm nó ... có lẽ tôi sẽ sử dụng một chuỗi khớp trong tương lai. Nhưng bây giờ vì tôi là người thiết lập truy vấn mà tôi biết nó không có ở đó và tôi vẫn chưa lo lắng về nó. Vì vậy, mã hóa ra như vậy:

function authors_with_posts( $query ) {

    if ( isset( $query->query_vars['query_id'] ) && 'authors_with_posts' == $query->query_vars['query_id'] ) {  
        $query->query_from = $query->query_from . ' LEFT OUTER JOIN (
                SELECT post_author, COUNT(*) as post_count
                FROM wp_posts
                WHERE post_type = "post" AND (post_status = "publish" OR post_status = "private")
                GROUP BY post_author
            ) p ON (wp_users.ID = p.post_author)';
        $query->query_where = $query->query_where . ' AND post_count  > 0 ';  
    } 
}
add_action('pre_user_query','authors_with_posts');

và sau đó sử dụng nó

$args = ( array( 'query_id' => 'authors_with_posts' ) );  
$author_query = new WP_User_Query( $args );

Ý tưởng cho một query_idtham số là từ Giới thiệu về WP_User_Class

Đó cũng chỉ là một tài liệu tham khảo rất tốt về WP_User_Query


1
Cái này thật đáng yêu. Bây giờ tất cả những gì chúng ta cần là một cách để điều chỉnh số trang phân trang thành danh sách được làm lại mới ...
Christine Cooper

Cuộc gọi tốt Không biết làm thế nào để làm điều đó.
xe đạp vào

tác giả-> id hiện là tác giả-> ID (thay đổi nhỏ nhưng id bị khấu hao)
raison

3

Kể từ 4.4, bạn chỉ cần sử dụng tham số `has_published_posts '.

Thí dụ:

$authors = get_transient('mytheme_all_authors');
if (empty($authors)){

    $user_args = array(
    'role__in'    => array('Author', 'Administrator', 'Contributor'),
    'orderby' => 'post_count',
    'order'   => 'DESC',
    'count_total'  => true,
    'has_published_posts' => array('post'),
    );

    $authors = new WP_User_Query( $user_args );
    set_transient('mytheme_all_authors', $authors, 1 * HOUR_IN_SECONDS );
}

$total= $authors->get_total();
$authors = $authors->results;
foreach ( $authors as $user) {
    // loop through your users....

has_published_postscó thể là true / false (hoặc null) hoặc một mảng các loại bài đăng (như trong ví dụ này).

Lưu ý: Tôi đang sử dụng tạm thời ở đây vì truy vấn cụ thể này có thể trở nên khá nặng tùy thuộc vào hệ thống nên việc lưu trữ nó để sử dụng trong tương lai là điều hợp lý.


0

Gửi như câu trả lời cho việc đóng cửa:

   $all_members = get_users();
      foreach($all_members as $member){
        $post_count = count_user_posts($member->ID);
        if(empty($post_count)) {
            $bad_writers[] = $member->ID;
            continue;
        } else {
            // do something;
        }
    }

Đó có phải là cách giải quyết cần thiết để có được người dùng của tất cả các vai trò? Tôi thấy rằng để trống đối số đó sẽ không trả lại tất cả người dùng trong nhiều trang.
xe đạp

get_users_with_role()không phải là một chức năng WordPress hoặc tôi đã nhìn vào máy tính của tôi quá lâu?
xe đạp

1
Nó không tồn tại. Tìm kiếm 966 tệp cho "get_users_with_role": 0 matches across 0 files. Cũng get_usernumpostsđược khấu hao, sử dụngcount_user_posts()
Wyck

argh lời xin lỗi của tôi. đây là một chức năng tôi đã viết cho một trang web dựa trên thành viên. bạn chỉ có thể sử dụng get_users () và truyền bất kỳ tham số nào bạn muốn cho nó: codex.wordpress.org/Function_Reference/get_users
GhostToast

@GhostToast Vui lòng chỉ cập nhật câu trả lời của bạn.
kaiser
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.