Bagaimana Cara Membuat Daftar Semua Kategori di Situs Saya?

9

Saya ingin menampilkan halaman arsip dengan pagination yang mencantumkan semua kategori di situs saya, dan setiap tautan menuju ke halaman arsip kategori tertentu. Jadi ini akan menjadi seperti halaman arsip dari arsip kategori.

Setiap kategori di situs saya memiliki thumbnail khusus yang dibuat secara manual untuk mencocokkan permalink kategori. Saya sudah memiliki pengaturan tata letak untuk menampilkan semua kategori tapi saya melakukan ini dengan template halaman khusus, jadi tidak ada pagination. Ini berarti semua kategori ditampilkan pada satu halaman yang sedikit menjengkelkan (Saya memiliki 100+ kategori).

Arsip saya saat ini disetel dengan nama templat laman khusus page-catlist.phptetapi saya bersedia mengubahnya ke jenis berkas templat lain.

Berikut kode saat ini yang saya gunakan untuk menampilkan semua kategori pada satu halaman:

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

Saya berharap ada cara yang lebih baik untuk melakukan ini sehingga saya dapat menambahkan pagination alami, idealnya dengan WP-PageNavi. Bantuan apa pun akan sangat dihargai!

produksi gell
sumber
Itu akan menjadi banyak usaha;)
Sumit
@Sumit itu sebenarnya cukup mudah dengan tidak ada usaha sama sekali ;-)
Pieter Goosen

Jawaban:

2

Paging daftar istilah / kategori / tag cukup mudah, dan untuk mencapainya, Anda memerlukan info minimal.

Mari kita lihat apa yang kita butuhkan

  • jumlah ketentuan

  • jumlah ketentuan per halaman

  • get_terms()( Perhatikan saja, penggunaan get_terms()telah berubah di versi 4.5 ). Anda juga dapat menggunakan get_categories()jika diinginkan, get_categories()hanya untuk fungsi pembungkusget_terms()

Jadi pertama-tama kita perlu menghitung jumlah syarat. Untuk ini, kita akan menggunakan countparameter dalamget_terms()

CATATAN:

  • Semua kode belum diuji dan memerlukan setidaknya

    • PHP 5.4

    • WordPress 4.5

Anda dapat dengan mudah mengonversi ini agar berfungsi dengan versi PHP dan WordPress yang lebih lama

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

Sekarang kita tahu jumlah istilah, kita dapat mengatur jumlah istilah yang kita butuhkan per halaman, katakanlah 10

$terms_per_page = 10;

Dari penjelasan di atas, kita sekarang dapat menentukan berapa banyak halaman yang akan kita miliki. Nilai di sini akan diteruskan ke fungsi pagination yang diperlukan, dalam kasus Anda, untukwp_pagenavi()

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

Dalam hal ini, Anda akan beralih $max_num_pageske fungsi pagination Anda

Bagian selanjutnya adalah menghitung offset kami. Kami hanya ingin mengambil jumlah istilah yang relevan per halaman untuk menjaga hal-hal dioptimalkan. Kami tidak membutuhkan semua syarat 100+ per halaman. Meminta hanya 10 yang dibutuhkan jauh lebih cepat. Jadi, kita perlu tahu di halaman mana kita berada, dari situ, kita akan menghitung offset. Ini akan diteruskan ke get_terms(), dan akan memberitahu get_terms()berapa banyak istilah untuk dilewati dari titik awal awal.

Setelah memilikinya, kita juga harus memberi tahu get_terms()untuk mengembalikan 10 syarat. Mari kita lihat kode untuk bagian ini

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

Anda hanya akan memiliki 10 istilah per halaman berdasarkan halaman. Sekarang Anda hanya dapat mengulang dengan normal melalui persyaratan Anda

Hanya sebuah catatan, Anda ingin memastikan bahwa Anda benar-benar telah mengembalikan istilah dari get_terms()fungsi Anda .

Pieter Goosen
sumber
Keren;) Tapi saya tidak bagaimana membangun markup pagination? wp_pagnavi()akan benar-benar berfungsi dalam kasus ini?
Sumit
1
@ Karena ini akan bekerja dengan next_posts_link(), previous_posts_link()dan paginate_links(). Ini juga akan berfungsi dengan fungsi paging mana pun di mana Anda dapat memberikan nilai integer ke fungsi, seperti fungsi paging saya di sini . Sejauh ini wp_pagenavi(), saya tidak bisa mengatakan ya atau tidak karena saya benar-benar tidak tahu bagaimana fungsi itu bekerja, Anda perlu mengujinya. Dalam kode saya di atas, $max_num_pagesmenampung jumlah halaman, ini adalah nilai integer, variabel inilah yang perlu Anda lewati untuk fungsi menghitung pagination
Pieter Goosen
1
Terima kasih khusus kepada Anda dan @cjbj karena saya pikir kedua solusi ini pasti dapat bekerja. Setelah melihat-lihat, saya telah menemukan beberapa hal WP-PageNavi yang menjelaskan cara kerjanya ... Memang selalu memungkinkan untuk menggulir pagination khusus jadi saya pikir solusi ini adalah yang terbaik.
gelleproductions
1

Saya tidak terbiasa dengan WP-PageNavi, tapi saya curiga ini berasumsi berhubungan dengan posting, jadi mungkin akan mudah rusak jika Anda menggunakannya pada loop seperti milik Anda. Mungkin css mungkin masih membantu dalam menata html Anda. Bagaimanapun, mengatur pagination Anda sendiri tidak terlalu sulit.

Pertama, Anda perlu tahu ada berapa kategori:

$cat_amounts=count($cats);

Selanjutnya Anda perlu menentukan berapa banyak item per halaman yang Anda inginkan:

$cats_per_page=20;

Ini akan memberi Anda jumlah halaman:

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

Informasi ketiga yang Anda butuhkan adalah halaman tempat Anda berada. Anda dapat melacak hal ini dengan memperkenalkan query_varurl Anda kemudian akan terlihat seperti ini:www.example.com/yourcatpage?catpage=2

Sebelum Anda memulai loop, Anda perlu tahu halaman mana yang disebut:

$page_called=get_query_var ( $catpage, 1 )

Dari sini Anda dapat memanggil elemen pertama yang ingin Anda tampilkan:

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

dan yang terakhir:

$last_element=$page_called*$cats_per_page-1;

Halaman terakhir mungkin mengandung kurang dari $cats_per_pagekategori, jadi Anda juga perlu:

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

Sekarang, loop melalui elemen yang diinginkan $cats:

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

Setelah loop Anda dapat menggunakan variabel untuk menghasilkan tag sebelumnya / berikutnya atau bahkan jenis navigasi lainnya.

Berhati-hatilah karena saya tidak benar-benar menguji kode ini. Saya mungkin telah membuat beberapa kesalahan ketika mempertimbangkan bahwa elemen pertama dalam array memiliki kunci 0.

cjbj
sumber
Ada pendekatan yang jauh lebih mudah yang lebih bersih dan lebih cepat ;-)
Pieter Goosen
Sebenarnya, saya tidak berpikir pendekatan kami berbeda. Anda membiarkan MySQL menangani offset, saya serahkan ke PHP.
cjbj