Suporte » Desenvolvendo com WordPress » Páginação em modelo de página que lista usuários.

  • Resolvido MarcosAlexandre

    (@marcosalexandre)


    Olá pessoal!

    Estou criando um modelo de página onde lista um tipo específico de usuários e gostaria da ajuda de vocês sobre como fazer a paginação desta listagem, uma vez que o que tenho encontrado sobre paginação refere-se apenas aos posts em si (ou talvez não tenha entendido ou procurado pelos termos errados, rs).

    Segue o link do código no Pastebin:

    https://pastebin.com/sipnzMdZ

    Abraços,

Visualizando 4 respostas - 1 até 4 (de um total de 4)
  • Moderador Felipe Elia

    (@felipeelia)

    Oi @marcosalexandre,

    A função get_users é um wrapper para a função get_results da classe WP_User_Query e, para paginação, talvez seja mais fácil usar WP_User_Query direto.

    Essa resposta no wordpress.stackexchange.com pode te ajudar. Com base nela podemos pensar mais ou menos em um script. As linhas 19 e 20 do seu arquivo virariam algo como:

    $users_per_page = 10;
    $args = array( 
        'orderby' => 'display_name', 
        'order' => 'ASC', 
        'role' => 'Contributor',
        'number' => $users_per_page,
        'paged' => ( get_query_var('paged') ) ? get_query_var('paged') : 1,
        'count_total' => TRUE,
    );
    $autores_query = WP_User_Query( $args );
    $autores = $autores_query->get_results();

    Para a paginação:

    if ( $autores_query->get_total() > $users_per_page ) {
        $pl_args = array(
            'base'     => add_query_arg( 'paged', '%#%' ),
            'format'   => '',
            'total'    => ceil( $total_users / $number ),
            'current'  => max( 1, $paged ),
        );
    
        // for ".../page/n"
        if( $GLOBALS['wp_rewrite']->using_permalinks() ) {
            $pl_args['base'] = user_trailingslashit( trailingslashit( get_pagenum_link( 1 ) ) . 'page/%#%/', 'paged' );
        }
    
        echo paginate_links( $pl_args );
    }

    Não testei o código, mas já deve servir de caminho para você. Não esqueça de voltar para contar se funcionou, se ficou com alguma dúvida e, se for o caso, para marcar seu tópico como resolvido, beleza?

    • Esta resposta foi modificada 3 anos, 4 meses atrás por Felipe Elia. Razão: formatação

    Valeu @felipeelia!

    Com a excelente base que passou, fiz os ajustes necessários (abaixo) e deu tudo certo \o/

    Tinha faltado o “new” antes de WP_User_Query:

    $users_per_page = 10;
    $args = array( 
        'orderby' => 'display_name', 
        'order' => 'ASC', 
        'role' => 'Contributor',
        'number' => $users_per_page,
        'paged' => ( get_query_var('paged') ) ? get_query_var('paged') : 1,
        'count_total' => TRUE,
    );
    $autores_query = new WP_User_Query( $args );
    $autores = $autores_query->get_results();

    E na paginação, definir os valores das variáveis “total_users” (pegar o número de usuários do role necessário), da variável “$paged” e da variável “$number” (com o número de usuários a serem exibidos por página):

    $total_users = count( get_users( array( 'role' => 'Contributor' ) ) );
    $paged = get_query_var('paged');
    $number = 10;
    
    if ( $autores_query->get_total() > $users_per_page ) {
        $pl_args = array(
            'base'     => add_query_arg( 'paged', '%#%' ),
            'format'   => '',
            'total'    => ceil( $total_users ),
            'current'  => max( 1, $paged ),
        );
    
        // for ".../page/n"
        if( $GLOBALS['wp_rewrite']->using_permalinks() ) {
            $pl_args['base'] = user_trailingslashit( trailingslashit( get_pagenum_link( 1 ) ) . 'page/%#%/', 'paged' );
        }
    
        echo paginate_links( $pl_args );
    }

    Abraço

    Moderador Felipe Elia

    (@felipeelia)

    Que bom que resolveu @marcosalexandre!

    Para melhorar a performance, no segundo bloco, você pode tentar:

    $total_users = $autores_query->get_total();
    Dessa forma ele já usa a mesma instância de WP_User_Query que já está criada. Aí dá pra trocar o teste para
    if ( $total_users > $users_per_page ) {

    Para manter a consistência é melhor você usar só $number ou só $users_per_page, elas tem sempre o mesmo valor 🙂

    Obrigado pelas dicas @felipeelia, fiz as alterações que sugeriu, 😉

Visualizando 4 respostas - 1 até 4 (de um total de 4)
  • O tópico ‘Páginação em modelo de página que lista usuários.’ está fechado para novas respostas.