Come creare un elenco impaginato di tutte le categorie sul mio sito?


9

Voglio visualizzare una pagina di archivio con impaginazione che elenca tutte le categorie sul mio sito e ogni collegamento va a quella pagina di archivio di quella particolare categoria. Quindi questo sarebbe come una pagina di archivio di archivi di categoria.

Ogni categoria sul mio sito ha una miniatura personalizzata creata manualmente per abbinare il permalink della categoria. Ho già una configurazione del layout per visualizzare tutte le categorie, ma lo sto facendo con un modello di pagina personalizzato, quindi non c'è impaginazione. Ciò significa che tutte le categorie vengono visualizzate su una singola pagina che è un po 'fastidioso (ho più di 100 categorie).

Il mio archivio corrente è configurato con un nome di modello di pagina personalizzato specifico, page-catlist.phpma sono disposto a cambiarlo con qualsiasi altro tipo di file modello.

Ecco il codice corrente che sto usando per generare tutte le categorie su una pagina:

$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()
}

Spero che ci sia un modo migliore per farlo in modo da poter aggiungere l'impaginazione naturale, idealmente con WP-PageNavi. Qualsiasi aiuto sarebbe molto apprezzato!


Sarà un grande sforzo;)
Sumit,

@Sumit in realtà è abbastanza facile senza alcuno sforzo ;-)
Pieter Goosen

Risposte:


2

Effettuare il paging di un elenco di termini / categorie / tag è abbastanza semplice e, per raggiungerlo, sono necessarie informazioni minime.

Vediamo di cosa abbiamo bisogno

  • la quantità di termini

  • la quantità di termini per pagina

  • get_terms()( Basta notare che l'uso di get_terms()è cambiato nella versione 4.5 ). Puoi anche usare, get_categories()se lo desideri, get_categories()è solo una funzione wrapper perget_terms()

Quindi prima dobbiamo contare la quantità di termini. Per questo, useremo il countparametro inget_terms()

NOTA:

  • Tutto il codice non è testato e richiede almeno

    • PHP 5.4

    • WordPress 4.5

Puoi facilmente convertirlo per funzionare con le versioni precedenti di PHP e WordPress

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

Ora che conosciamo la quantità di termini, possiamo impostare la quantità di termini di cui abbiamo bisogno per pagina, diciamo 10

$terms_per_page = 10;

Da quanto sopra, ora possiamo capire quante pagine avremo. Il valore qui verrà passato alla funzione impaginazione richiesta, nel tuo caso, awp_pagenavi()

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

In questo caso, passeresti $max_num_pagesalla tua funzione di impaginazione

La parte successiva sarebbe calcolare il nostro offset. Vogliamo solo recuperare la quantità rilevante di termini per pagina per mantenere le cose ottimizzate. Non abbiamo bisogno di tutti i 100+ termini per pagina. Interrogare solo i 10 necessari è molto più veloce. Quindi, abbiamo bisogno di sapere su quale pagina siamo, da questo, calcoleremo un offset. Questo verrà passato get_terms()e indicherà get_terms()quanti termini saltare dal punto iniziale iniziale.

Una volta fatto ciò, dobbiamo anche dire get_terms()di restituire solo 10 termini. Dai un'occhiata al codice per questo pezzo

$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
    ]
);

Avrai solo 10 termini per pagina secondo l'impaginazione. Ora puoi semplicemente scorrere normalmente i termini

Solo una nota, vorrai assicurarti di avere effettivamente i termini restituiti dalla tua get_terms()funzione.


Figo;) Ma non ho saputo costruire il markup della paginazione? wp_pagnavi()funzionerà davvero in questo caso?
Summit,

1
@Sumito con cui funzionerebbe next_posts_link(), previous_posts_link()e paginate_links(). Funzionerebbe anche con qualsiasi funzione di paging in cui è possibile passare un valore intero alla funzione, come la mia funzione di paging qui . Per quanto riguarda wp_pagenavi(), non posso dire di sì o no in quanto non ho davvero idea di come funzioni, sarà necessario testarlo. Nel mio codice sopra, $max_num_pagescontiene la quantità di pagine, è un valore intero, è questa variabile che devi passare alle funzioni per calcolare l'impaginazione
Pieter Goosen,

1
Un ringraziamento speciale sia a te che a @cjbj poiché penso che entrambe queste soluzioni potrebbero sicuramente funzionare. Dopo aver guardato in giro ho trovato alcune cose di WP-PageNavi che spiegavano come può funzionare ... Concesso è sempre possibile eseguire una paginazione personalizzata, quindi in entrambi i casi penso che queste soluzioni siano le migliori.
gelleproductions,

1

Non ho familiarità con WP-PageNavi, ma ho il sospetto che presuma che abbia a che fare con i post, quindi potrebbe facilmente rovinarsi se lo usi in un loop come il tuo. Forse il CSS potrebbe essere ancora utile nello stile del tuo HTML. Ad ogni modo, impostare la propria impaginazione non è poi così difficile.

Innanzitutto, devi sapere quante categorie ci sono:

$cat_amounts=count($cats);

Successivamente è necessario determinare quanti elementi per pagina si desidera:

$cats_per_page=20;

Questo ti darà la quantità di pagine:

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

La terza informazione di cui hai bisogno è la pagina in cui ti trovi. Puoi tenere traccia di questo introducendo un query_vartuo url, quindi sarà simile a questo:www.example.com/yourcatpage?catpage=2

Prima di iniziare il ciclo, devi sapere quale pagina viene chiamata:

$page_called=get_query_var ( $catpage, 1 )

Da questo puoi chiamare il primo elemento che vuoi visualizzare:

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

e l'ultimo:

$last_element=$page_called*$cats_per_page-1;

L'ultima pagina potrebbe contenere meno di $cats_per_pagecategorie, quindi è necessario inoltre:

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

Ora, scorrere gli elementi desiderati di $cats:

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

Dopo il ciclo è possibile utilizzare le variabili per generare tag precedenti / successivi o altri tipi di navigazione.

Fai attenzione che non ho effettivamente testato questo codice. Potrei aver commesso degli errori nel considerare che il primo elemento in un array ha la chiave 0.


C'è un approccio molto più semplice, più pulito e veloce ;-)
Pieter Goosen,

In realtà, non penso che i nostri approcci siano così diversi. Lascia che MySQL gestisca l'offset, lo lascio a PHP.
cjbj,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.