WP_User_Query para excluir usuários sem postagens

9

Vejo que é possível classificar uma consulta de usuário pelo número de postagens que cada usuário possui, mas é possível excluir usuários com zero postagens do resultado? Na classe Wp_User_Query, há uma pre_user_queryação, mas as cadeias de consulta são um grande ponto fraco, portanto, não tenho certeza de que tipo de ação de filtro eu gostaria de usar aqui.

helgatheviking
fonte
Seria menos cansativo simplesmente descartar dos resultados aqueles usuários que post_count== 0?
GhostToast
3
Eu estava me preparando para encerrar isso como uma pergunta totalmente idiota. O WordPress faz isso automaticamente com a get_posts_by_author_sqlfunção que gera o SQL para a get_authors()consulta. Os usuários devem ter uma publicação publicada ou privada para serem incluídos nos resultados. #facepalm
helgatheviking
legal feliz que você encontrou a resposta
GhostToast
Eu também! Embora não haja opção para encerrar a questão por razões de estupidez. Obrigado por comentar. Vou aplicar o seu conselho, porque quero salvar o get_authors()resultado como transitório ... então posso simplesmente pular o autor atual sem precisar fazer uma consulta todas as vezes.
precisa saber é o seguinte
11
Essas perguntas não são estúpidas, foram aprovadas, forneça sua solução como resposta, pois ela pode ajudar outras pessoas.
21712 Wyck

Respostas:

10

Bem, eu vim com 2 soluções.

Solução 1 - foreach loop e verifique cada usuário

Este é baseado na solução do @ GhostToast, mas com funções atualizadas do 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"; 
}

Solução 2 - pre_user_queryação de calças extravagantes

Era isso que eu pensava quando postei minha pergunta quando encontrei a pre_user_queryação na WP_User_Queryclasse. Se você passar post_countcomo seu orderbyparâmetro, algumas consultas SQL sofisticadas que eu nunca teria descoberto por conta própria juntam as tabelas apropriadas. Então, o que eu fiz foi copiar essa declaração de junção e adicioná-la à minha. Seria melhor se eu pudesse verificar sua presença antes de adicioná-la ... talvez eu use uma correspondência de string no futuro. Mas, por enquanto, já que eu estou configurando a consulta, sei que ela não está lá e ainda não vou me preocupar com isso. Portanto, o código ficou assim:

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

e depois usá-lo

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

A ideia para um query_idparâmetro é de Introdução ao WP_User_Class

O que também é apenas uma referência muito boa sobre WP_User_Query

helgatheviking
fonte
11
Isso é adorável. Agora, tudo o que precisamos é de uma maneira de ajustar a contagem de páginas de paginação para a nova lista reformulada ...
Christine Cooper
Boa decisão. Não sei como fazer isso.
helgatheviking
author-> id agora é author-> ID (pequena alteração, mas o id é depreciado)
raison
3

Desde o 4.4, você pode simplesmente usar o parâmetro `has_published_posts '.

Exemplo:

$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_postspode ser verdadeiro / falso (ou nulo) ou uma matriz de tipos de postagem (como neste exemplo).

Nota: Estou usando transientes aqui porque esta consulta específica pode ficar bastante pesada, dependendo do sistema, por isso faz sentido armazená-la para usos futuros.

pixeline
fonte
0

Enviando como resposta para encerramento:

   $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;
        }
    }
GhostToast
fonte
Essa é a solução alternativa necessária para obter usuários de todas as funções? Estou descobrindo que deixar esse argumento em branco não está retornando todos os usuários no multisite.
helgatheviking
get_users_with_role()não é uma função do WordPress ou estou olhando meu computador há muito tempo?
helgatheviking
11
Não existe. Pesquisando 966 arquivos "get_users_with_role": 0 matches across 0 files. Também get_usernumpostsé depreciado, usecount_user_posts()
Wyck
argh! me desculpe. essa foi uma função que escrevi para um site baseado em membros. você pode simplesmente usar get_users () e passar os parâmetros que desejar: codex.wordpress.org/Function_Reference/get_users #
GhostToast
@GhostToast Por favor, atualize sua resposta.
Kaiser