WordPress: como listar autores filtrados por cargo ou número de posts

2
1597

Pra variar, andei empacado com um problema no WordPress semana passada. Precisava criar uma página fixa que listasse os autores de um blog, exibindo informações básicas, mas filtrando: só quem já fizesse parte da equipe "oficial" deveria aparecer. Senão, apareciam como membros do time de autores todos os assinantes, mesmo os que jamais escreveram uma linha sequer de artigo.

Considerando que só os que têm cargo de Colaborador já eram autores de fato,  comecei a matutar e pesquisar como fazer essa filtragem pelos roles (papéis) de cada um. No caso, só precisava exibir os Colaboradores e Administradores.

Existe a classe $wpdb para lidar com o banco de dados e assim pegar as informações que eu queria, mas a função get_results não me dava jeito de fazer isso. O máximo que conseguia era filtrar os autores por ID, mas causaria o grande revés de me obrigar a editar o template sempre que um novo autor fosse promovido a contribuidor. Nada prático nem elegante, por assim dizer.

Esse era o código:

global $wpdb;
$authors = $wpdb->get_results("SELECT ID, user_nicename from $wpdb->users ORDER BY display_name");
foreach ($authors as $author ) { 
$aid = $author->ID; 
?>

<div class="author_info <?php the_author_meta('user_nicename',$aid); ?>">
<span class="author_photo"><?php echo get_avatar($aid,96); ?></span>
<p><a href="<?php get_bloginfo('url'); ?>/author/<?php the_author_meta('user_nicename', $aid); ?>"><?php the_author_meta('display_name',$aid); ?></a></p>  
<p><?php the_author_meta('description',$aid); ?></p>
</div><?php
} 

Ou seja, ia pegar o "nicename" do autor (o nome amigável), o avatar e a descrição. Como os autores "de verdade" já tinham o cargo de contribuidor, lembrei da função user_can, que pode ser usada para criar condicionais if de PHP, para pegar o autor "se" ele estiver nas condições criadas.

Como você deve saber, cada cargo dá certas liberdades aos usuários do WordPress. Assim, o contribuidor pode excluir os próprios posts (delete_posts), mas não pode mudar o cargo de outros usuários (promote_users). Essas capacidades estão listadas aqui.

Assim fica fácil criar uma condicional if no template anterior, determinando que só usuários com capacidades de contribuidor (o que inclui cargos acima deste e que também escrevem; no caso, só os administradores) apareçam na lista. Ficou assim:

global $wpdb;
$authors = $wpdb->get_results("SELECT ID, user_nicename from $wpdb->users   ORDER BY display_name");

foreach ($authors as $author ) { 
$aid = $author->ID; 
if (user_can( $aid, 'delete_posts' ) ) { ?>

<div class="author_info <?php the_author_meta('user_nicename',$aid); ?>">
<span class="author_photo"><?php echo get_avatar($aid,96); ?></span>
<p><a href="<?php get_bloginfo('url'); ?>/author/<?php the_author_meta('user_nicename', $aid); ?>"><?php the_author_meta('display_name',$aid); ?></a></p>  
<p><?php the_author_meta('description',$aid); ?></p>
</div><?php 
	} 
}

Viu a diferença ali depois de declarar a variável $aid (logo depois da chave de abertura)? O código agora "diz" ao servidor que se o usuário identificado pela variável $aid pode (user_can) excluir posts (delete_posts), ele entra no foreach. Caso contrário, nada acontece. Como só administradores e colaboradores podem excluir posts, os demais não entram na lista.

Filtro por posts

Mas acabou não sendo o suficiente. Alguns inscritos tinham o cargo, mas ainda não haviam publicado nada. Outra situação: e se um autor com posts publicados fosse "rebaixado" de cargo mais tarde e eu quisesse removê-lo da lista de autores fixos? Outra vez, criar condições verificando ID não seria nada prático.

Precisava filtrar mais, incluindo uma checagem se o autor tinha posts publicados. Lembrei do count_user_posts, e procurei um jeito, até que esse deu certo.

Foi só juntar uma condicional, assim:

global $wpdb;
$authors = $wpdb->get_results("SELECT ID, user_nicename from $wpdb->users   ORDER BY display_name");

foreach ($authors as $author ) { 
$aid = $author->ID; 
if ( count_user_posts($aid) >= 1 && user_can($aid, 'delete_posts') ) {  ?>

<div class="author_info <?php the_author_meta('user_nicename',$aid); ?>">
<span class="author_photo"><?php echo get_avatar($aid,96); ?></span>
<p><a href="<?php get_bloginfo('url'); ?>/author/<?php the_author_meta('user_nicename', $aid); ?>"><?php the_author_meta('display_name',$aid); ?></a></p>  
<p><?php the_author_meta('description',$aid); ?></p>
</div><?php 
	} 
}

Então agora a condicional checa duas condições: se a contagem de posts do autor é maior ou igual a 1 e (usando o &&) se o autor tem as permissões de, no mínimo, colaborador. Estando as duas condições ok, o autor entra na lista.

Se precisar de só uma das condições, basta editar. Por exemplo, se quiser listar os autores filtrados só pela quantidade de posts, use:

if ( count_user_posts($aid) >= 1 ) {
- Publicidade -

Receba atualizações do Tutoriart

É grátis, e você pode escolher entre receber só sugestões sobre arte, design gráfico, Photoshop, etc, ou só sobre WordPress, blogging, design web, snippets, etc. Ou tudo, se preferir!

Quero assinar...
Ao assinar, você concorda com os Termos de Privacidade.

2 COMENTÁRIOS

  1. Salvou minha vida , queria fazer exatamente isto . Muitíssimo obrigado por compartilhar seus conhecimentos de WordPress .

    Você possui algum post que explique como deixar o wordpress mais seguro , quais medidas tomar ?

DEIXE UMA RESPOSTA

Por favor, digite seu comentário!
Por favor, digite seu nome aqui