วิธีการสร้างรายการที่รวบรวมทุกหมวดหมู่ในเว็บไซต์ของฉัน


9

ฉันต้องการแสดงหน้าการเก็บถาวรที่มีการแบ่งหน้าซึ่งแสดงรายการหมวดหมู่ทั้งหมดในเว็บไซต์ของฉันและแต่ละลิงก์จะไปที่หน้าเก็บถาวรหมวดหมู่นั้น ๆ ดังนั้นนี่จะเป็นหน้าเก็บถาวรของหมวดหมู่ที่เก็บถาวร

แต่ละหมวดหมู่ในเว็บไซต์ของฉันมีภาพขนาดย่อที่กำหนดเองที่สร้างขึ้นด้วยตนเองเพื่อให้ตรงกับความคิดเห็นของหมวดหมู่ ฉันมีการตั้งค่าเค้าโครงเพื่อแสดงหมวดหมู่ทั้งหมด แต่ฉันทำสิ่งนี้ด้วยเทมเพลตหน้าเว็บที่กำหนดเองดังนั้นจึงไม่มีการแบ่งหน้า ซึ่งหมายความว่าทุกหมวดหมู่แสดงในหน้าเดียวซึ่งน่ารำคาญเล็กน้อย (ฉันมีมากกว่า 100 หมวดหมู่)

ที่เก็บถาวรปัจจุบันของฉันกำลังตั้งค่าด้วยชื่อเทมเพลตของหน้าเว็บที่กำหนดเองpage-catlist.phpแต่ฉันยินดีที่จะเปลี่ยนเป็นไฟล์เทมเพลตชนิดอื่น

นี่คือรหัสปัจจุบันที่ฉันใช้เพื่อส่งออกหมวดหมู่ทั้งหมดในหน้าเดียว:

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

ฉันหวังว่าจะมีวิธีที่ดีกว่าในการทำเช่นนี้เพื่อให้ฉันสามารถเพิ่มการแบ่งหน้าตามธรรมชาติโดยเฉพาะอย่างยิ่งกับ WP-PageNavi ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก!


นั่นจะเป็นความพยายามอย่างมาก;)
Sumit

@Sumit มันค่อนข้างง่ายจริง ๆ โดยไม่ต้องใช้ความพยายามเลย ;-)
Goosen Pieter

คำตอบ:


2

การเพจรายการคำ / หมวดหมู่ / แท็กนั้นค่อนข้างง่ายและเพื่อให้บรรลุนั้นคุณต้องมีข้อมูลน้อยที่สุด

ให้ดูที่เราต้องการ

  • จำนวนเงื่อนไข

  • จำนวนคำศัพท์ต่อหน้า

  • get_terms()( เพิ่งทราบการใช้งานของget_terms()มีการเปลี่ยนแปลงในรุ่น 4.5 ) นอกจากนี้คุณยังสามารถใช้get_categories()ถ้าคุณต้องการget_categories()มันเป็นเพียงฟังก์ชั่นสำหรับห่อหุ้มget_terms()

ดังนั้นก่อนอื่นเราต้องนับจำนวนเทอม สำหรับสิ่งนี้เราจะใช้countพารามิเตอร์ในget_terms()

บันทึก:

  • รหัสทั้งหมดยังไม่ได้ทดสอบและต้องการอย่างน้อย

    • PHP 5.4

    • WordPress 4.5

คุณสามารถแปลงให้ทำงานกับ PHP และ WordPress เวอร์ชันเก่าได้อย่างง่ายดาย

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

เมื่อเราทราบจำนวนคำแล้วเราสามารถกำหนดจำนวนคำศัพท์ที่เราต้องการต่อหน้าตอนนี้ให้บอกว่า 10

$terms_per_page = 10;

จากด้านบนตอนนี้เราสามารถคำนวณจำนวนหน้าได้ ค่าที่นี่จะถูกส่งผ่านไปยังฟังก์ชันการให้เลขหน้าในกรณีของคุณถึงwp_pagenavi()

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

ในกรณีนี้คุณจะผ่าน$max_num_pagesไปยังฟังก์ชั่นการให้เลขหน้าของคุณ

ส่วนถัดไปคือการคำนวณออฟเซตของเรา เราต้องการดึงจำนวนคำศัพท์ที่เกี่ยวข้องต่อหน้าเพื่อให้ทุกอย่างมีประสิทธิภาพสูงสุด เราไม่ต้องการทั้งหมด 100+ เงื่อนไขต่อหน้า การค้นหาเฉพาะ 10 ที่ต้องการนั้นเร็วกว่ามาก ดังนั้นเราจำเป็นต้องรู้ว่าเราอยู่หน้าไหนเราจะคำนวณค่าชดเชย สิ่งนี้จะถูกส่งไปยังget_terms()และจะบอกget_terms()จำนวนคำที่จะข้ามจากจุดเริ่มต้นเริ่มต้น

เมื่อได้รับแล้วเราจะต้องบอกget_terms()ให้ส่งคืนเพียง 10 เทอม ลองดูรหัสสำหรับชิ้นนี้

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

คุณจะมี 10 เงื่อนไขต่อหน้าตามการแบ่งหน้า ตอนนี้คุณสามารถวนซ้ำตามข้อกำหนดของคุณ

เพียงแค่บันทึกคุณจะต้องแน่ใจว่าคุณได้รับคืนเงื่อนไขจากget_terms()ฟังก์ชันของคุณ


เจ๋ง;) แต่ฉันไม่ได้สร้างการให้เลขหน้า wp_pagnavi()จะใช้งานได้ในกรณีนี้จริงหรือ
Sumit

1
@Sumit นี้จะทำงานร่วมกับnext_posts_link(), และprevious_posts_link() paginate_links()นอกจากนี้ยังจะทำงานร่วมกับฟังก์ชั่นเพจใด ๆ ที่คุณสามารถส่งผ่านค่าจำนวนเต็มฟังก์ชั่นเช่นฟังก์ชั่นเพจของฉันที่นี่ สำหรับส่วนใหญ่wp_pagenavi()แล้วฉันไม่สามารถพูดว่าใช่หรือไม่ใช่เพราะฉันไม่รู้จริงๆว่าฟังก์ชั่นนี้ทำงานอย่างไรคุณจะต้องทดสอบมัน ในรหัสของฉันข้างต้น$max_num_pagesถือจำนวนหน้ามันเป็นค่าจำนวนเต็มเป็นตัวแปรนี้คุณต้องผ่านไปยังฟังก์ชั่นในการคำนวณเลขหน้า
Pieter Goosen

1
ขอขอบคุณทั้งคุณและ @cjbj เนื่องจากฉันคิดว่าโซลูชันทั้งสองนี้สามารถใช้งานได้อย่างแน่นอน หลังจากมองไปรอบ ๆ ฉันพบสิ่งWP-PageNaviอธิบายว่ามันทำงานอย่างไร ... ได้รับมันเป็นไปได้เสมอที่จะหมุนหน้าเลขที่กำหนดเองดังนั้นฉันคิดว่าวิธีแก้ปัญหาเหล่านี้ดีที่สุด
gelleproductions

1

ฉันไม่คุ้นเคยกับ WP-PageNavi แต่ฉันคิดว่ามันน่าจะเกี่ยวข้องกับการโพสต์ดังนั้นมันอาจจะล้มเหลวได้ง่ายถ้าคุณใช้มันแบบวนซ้ำเหมือนคุณ บางที css อาจยังมีประโยชน์ในการกำหนดสไตล์ html ของคุณ อย่างไรก็ตามการตั้งค่าเลขหน้าของคุณเองนั้นไม่ใช่เรื่องยาก

ก่อนอื่นคุณต้องรู้ว่ามีกี่หมวดหมู่:

$cat_amounts=count($cats);

ถัดไปคุณต้องกำหนดจำนวนรายการต่อหน้าที่คุณต้องการ:

$cats_per_page=20;

สิ่งนี้จะทำให้คุณมีจำนวนหน้า:

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

ข้อมูลชิ้นที่สามที่คุณต้องการคือหน้าที่คุณอยู่ คุณสามารถติดตามสิ่งนี้ได้โดยการแนะนำquery_varURL ของคุณจากนั้นจะมีลักษณะดังนี้:www.example.com/yourcatpage?catpage=2

ก่อนที่คุณจะเริ่มลูปคุณต้องทราบว่าเพจใดที่เรียกว่า:

$page_called=get_query_var ( $catpage, 1 )

จากนี้คุณสามารถเรียกองค์ประกอบแรกที่คุณต้องการแสดง:

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

และอันสุดท้าย:

$last_element=$page_called*$cats_per_page-1;

หน้าสุดท้ายอาจมีน้อยกว่า$cats_per_pageหมวดหมู่ดังนั้นคุณต้องเพิ่มเติมด้วย:

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

ตอนนี้วนรอบองค์ประกอบที่ต้องการของ$cats:

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

หลังจากลูปคุณสามารถใช้ตัวแปรเพื่อสร้างแท็กก่อนหน้า / ถัดไปหรือไม่ก็นำทางประเภทอื่น ๆ

ระวังว่าฉันไม่ได้ทดสอบรหัสนี้ ฉันอาจทำผิดพลาดบางอย่างเมื่อพิจารณาว่าองค์ประกอบแรกในอาร์เรย์มีคีย์ 0


มีวิธีที่ง่ายกว่ามากซึ่งสะอาดและเร็วกว่า ;-)
Pieter Goosen

จริงๆแล้วฉันไม่คิดว่าวิธีการของเราจะแตกต่างกัน คุณปล่อยให้ MySQL จัดการออฟเซ็ตผมปล่อยให้มันเป็น PHP
cjbj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.