Sitemdeki Tüm Kategorilerin Sayfalandırılmış Listesi Nasıl Oluşturulur?


9

Sitemdeki tüm kategorileri listeleyen sayfalandırmalı bir arşiv sayfası görüntülemek istiyorum ve her bağlantı o kategori arşiv sayfasına gider. Yani bu kategori arşivlerinin bir arşiv sayfası gibi olacak.

Sitemdeki her kategorinin, kategorinin kalıcı bağlantısına uyacak şekilde manuel olarak oluşturulan özel bir küçük resmi vardır. Zaten tüm kategorileri görüntülemek için bir düzen kurulum var ama bunu özel bir sayfa şablonu ile yapıyorum, bu yüzden sayfalandırma yok. Bu, tüm kategorilerin tek bir sayfada biraz sinir bozucu (100+ kategorim var) gösterdiği anlamına gelir.

Geçerli arşivim belirli bir özel sayfa şablonu adıyla ayarlandı, page-catlist.phpancak bunu başka bir şablon dosyası türüyle değiştirmek istiyorum.

İşte tüm kategorileri bir sayfada çıktılamak için kullandığım kod:

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

Bunu yapmanın daha iyi bir yolu olduğunu umuyorum, böylece doğal sayfalamayı, ideal olarak WP-PageNavi ile ekleyebilirim. Herhangi bir yardım büyük mutluluk duyacağız!


Bu çok çaba
gösterecek

@Sumit aslında hiç çaba ile oldukça kolaydır ;-)
Pieter Goosen

Yanıtlar:


2

Bir terim / kategori / etiket listesi sayfalamak oldukça kolaydır ve bunu başarmak için çok az bilgiye ihtiyacınız vardır.

İhtiyacımız olana bakalım

  • şartların miktarı

  • sayfa başına terim miktarı

  • get_terms()( 4.5 sürümünde kullanımının get_terms()değiştiğine dikkat edin ). Ayrıca kullanabilirsiniz get_categories()dilerseniz get_categories()sadece bir sarıcı fonksiyonudurget_terms()

Bu yüzden önce terimlerin miktarını saymamız gerekiyor. Bunun için şu countparametreyi kullanacağız :get_terms()

NOT:

  • Tüm kod test edilmemiştir ve en azından

    • PHP 5.4

    • WordPress 4.5

Bunu PHP ve WordPress'in eski sürümleriyle çalışacak şekilde kolayca dönüştürebilirsiniz

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

Artık terimlerin miktarını bildiğimize göre, sayfa başına ihtiyacımız olan terimlerin miktarını ayarlayabiliriz.

$terms_per_page = 10;

Yukarıdan, şimdi kaç sayfaya sahip olacağımızı çözebiliriz. Buradaki değer, istediğiniz sayfa numaralandırma işlevine,wp_pagenavi()

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

Bu durumda, $max_num_pagessayfalandırma işlevinize geçersiniz

Bir sonraki kısım ofsetimizi hesaplamak olacaktır. İşleri optimize etmek için sayfa başına yalnızca ilgili terim miktarını almak istiyoruz. Sayfa başına 100'den fazla terime ihtiyacımız yok. Sadece gerekli 10'u sorgulamak çok daha hızlıdır. Yani, hangi sayfada olduğumuzu bilmeliyiz, bundan bir ofset hesaplayacağız. Bu geçilecek get_terms()ve söyleyecektir get_terms()ilk başlangıç noktasından atlamak kaç terim.

Bunu yaptıktan sonra, get_terms()sadece 10 terimi iade etmeyi söylemeliyiz . Bu parçanın koduna bakalım

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

Sayfalandırmaya göre sayfa başına yalnızca 10 terim olacak. Artık terimleriniz arasında normal bir şekilde döngü yapabilirsiniz

Sadece bir not, gerçekten get_terms()işlevinizden döndürülen terimler olduğundan emin olmak istersiniz .


Cool;) Ama sayfalandırma işaretlemesini nasıl oluşturamadım? wp_pagnavi()bu durumda gerçekten çalışacak mı?
Sumit

1
İle çalışacak bu @Sumit next_posts_link(), previous_posts_link()ve paginate_links(). Benim çağrı fonksiyonu gibi, işlevine bir tamsayı değeri geçebilir nereye Ayrıca herhangi çağrı fonksiyonu ile çalışacak burada . Bildiğim kadarıyla wp_pagenavi(), evet ya da hayır diyemem, bu işlevin nasıl çalıştığını gerçekten bilmiyorum, test etmeniz gerekecek. Yukarıdaki $max_num_pageskodumda, sayfaların miktarını tutar, bir tamsayı değeridir, sayfalamayı hesaplamak için işlevlere geçmeniz gereken bu değişkendir
Pieter Goosen

1
Bu çözümlerin her ikisinin de kesinlikle işe yarayabileceğini düşündüğüm için hem siz hem de @cjbj'ye özel teşekkürler. Etrafa baktıktan sonra nasıl çalıştığını açıklayan bazı WP-PageNavi şeyleri buldum ... Verilen her zaman bu çözümlerin en iyisi olduğunu düşünmek için özel bir sayfalama yapmak her zaman mümkündür .
gelleproductions

1

WP-PageNavi'ye aşina değilim, ancak gönderilerle uğraştığını varsayar, bu yüzden sizinki gibi bir döngüde kullanırsanız kolayca bozulabilir. Belki css hala html'nizi şekillendirmede yardımcı olabilir. Her neyse, kendi sayfalarınızı oluşturmak o kadar da zor değil.

İlk olarak, kaç kategori olduğunu bilmeniz gerekir:

$cat_amounts=count($cats);

Ardından, sayfa başına kaç öğe istediğinizi belirlemeniz gerekir:

$cats_per_page=20;

Bu size sayfa sayısını verecektir:

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

İhtiyacınız olan üçüncü bilgi, bulunduğunuz sayfadır. query_varURL'nizi tanıtarak bunu takip edebilirsiniz. Daha sonra şöyle görünecektir:www.example.com/yourcatpage?catpage=2

Döngüye başlamadan önce, hangi sayfanın çağrıldığını bilmeniz gerekir:

$page_called=get_query_var ( $catpage, 1 )

Bundan, görüntülemek istediğiniz ilk elemanı çağırabilirsiniz:

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

ve sonuncusu:

$last_element=$page_called*$cats_per_page-1;

Son sayfa $cats_per_pagekategorilerden daha az içerebilir , bu nedenle ek olarak aşağıdakilere ihtiyacınız vardır:

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

Şimdi, istenen öğeler arasında dolaşın $cats:

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

Döngüden sonra değişkenleri kullanarak önceki / sonraki etiketleri veya başka bir gezinme türünü oluşturabilirsiniz.

Bu kodu gerçekten test etmediğime dikkat edin. Bir dizideki ilk öğenin anahtar 0 olduğunu dikkate alırken bazı hatalar yapmış olabilirim.


Daha temiz ve hızlı olan çok daha kolay bir yaklaşım var ;-)
Pieter Goosen

Aslında yaklaşımlarımızın bu kadar farklı olduğunu düşünmüyorum. MySQL ofseti işlemesine izin veriyorsunuz, PHP'ye bırakıyorum
cjbj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.