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 de cada usuário, mas é possível excluir usuários com zero postagens do resultado? Na classe Wp_User_Query, há uma ação pre_user_query , mas as strings de consulta são um grande ponto fraco, por isso não tenho certeza do tipo de ação de filtro que gostaria de usar aqui.

    
por helgatheviking 19.12.2012 / 18:07

3 respostas

10

Bem, eu criei duas soluções.

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

Este é baseado na solução @ 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 - calças extravagantes pre_user_query action

Isso é o que eu estava pensando quando postei minha pergunta depois que encontrei a ação pre_user_query na classe WP_User_Query . Se você passar post_count como seu parâmetro orderby , algumas consultas SQL sofisticadas que eu nunca teria descoberto sozinhas juntarão as tabelas apropriadas juntas. Então, o que eu fiz foi copiar essa instrução de associação e adicioná-la à minha. Isso 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 desde que eu sou o único a configurar a consulta eu sei que não está lá e eu não vou me preocupar com isso ainda. Então o código acabou 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 o parâmetro query_id é de Uma Introdução à WP_User_Class

Que também é apenas uma referência muito boa em WP_User_Query

    
por helgatheviking 20.12.2012 / 01:36
2

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

Observação: estou usando transientes aqui porque essa consulta específica pode ficar muito pesada, dependendo do sistema, portanto, faz sentido armazená-la para usos futuros.

    
por pixeline 07.07.2016 / 01:48
0

Enviando como resposta para o 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;
        }
    }
    
por GhostToast 19.12.2012 / 19:19