WP_User_Query para excluir usuarios sin publicaciones


9

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


¿Sería menos gravoso simplemente descartar de los resultados a aquellos usuarios que post_count== 0?
GhostToast

3
Me estaba preparando para cerrar esto como una pregunta totalmente tonta. WordPress hace esto automáticamente con la get_posts_by_author_sqlfunción que genera el SQL para la get_authors()consulta. Los usuarios deben tener una publicación publicada o privada para ser incluidos en los resultados. #facepalm
helgatheviking

genial contento de haber encontrado la respuesta
GhostToast

¡Yo también! Aunque no hay opción para cerrar la pregunta por razones de estupidez. Gracias por hablar sin embargo. Aplicaré su consejo porque quiero guardar el get_authors()resultado como transitorio ... entonces simplemente puedo omitir el autor actual sin necesidad de hacer una consulta cada vez.
helgatheviking

1
Esta pregunta no es estúpida, recibió votos positivos, proporcione su solución como respuesta, ya que puede ayudar a otros.
Wyck

Respuestas:


10

Bueno, he encontrado 2 soluciones.

Solución 1 - foreach loop y verificar 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 - pre_user_queryacción de pantalones elegantes

Esto es lo que estaba pensando cuando publiqué mi pregunta una vez que encontré la pre_user_queryacción en la WP_User_Queryclase. Si pasa post_countcomo su orderbyparámetro, algunas consultas SQL sofisticadas que nunca habría descubierto por mi cuenta suceden las tablas adecuadas. Entonces, lo que hice fue copiar esa declaración de unión y agregarla a la mía. Esto sería mejor si pudiera verificar su presencia primero antes de agregarlo ... tal vez usaré una coincidencia de cadena en el futuro. Pero por ahora, dado que soy yo quien configura la consulta, sé que no está allí y todavía no me preocuparé. 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 query_idparámetro es de Introducción a WP_User_Class

Lo cual también es solo una muy buena referencia sobre WP_User_Query


1
Esto es adorable. Ahora todo lo que necesitamos es una forma de ajustar el recuento de páginas de paginación a la nueva lista reelaborada ...
Christine Cooper

Buena llamada. No se como hacer eso.
helgatheviking

author-> id ahora es author-> ID (cambio pequeño pero el id se deprecia)
razón de ser el

3

Desde 4.4, simplemente puede 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_postspuede ser verdadero / falso (o nulo) o una matriz de tipos de publicación (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.


0

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

¿Es esa la solución necesaria para obtener usuarios de todos los roles? Estoy descubriendo que dejar ese argumento en blanco no devuelve a todos los usuarios en varios sitios.
helgatheviking

get_users_with_role()¿No es una función de WordPress o he estado mirando mi computadora demasiado tiempo?
helgatheviking

1
No existe Buscando 966 archivos "get_users_with_role": 0 matches across 0 files. También get_usernumpostsse deprecia, usecount_user_posts()
Wyck

argh! mis disculpas. Esta fue una función que escribí para un sitio basado en miembros. puede usar get_users () y pasarle los parámetros que desee: codex.wordpress.org/Function_Reference/get_users
GhostToast

@GhostToast Por favor, solo actualice su respuesta.
kaiser
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.