Làm thế nào để tạo một danh sách được xếp hạng của tất cả các danh mục trên trang web của tôi?


9

Tôi muốn hiển thị một trang lưu trữ với phân trang liệt kê tất cả các danh mục trên trang web của tôi và mỗi liên kết đến trang lưu trữ danh mục cụ thể đó. Vì vậy, đây sẽ giống như một trang lưu trữ của tài liệu lưu trữ thể loại.

Mỗi danh mục trên trang web của tôi có hình thu nhỏ tùy chỉnh được tạo thủ công để khớp với permalink của danh mục. Tôi đã có một thiết lập bố cục để hiển thị tất cả các danh mục nhưng tôi đang thực hiện việc này với một mẫu trang tùy chỉnh, do đó không có phân trang. Điều này có nghĩa là tất cả các danh mục hiển thị trên một trang gây khó chịu (tôi có hơn 100 danh mục).

Kho lưu trữ hiện tại của tôi được thiết lập với một tên mẫu trang tùy chỉnh cụ thể page-catlist.phpnhưng tôi sẵn sàng thay đổi tên này thành bất kỳ loại tệp mẫu nào khác.

Đây là mã hiện tại tôi đang sử dụng để xuất tất cả các danh mục trên một trang:

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

Tôi hy vọng có một cách tốt hơn để làm điều này để tôi có thể thêm phân trang tự nhiên, lý tưởng nhất là với WP-PageNavi. Mọi sự trợ giúp sẽ rất được trân trọng!


Đó sẽ là rất nhiều nỗ lực;)
Sumit

@Sumit nó thực sự khá dễ dàng mà không cần nỗ lực gì cả ;-)
Pieter Goosen

Câu trả lời:


2

Việc phân trang danh sách các thuật ngữ / danh mục / thẻ khá dễ dàng và để đạt được điều đó, bạn cần thông tin tối thiểu.

Hãy nhìn vào chúng tôi cần

  • số lượng điều khoản

  • số lượng điều khoản trên mỗi trang

  • get_terms()( Chỉ cần lưu ý, việc sử dụng get_terms()đã thay đổi trong phiên bản 4.5 ). Bạn cũng có thể sử dụng get_categories()nếu bạn muốn, get_categories()chỉ là một chức năng bao bọc choget_terms()

Vì vậy, trước tiên chúng ta cần phải đếm số lượng điều khoản. Đối với điều này, chúng tôi sẽ sử dụng counttham số trongget_terms()

GHI CHÚ:

  • Tất cả các mã chưa được kiểm tra và yêu cầu ít nhất

    • PHP 5.4

    • WordPress 4.5

Bạn có thể dễ dàng chuyển đổi nó để hoạt động với các phiên bản PHP và WordPress cũ hơn

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

Bây giờ chúng tôi đã biết số lượng điều khoản, chúng tôi có thể đặt số lượng điều khoản chúng tôi cần cho mỗi trang, giả sử 10

$terms_per_page = 10;

Từ những điều trên, bây giờ chúng ta có thể tìm ra chúng ta sẽ có bao nhiêu trang. Giá trị ở đây sẽ được chuyển đến hàm yêu cầu phân trang, trong trường hợp của bạn, đểwp_pagenavi()

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

Trong trường hợp này, bạn sẽ chuyển $max_num_pagesđến chức năng phân trang của bạn

Phần tiếp theo sẽ là tính toán bù đắp của chúng tôi. Chúng tôi chỉ muốn truy xuất số lượng điều khoản có liên quan trên mỗi trang để giữ cho mọi thứ được tối ưu hóa. Chúng tôi không cần tất cả hơn 100 điều khoản trên mỗi trang. Truy vấn chỉ cần 10 là nhanh hơn nhiều. Vì vậy, chúng ta cần biết chúng ta đang ở trang nào, từ đó, chúng ta sẽ tính toán một phần bù. Điều này sẽ được chuyển đến get_terms()và sẽ cho biết có get_terms()bao nhiêu điều khoản bỏ qua từ điểm bắt đầu ban đầu.

Khi đã có điều đó, chúng tôi cũng phải nói get_terms()chỉ trả lại 10 điều khoản. Hãy nhìn vào mã cho phần này

$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ạn sẽ chỉ có 10 điều khoản trên mỗi trang theo phân trang. Bây giờ bạn có thể lặp lại bình thường thông qua các điều khoản của bạn

Chỉ cần một lưu ý, bạn sẽ muốn đảm bảo rằng bạn thực sự có các điều khoản được trả về từ get_terms()chức năng của bạn .


Thật tuyệt;) Nhưng tôi đã không làm thế nào để xây dựng đánh dấu phân trang? wp_pagnavi()sẽ thực sự làm việc trong trường hợp này?
Sumit

1
@Sumit điều này sẽ làm việc với next_posts_link(), previous_posts_link()paginate_links(). Nó cũng sẽ hoạt động với bất kỳ chức năng phân trang nào trong đó bạn có thể chuyển một giá trị nguyên cho hàm, như hàm phân trang của tôi ở đây . Theo như wp_pagenavi()tôi không thể nói có hay không vì tôi thực sự không biết chức năng đó hoạt động như thế nào, bạn sẽ cần phải kiểm tra nó. Trong mã của tôi ở trên, $max_num_pageschứa số lượng trang, nó là một giá trị số nguyên, đây là biến bạn cần chuyển đến các hàm để tính toán phân trang
Pieter Goosen

1
Đặc biệt cảm ơn cả bạn và @cjbj vì tôi nghĩ cả hai giải pháp này chắc chắn có thể hoạt động. Sau khi nhìn xung quanh tôi đã tìm thấy một số nội dung WP-PageNavi giải thích cách thức hoạt động của nó ... Được cấp luôn luôn có thể cuộn một phân trang tùy chỉnh để tôi nghĩ những giải pháp này là tốt nhất.
gelleproductions

1

Tôi không quen thuộc với WP-PageNavi, nhưng tôi nghi ngờ rằng nó giả định là đang xử lý các bài đăng, vì vậy nó có thể dễ dàng làm hỏng nếu bạn sử dụng nó trên một vòng lặp như của bạn. Có lẽ css vẫn có thể hữu ích trong việc tạo kiểu html của bạn. Dù sao, thiết lập phân trang của riêng bạn không phải là khó khăn.

Trước tiên, bạn cần biết có bao nhiêu loại:

$cat_amounts=count($cats);

Tiếp theo, bạn cần xác định có bao nhiêu mục trên mỗi trang bạn muốn:

$cats_per_page=20;

Điều này sẽ cung cấp cho bạn số lượng trang:

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

Phần thứ ba của thông tin bạn cần là trang bạn đang truy cập. Bạn có thể theo dõi điều này bằng cách giới thiệu query_varurl của bạn sau đó sẽ trông giống như thế này:www.example.com/yourcatpage?catpage=2

Trước khi bắt đầu vòng lặp, bạn cần biết trang nào được gọi là:

$page_called=get_query_var ( $catpage, 1 )

Từ đây, bạn có thể gọi phần tử đầu tiên bạn muốn hiển thị:

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

và điều cuối cùng:

$last_element=$page_called*$cats_per_page-1;

Trang cuối cùng có thể chứa ít hơn $cats_per_pagedanh mục, do đó, bạn cần thêm:

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

Bây giờ, lặp qua các yếu tố mong muốn của $cats:

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

Sau vòng lặp, bạn có thể sử dụng các biến để tạo các thẻ trước / tiếp theo hoặc loại điều hướng khác.

Coi chừng tôi không thực sự kiểm tra mã này. Tôi có thể đã phạm một số sai lầm khi tính đến yếu tố đầu tiên trong một mảng có khóa 0.


Có một cách tiếp cận dễ dàng hơn, sạch hơn và nhanh hơn ;-)
Pieter Goosen

Trên thực tế, tôi không nghĩ rằng cách tiếp cận của chúng tôi là khác nhau. Bạn để MySQL xử lý phần bù, tôi để nó cho PHP.
cjbj
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.