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