Como criar uma lista paginada de todas as categorias no meu site?

9

Eu quero exibir uma página de arquivo com paginação que lista todas as categorias no meu site, e cada link vai para essa página de arquivo de categoria específica. Então, isso seria como uma página de arquivo de arquivos de categoria.

Cada categoria no meu site tem uma miniatura personalizada criada manualmente para corresponder ao permalink da categoria. Eu já tenho uma configuração de layout para exibir todas as categorias, mas estou fazendo isso com um modelo de página personalizado, por isso não há paginação. Isso significa que todas as categorias são exibidas em uma única página, o que é um pouco chato (eu tenho mais de 100 categorias).

Meu arquivo atual é configurado com um nome de modelo de página personalizado específico page-catlist.php , mas estou disposto a mudar isso para qualquer outro tipo de arquivo de modelo.

Este é o código atual que estou usando para gerar todas as categorias em uma única página:

$args = array(
  'orderby' => 'name',
  'order' => 'ASC'
);
$cats      = get_categories( $args );
$thm_pre   = 'http://example.com/images/thumbs/';
$thm_end   = '.png';

foreach($cats as $cat) {
    $thumbnail = $thm_pre.$cat->slug.$thm_end;
    // output the loop HTML here
    // basically a list of category names & thumbs 
    // all linked to the cat URL by get_category_link()
}

Espero que haja uma maneira melhor de fazer isso para que eu possa adicionar paginação natural, idealmente com o WP-PageNavi. Qualquer ajuda seria muito apreciada!

    
por gelleproductions 27.05.2016 / 14:57

2 respostas

2

Paginar uma lista de termos / categorias / tags é muito fácil e, para isso, você precisa de informações mínimas.

Vamos ver que precisamos

  • a quantidade de termos

  • a quantidade de termos por página

  • get_terms() ( Basta observar que o uso de get_terms() alterado na versão 4.5 ). Você também pode usar get_categories() , se desejar, get_categories() é apenas uma função de wrapper para get_terms()

Primeiro, precisamos contar a quantidade de termos. Para isso, usaremos o parâmetro count em get_terms()

NOTA:

  • Todo o código não foi testado e requer pelo menos

    • PHP 5.4

    • WordPress 4.5

Você pode facilmente converter isso para trabalhar com versões mais antigas do PHP e WordPress

$taxonomy   = 'category';
$term_count = get_terms( 
    [
        'taxonomy'  => $taxonomy,
        'fields'    => 'count'
    ]
);

Agora que sabemos a quantidade de termos, podemos definir a quantidade de termos que precisamos por página, digamos 10

$terms_per_page = 10;

Do exposto, podemos agora calcular quantas páginas teremos. O valor aqui será passado para a função de paginação requer, no seu caso, para wp_pagenavi()

$max_num_pages = ceil( $term_count/$terms_per_page );

Nesse caso, você passaria $max_num_pages para sua função de paginação

A próxima parte seria calcular nosso deslocamento. Queremos apenas recuperar a quantidade relevante de termos por página para manter as coisas otimizadas. Nós não precisamos de todos os mais de 100 termos por página. Consultar apenas os 10 necessários é muito mais rápido. Então, precisamos saber em qual página estamos, é disso, vamos calcular um deslocamento. Isso será passado para get_terms() e informará get_terms() de quantos termos pular do ponto inicial.

Depois disso, devemos também informar get_terms() para retornar apenas 10 termos. Vamos olhar o código para esta peça

$current_page = get_query_var( 'paged', 1 ); // Change to 'page' for static front page
$offset       = ( $terms_per_page * $current_page ) - $terms_per_page;
$terms        = get_terms(
    [
        'taxonomy' => $taxonomy,
        'order'    => 'ASC',
        'orderby'  => 'name',
        'number'   => $terms_per_page,
        'offset'   => $offset
    ]
);

Você terá apenas 10 termos por página de acordo com a paginação. Você pode agora fazer um loop normalmente através de seus termos

Apenas uma nota, você gostaria de ter certeza de que você realmente tem termos retornados da sua função get_terms() .

    
por Pieter Goosen 28.05.2016 / 07:41
1

Eu não estou familiarizado com o WP-PageNavi, mas suspeito que ele esteja lidando com postagens, então ele pode facilmente estragar se você usá-lo em um loop como o seu. Talvez o css ainda possa ser útil no estilo do seu html. De qualquer forma, configurar sua própria paginação não é tão difícil.

Primeiro, você precisa saber quantas categorias existem:

$cat_amounts=count($cats);

Em seguida, você precisa determinar quantos itens por página deseja:

$cats_per_page=20;

Isso fornecerá a quantidade de páginas:

$max_pages=ceil($cat_amounts/$cats_per_page);

A terceira informação que você precisa é a página em que você está. Você pode acompanhar isso introduzindo um query_var Seu URL será semelhante a este: www.example.com/yourcatpage?catpage=2

Antes de iniciar o loop, você precisa saber qual página é chamada:

$page_called=get_query_var ( $catpage, 1 )

A partir disso, você pode chamar o primeiro elemento que deseja exibir:

$first_element=($page_called-1)*$cats_per_page)

e o último:

$last_element=$page_called*$cats_per_page-1;

A última página pode conter menos de $cats_per_page categorias, então você também precisa:

if ($last_element > $cat_amounts) $last_element = $cat_amounts;

Agora, percorra os elementos desejados de $cats :

for ($i=$first_element;$i=<$last_element;$i++) {
    //do your thing with $cats[$i];
}

Após o loop, você pode usar as variáveis para gerar tags anteriores / próximos ou outro tipo de navegação.

Cuidado com o fato de eu não ter realmente testado esse código. Eu posso ter cometido alguns erros ao levar em conta que o primeiro elemento em uma matriz tem a chave 0.

    
por cjbj 27.05.2016 / 18:59