Jak utworzyć paginowaną listę wszystkich kategorii w mojej witrynie?

9

Chcę wyświetlić stronę archiwum z paginacją, która zawiera listę wszystkich kategorii w mojej witrynie, a każdy link prowadzi do tej strony archiwum kategorii. To byłoby jak strona archiwum archiwów kategorii.

Każda kategoria w mojej witrynie ma niestandardową miniaturę utworzoną ręcznie, aby pasowała do bezpośredniego linku kategorii. Mam już konfigurację układu do wyświetlania wszystkich kategorii, ale robię to z niestandardowym szablonem strony, więc nie ma podziału na strony. Oznacza to, że wszystkie kategorie są wyświetlane na jednej stronie, co jest nieco denerwujące (mam ponad 100 kategorii).

Moje bieżące archiwum jest skonfigurowane z określoną niestandardową nazwą szablonu strony, page-catlist.phpale jestem gotów zmienić to na inny typ pliku szablonu.

Oto aktualny kod, którego używam do wyświetlania wszystkich kategorii na jednej stronie:

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

Mam nadzieję, że jest lepszy sposób, aby to zrobić, dzięki czemu mogę dodać naturalną paginację, najlepiej w WP-PageNavi. Każda pomoc byłaby bardzo mile widziana!

produkcje gelle
źródło
To będzie duży wysiłek;)
Sumit
@Sumit to jest naprawdę całkiem łatwe, bez żadnego wysiłku ;-)
Pieter Goosen

Odpowiedzi:

2

Stronicowanie listy terminów / kategorii / tagów jest dość łatwe, a do osiągnięcia tego potrzebujesz minimalnych informacji.

Spójrzmy na to, czego potrzebujemy

  • ilość warunków

  • ilość warunków na stronie

  • get_terms()( Uwaga: użycie get_terms()zmieniło się w wersji 4.5 ). Możesz także użyć, get_categories()jeśli chcesz, get_categories()to tylko funkcja otokiget_terms()

Najpierw musimy policzyć liczbę terminów. W tym celu użyjemy countparametru wget_terms()

UWAGA:

  • Cały kod jest nieprzetestowany i wymaga co najmniej

    • PHP 5.4

    • WordPress 4.5

Możesz łatwo przekonwertować to na starsze wersje PHP i WordPress

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

Teraz, gdy znamy ilość terminów, możemy ustawić liczbę terminów potrzebnych na stronę, powiedzmy 10

$terms_per_page = 10;

Z powyższego możemy teraz obliczyć, ile stron będziemy mieć. Tutaj wartość zostanie przekazana do funkcji wymagającej paginacji, w twoim przypadku dowp_pagenavi()

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

W takim przypadku przejdziesz $max_num_pagesdo funkcji paginacji

Następną częścią byłoby obliczenie naszego przesunięcia. Chcemy tylko pobrać odpowiednią liczbę terminów na stronę, aby zoptymalizować wszystko. Nie potrzebujemy wszystkich ponad 100 warunków na stronie. Zapytanie tylko o potrzebne 10 jest znacznie szybsze. Musimy więc wiedzieć, na której stronie jesteśmy, z tego obliczymy przesunięcie. Zostanie to przekazane get_terms()i pokaże, get_terms()ile terminów należy pominąć od początkowego punktu początkowego.

Kiedy już to zrobimy, musimy również powiedzieć, get_terms()aby zwrócić tylko 10 warunków. Spójrzmy na kod tego utworu

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

Będziesz mieć tylko 10 terminów na stronę, zgodnie z podziałem na strony. Możesz teraz normalnie zapętlać swoje warunki

Tylko uwaga, chciałbyś upewnić się, że faktycznie zostały zwrócone warunki z get_terms()funkcji.

Pieter Goosen
źródło
Fajnie;) Ale nie udało mi się zbudować znaczników paginacji? wp_pagnavi()naprawdę będzie działać w tym przypadku?
Sumit
1
@Sumit to będzie działać z next_posts_link(), previous_posts_link()i paginate_links(). Byłoby to również pracować z dowolnej funkcji stronicowania, gdzie można przekazać wartość całkowitą do funkcji, jak mój funkcji stronicowania tutaj . Jeśli chodzi o to wp_pagenavi(), nie mogę powiedzieć tak lub nie, ponieważ tak naprawdę nie mam pojęcia, jak działa ta funkcja, trzeba ją przetestować. W moim powyższym kodzie $max_num_pageszawiera liczbę stron, jest to liczba całkowita, jest to zmienna, którą musisz przekazać funkcjom, aby obliczyć pagination
Pieter Goosen
1
Specjalne podziękowania dla ciebie i @cjbj, ponieważ myślę, że oba te rozwiązania z pewnością mogłyby działać. Po rozejrzeniu się znalazłem kilka rzeczy WP-PageNavi wyjaśniających, w jaki sposób może to działać ... To prawda, że ​​zawsze można stworzyć niestandardową paginację, więc uważam, że te rozwiązania są najlepsze.
gelleproductions
1

Nie jestem zaznajomiony z WP-PageNavi, ale podejrzewam, że zakłada, że ​​zajmuje się postami, więc może łatwo zepsuć się, jeśli użyjesz go w pętli takiej jak twoja. Być może css może nadal być pomocny w stylizacji HTML. W każdym razie utworzenie własnej paginacji nie jest takie trudne.

Najpierw musisz wiedzieć, ile jest kategorii:

$cat_amounts=count($cats);

Następnie musisz określić, ile elementów na stronie chcesz:

$cats_per_page=20;

To da ci liczbę stron:

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

Trzecią potrzebną informacją jest strona, na której jesteś. Możesz to śledzić, wprowadzając query_varTwój adres URL będzie wyglądał mniej więcej tak:www.example.com/yourcatpage?catpage=2

Przed uruchomieniem pętli musisz wiedzieć, która strona nazywa się:

$page_called=get_query_var ( $catpage, 1 )

W ten sposób możesz wywołać pierwszy element, który chcesz wyświetlić:

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

i ostatni:

$last_element=$page_called*$cats_per_page-1;

Ostatnia strona może zawierać mniej niż $cats_per_pagekategorie, więc dodatkowo potrzebujesz:

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

Teraz przejdź przez pożądane elementy $cats:

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

Po pętli możesz używać zmiennych do generowania poprzednich / następnych tagów lub innego rodzaju nawigacji.

Uważaj, że tak naprawdę nie przetestowałem tego kodu. Mogłem popełnić kilka błędów, biorąc pod uwagę, że pierwszy element w tablicy ma klucz 0.

cjbj
źródło
Jest o wiele łatwiejsze podejście, które jest czystsze i szybsze ;-)
Pieter Goosen
Właściwie nie sądzę, aby nasze podejścia były tak różne. Pozwalacie MySQLowi obsłużyć przesunięcie, pozostawiam to PHP.
cjbj