WP_User_Query para excluir usuarios sin publicaciones

9

Veo que es posible ordenar una consulta de usuario por la cantidad de publicaciones que tiene cada usuario, pero ¿es posible excluir a los usuarios con cero publicaciones del resultado? En la clase Wp_User_Query hay una acción pre_user_query , pero las cadenas de consulta son un punto débil enorme, por lo que no estoy seguro de qué tipo de acción de filtro me gustaría usar aquí.

    
pregunta helgatheviking 19.12.2012 - 18:07

3 respuestas

10

Bueno, he encontrado 2 soluciones.

Solución 1: seleccione cada bucle y verifique cada usuario

Este se basa en la solución de @ GhostToast, pero con funciones actualizadas de 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"; 
}

Solución 2: pantalones de fantasía pre_user_query action

Esto es en lo que estaba pensando cuando publiqué mi pregunta una vez que encontré la acción pre_user_query en la clase WP_User_Query . Si pasas en post_count como tu parámetro orderby , entonces alguna consulta de SQL sofisticada que nunca hubiera descubierto por mi cuenta pasa a unir las tablas apropiadas. Entonces, lo que hice fue copiar esa declaración de unión y agregarla a la mía. Esto sería mejor si pudiera comprobar su presencia antes de agregarlo ... quizás use una cadena de coincidencia en el futuro. Pero por ahora, ya que soy el que configura la consulta, sé que no está allí y no me preocuparé todavía. Entonces el código resultó así:

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

y luego usarlo

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

La idea para un parámetro query_id es de Introducción a WP_User_Class

que también es solo una muy buena referencia en WP_User_Query

    
respondido por el helgatheviking 20.12.2012 - 01:36
2

Desde 4.4, simplemente puedes usar el parámetro 'has_published_posts'.

Ejemplo:

$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 puede ser verdadero / falso (o nulo), o una matriz de tipos de publicaciones (como en este ejemplo).

Nota: Estoy usando transitorios aquí porque esta consulta específica puede ser bastante pesada dependiendo del sistema, por lo que tiene sentido almacenarla para usos futuros.

    
respondido por el pixeline 07.07.2016 - 01:48
0

Enviar como respuesta para el cierre:

   $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;
        }
    }
    
respondido por el GhostToast 19.12.2012 - 19:19

Lea otras preguntas en las etiquetas