게시물이없는 사용자를 제외하는 WP_User_Query


9

각 사용자의 게시물 수에 따라 사용자 검색어를 정렬 할 수 있지만 게시물에서 게시물이 0 인 사용자를 결과에서 제외 할 수 있습니까? Wp_User_Query 클래스에는 pre_user_query동작이 있지만 쿼리 문자열은 큰 약점이므로 여기서 어떤 필터 동작을 사용하고 싶은지 잘 모르겠습니다.


post_count== 0 인 사용자를 단순히 결과에서 버리는 것이 과세되지 않습니까?
GhostToast

3
나는 이것을 완전히 도덕적 인 질문으로 막을 준비를하고있었습니다. WordPress는 쿼리에 get_posts_by_author_sql대한 SQL을 생성하는 기능 으로이를 자동으로 수행 get_authors()합니다. 결과에 포함하려면 게시 된 게시물 또는 개인 게시물이 있어야합니다. #facepalm
helgatheviking

당신이 대답을 발견 멋진 기뻐
GhostToast

나도! 어리석은 이유로 질문을 닫을 수있는 옵션은 없지만. 그래도 chiming 주셔서 감사합니다. get_authors()결과를 일시적으로 저장하고 싶기 때문에 조언을 적용 할 것입니다 . 그러면 매번 쿼리를 수행 할 필요없이 현재 저자를 건너 뛸 수 있습니다.
helgatheviking

1
이 질문은 어리석지 않습니다. 공감대입니다. 다른 사람을 도울 수있는 해결책으로 솔루션을 제공하십시오.
Wyck

답변:


10

글쎄, 나는 2 가지 해결책을 생각해 냈습니다.

해결 방법 1-foreach 루프 및 각 사용자 확인

이것은 @GhostToast의 솔루션을 기반으로하지만 업데이트 된 WordPress 기능을 사용합니다.

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

해결 방법 2-팬시 팬츠 pre_user_query액션

이것은 수업 에서 pre_user_query행동을 찾은 후에 질문을 올렸을 때 생각했던 것 WP_User_Query입니다. 매개 변수 post_count로 전달하면 orderby스스로 알아 내지 못했던 멋진 SQL 쿼리가 적절한 테이블을 함께 조인합니다. 그래서 내가 한 일은 그 조인 진술서를 복사하여 내 자신에 추가하는 것이 었습니다. 추가하기 전에 먼저 존재 여부를 확인할 수 있다면 더 좋을 것입니다 ... 미래에 문자열 일치를 사용할 것입니다. 그러나 지금은 쿼리를 설정하는 사람이므로 쿼리가 없다는 것을 알고 아직 걱정하지 않습니다. 따라서 코드는 다음과 같이 나타났습니다.

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

그런 다음 사용

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

query_id매개 변수에 대한 아이디어는 WP_User_Class 소개입니다.

어느 쪽도 아주 좋은 참고 자료입니다 WP_User_Query


1
사랑 스럽습니다. 이제 우리가 필요한 것은 페이지 매김 수를 새로운 재 작업 목록으로 조정하는 방법입니다.
Christine Cooper

잘 했어 그렇게하는 방법을 모른다.
helgatheviking '

author-> id는 이제 author-> ID입니다 (작은 변경이지만 id는 감가 상각됩니다)
raison

3

4.4부터`has_published_posts '매개 변수를 사용하면됩니다.

예:

$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_poststrue / false (또는 null)이거나 게시물 유형의 배열 일 수 있습니다 (이 예와 같이).

참고 :이 특정 쿼리는 시스템에 따라 상당히 무거워 추후 사용을 위해 저장하는 것이 합리적이므로 여기서는 과도를 사용하고 있습니다.


0

폐쇄에 대한 답변으로 제출 :

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

모든 역할의 사용자를 가져 오려면이 해결 방법이 필요합니까? 해당 인수를 비워 두어 다중 사이트의 모든 사용자를 반환하지는 않습니다.
helgatheviking

get_users_with_role()기능이 아니거나 컴퓨터를 너무 오래보고 있습니까?
helgatheviking

1
존재하지 않습니다. 에 대한 966 파일 검색 중 "get_users_with_role": 0 matches across 0 files. 또한 get_usernumposts감가 상각됩니다.count_user_posts()
Wyck

아아! 내 사과 이것은 회원 기반 사이트를 위해 작성한 기능이었습니다. 당신은 단지 get_users ()를 사용하고 당신이 원하는대로 매개 변수를 전달할 수 있습니다 codex.wordpress.org/Function_Reference/get_users
GhostToast

@GhostToast 답을 업데이트하십시오.
카이저
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.