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