it-swarm.com.de

Wie erstelle ich eine paginierte Liste aller Kategorien auf meiner Website?

Ich möchte eine Archivseite mit Paginierung anzeigen, auf der alle Kategorien auf meiner Website aufgelistet sind. Jeder Link verweist auf diese bestimmte Kategoriearchivseite. Das wäre also wie eine Archivseite mit Kategoriearchiven.

Für jede Kategorie auf meiner Website wurde ein benutzerdefiniertes Miniaturbild erstellt, das dem Permalink der Kategorie entspricht. Ich habe bereits ein Layout-Setup, um alle Kategorien anzuzeigen, aber ich mache dies mit einer benutzerdefinierten Seitenvorlage, sodass keine Paginierung erfolgt. Dies bedeutet, dass alle Kategorien auf einer einzigen Seite angezeigt werden, was ein bisschen ärgerlich ist (ich habe mehr als 100 Kategorien).

Mein aktuelles Archiv wird mit einem bestimmten benutzerdefinierten Seitenvorlagennamen (page-catlist.php) eingerichtet, aber ich bin bereit, diesen in einen anderen Vorlagendateityp zu ändern.

Hier ist der aktuelle Code, den ich verwende, um alle Kategorien auf einer Seite auszugeben:

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

Ich hoffe, es gibt einen besseren Weg, um eine natürliche Paginierung zu erreichen, idealerweise mit WP-PageNavi. Jede Hilfe wäre sehr dankbar!

9

Das Blättern in einer Liste von Begriffen/Kategorien/Tags ist recht einfach. Um dies zu erreichen, benötigen Sie nur minimale Informationen.

Schauen wir uns an, was wir brauchen

  • die Anzahl der Begriffe

  • die Anzahl der Begriffe pro Seite

  • get_terms() ( Beachten Sie nur, dass sich die Verwendung von get_terms() in Version 4.5 geändert hat ). Sie können auch get_categories() verwenden, wenn Sie möchten. get_categories() ist nur eine Wrapper-Funktion für get_terms().

Also müssen wir zuerst die Anzahl der Begriffe zählen. Dafür verwenden wir den Parameter count in get_terms()

HINWEIS:

  • Der gesamte Code ist ungetestet und erfordert mindestens

    • PHP 5.4

    • WordPress 4.5

Sie können dies problemlos konvertieren, um mit älteren Versionen von PHP und WordPress zu arbeiten

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

Jetzt, da wir die Anzahl der Begriffe kennen, können wir die Anzahl der Begriffe festlegen, die wir pro Seite benötigen, sagen wir 10

$terms_per_page = 10;

Anhand der obigen Informationen können wir nun die Anzahl der Seiten ermitteln, die wir haben werden. Der hier angegebene Wert wird an die erforderliche Paginierungsfunktion übergeben, in Ihrem Fall an wp_pagenavi()

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

In diesem Fall würden Sie $max_num_pages an Ihre Paginierungsfunktion übergeben

Der nächste Teil wäre die Berechnung unseres Offsets. Wir möchten nur die relevante Anzahl von Begriffen pro Seite abrufen, um die Dinge zu optimieren. Wir brauchen nicht alle mehr als 100 Begriffe pro Seite. Nur die benötigten 10 abzufragen ist viel schneller. Wir müssen also wissen, auf welcher Seite wir uns befinden, und daraus berechnen wir einen Offset. Dies wird an get_terms() übergeben und teilt get_terms() mit, wie viele Begriffe vom Anfangspunkt an übersprungen werden sollen.

Sobald dies geschehen ist, müssen wir get_terms() auch mitteilen, dass nur 10 Terme zurückgegeben werden sollen. Schauen wir uns den Code für dieses Stück an

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

Sie haben nur 10 Begriffe pro Seite nach Paginierung. Sie können jetzt ganz normal Ihre Begriffe durchlaufen

Nur eine Anmerkung, Sie möchten sicherstellen, dass Sie tatsächlich Begriffe haben, die von Ihrer get_terms() -Funktion zurückgegeben wurden.

2
Pieter Goosen

Ich bin nicht mit WP-PageNavi vertraut, aber ich vermute, dass es sich um Posts handelt, so dass es leicht zu Problemen kommen kann, wenn Sie es in einer Schleife wie Ihrer verwenden. Vielleicht kann die CSS immer noch hilfreich beim Stylen Ihres HTML-Codes sein. Wie auch immer, es ist nicht so schwierig, eine eigene Paginierung zu erstellen.

Zunächst müssen Sie wissen, wie viele Kategorien es gibt:

$cat_amounts=count($cats);

Als nächstes müssen Sie bestimmen, wie viele Elemente pro Seite Sie möchten:

$cats_per_page=20;

So erhalten Sie die Anzahl der Seiten:

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

Die dritte Information, die Sie benötigen, ist die Seite, auf der Sie sich befinden. Sie können dies verfolgen, indem Sie einen query_var eingeben. Ihre URL sieht dann ungefähr so ​​aus: www.example.com/yourcatpage?catpage=2

Bevor Sie die Schleife starten, müssen Sie wissen, welche Seite aufgerufen wird:

$page_called=get_query_var ( $catpage, 1 )

Daraufhin können Sie das erste Element aufrufen, das Sie anzeigen möchten:

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

und der Letzte:

$last_element=$page_called*$cats_per_page-1;

Die letzte Seite kann weniger als $cats_per_page Kategorien enthalten, daher benötigen Sie zusätzlich:

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

Blättern Sie nun durch die gewünschten Elemente von $cats:

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

Nach der Schleife können Sie die Variablen verwenden, um vorherige/nächste Tags zu generieren oder um eine andere Art der Navigation durchzuführen.

Beachten Sie, dass ich diesen Code nicht getestet habe. Möglicherweise habe ich einige Fehler gemacht, wenn ich berücksichtigt habe, dass das erste Element in einem Array den Schlüssel 0 hat.

1
cjbj