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


9

Ich möchte eine Archivseite mit Paginierung anzeigen, in der alle Kategorien auf meiner Website aufgelistet sind, und jeder Link führt zu dieser bestimmten Kategoriearchivseite. Dies wäre also wie eine Archivseite von Kategoriearchiven.

Für jede Kategorie auf meiner Website wird manuell eine benutzerdefinierte Miniaturansicht erstellt, die dem Permalink der Kategorie entspricht. Ich habe bereits ein Layout-Setup, um alle Kategorien anzuzeigen, aber ich mache dies mit einer benutzerdefinierten Seitenvorlage, sodass es keine Paginierung gibt. 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 ist mit einem bestimmten benutzerdefinierten Seitenvorlagennamen eingerichtet, page-catlist.phpaber ich bin bereit, diesen in einen anderen Typ von Vorlagendatei zu ändern.

Hier ist der aktuelle Code, mit dem ich alle Kategorien auf einer Seite ausgeben kann:

$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, dies zu tun, damit ich eine natürliche Paginierung hinzufügen kann, idealerweise mit WP-PageNavi. Jede Hilfe wäre sehr dankbar!


Das wird eine Menge Mühe sein;)
Sumit

@Sumit es ist eigentlich ganz einfach ohne Anstrengung ;-)
Pieter Goosen

Antworten:


2

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 verwenden, get_categories()wenn Sie möchten, get_categories()ist nur eine Wrapper-Funktion fürget_terms()

Also müssen wir zuerst die Anzahl der Begriffe zählen. Dazu verwenden wir den countParameter inget_terms()

HINWEIS:

  • Der gesamte Code ist nicht getestet und erfordert mindestens

    • PHP 5.4

    • WordPress 4.5

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

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

Nachdem 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;

Aus dem oben Gesagten können wir nun herausfinden, wie viele Seiten wir haben werden. Der Wert hier wird an die erforderliche Paginierungsfunktion übergeben, in Ihrem Fall anwp_pagenavi()

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

In diesem Fall würden Sie $max_num_pageszu Ihrer Paginierungsfunktion übergehen

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 benötigen nicht alle über 100 Begriffe pro Seite. Nur die benötigten 10 abzufragen ist viel schneller. Wir müssen also wissen, auf welcher Seite wir uns befinden. Daraus berechnen wir einen Versatz. Dies wird an übergeben get_terms()und gibt an, get_terms()wie viele Begriffe vom ursprünglichen Startpunkt übersprungen werden sollen.

Sobald wir das haben, müssen wir auch sagen get_terms(), dass wir nur 10 Begriffe zurückgeben 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
    ]
);

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

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


Cool;) Aber ich wusste nicht, wie man ein Paginierungs-Markup erstellt? wp_pagnavi()wird in diesem Fall wirklich funktionieren?
Summe

1
@Sumit das würde funktionieren mit next_posts_link(), previous_posts_link()und paginate_links(). Es würde auch mit jeder Paging-Funktion funktionieren, bei der Sie einen ganzzahligen Wert an die Funktion übergeben können, wie z. B. meine Paging-Funktion hier . Soweit für wp_pagenavi(), kann ich nicht sagen , ja oder nein , wie ich wirklich keine Ahnung, wie man diese Funktion funktioniert, müssen Sie es testen. In meinem Code oben, $max_num_pagesenthält die Anzahl der Seiten, es ist ein ganzzahliger Wert, es ist diese Variable, die Sie an Funktionen übergeben müssen, um die Paginierung zu berechnen
Pieter Goosen

1
Besonderer Dank geht an Sie und @cjbj, da ich denke, dass diese beiden Lösungen sicherlich funktionieren könnten. Nachdem ich mich umgesehen habe, habe ich einige WP-PageNavi-Artikel gefunden, die erklären, wie es funktionieren kann ... Zugegeben, es ist immer möglich, eine benutzerdefinierte Paginierung zu erstellen. Ich denke, diese Lösungen sind die besten.
Gelleproductions

1

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

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;

Dadurch 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 eine query_varURL 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 )

Hier 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 enthält möglicherweise weniger als $cats_per_pageKategorien. Daher benötigen Sie zusätzlich:

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

Durchlaufen Sie nun 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 oder eine andere Art der Navigation zu generieren.

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


Es gibt einen viel einfacheren Ansatz, der sauberer und schneller ist ;-)
Pieter Goosen

Eigentlich denke ich nicht, dass unsere Ansätze so unterschiedlich sind. Sie lassen MySQL den Offset handhaben, ich überlasse es PHP.
cjbj
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.