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

9

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. Portanto, isso seria como uma página de arquivo da categoria.

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

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

Aqui está o código atual que estou usando para gerar todas as categorias em uma 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 exista uma maneira melhor de fazer isso para que eu possa adicionar paginação natural, idealmente com o WP-PageNavi. Qualquer ajuda seria muito apreciada!

gelleproductions
fonte
Isso vai ser muito esforço;)
Sumit 27/05
@Sumit é realmente muito fácil com cerca nenhum esforço em tudo ;-)
Pieter Goosen

Respostas:

2

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

Vamos olhar para o que precisamos

  • a quantidade de termos

  • a quantidade de termos por página

  • get_terms()( Observe que o uso de get_terms()foi alterado na versão 4.5 ). Você também pode usar, get_categories()se desejar, get_categories()é apenas uma função de invólucro paraget_terms()

Então, primeiro precisamos contar a quantidade de termos. Para isso, usaremos o countparâmetro emget_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 funcionar 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;

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

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

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

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

Depois disso, devemos também dizer 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. Agora você pode alternar normalmente pelos seus termos

Apenas uma observação, você gostaria de ter certeza de que realmente recebeu os termos retornados de sua get_terms()função.

Pieter Goosen
fonte
Legal;) Mas eu não fiz como criar marcação de paginação? wp_pagnavi()realmente vai funcionar neste caso?
Sumit 28/05
11
@Sumit isso iria trabalhar com next_posts_link(), previous_posts_link()e paginate_links(). Também funcionaria com qualquer função de paginação em que você possa passar um valor inteiro para a função, como minha função de paginação aqui . Quanto a wp_pagenavi(), não posso dizer sim ou não, pois realmente não tenho idéia de como essa função funciona, você precisará testá-la. No meu código acima, $max_num_pagesdetém a quantidade de páginas, é um valor inteiro, é esta variável que você precisa para passar para funções para paginação calcular
Pieter Goosen
11
Um agradecimento especial a você e ao @cjbj, pois acho que essas duas soluções certamente podem funcionar. Depois de olhar ao redor, encontrei algumas coisas do WP-PageNavi explicando como ele pode funcionar ... É sempre possível rolar uma paginação personalizada , de qualquer maneira, acho que essas soluções são as melhores.
Gelleproductions
1

Eu não estou familiarizado com o WP-PageNavi, mas suspeito que ele esteja lidando com postagens, por isso pode facilmente estragar se você o usar em um loop como o seu. Talvez o css ainda possa ser útil para estilizar 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 necessária é a página em que você está. Você pode acompanhar isso introduzindo um query_varURL que será parecido com o seguinte: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_pagecategorias, portanto, você também precisa de:

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 / seguintes ou não outro tipo de navegação.

Cuidado para não testar esse código. Eu posso ter cometido alguns erros ao considerar que o primeiro elemento de uma matriz possui a chave 0.

cjbj
fonte
Não é uma abordagem muito mais fácil que é mais limpo e mais rápido ;-)
Pieter Goosen
Na verdade, não acho que nossas abordagens sejam tão diferentes. Você deixa o MySQL lidar com o deslocamento, deixo para o PHP.
Cjbj 28/05