รับหมายเลขหน้าปัจจุบัน


15

ในสถานการณ์ที่มี 20 โพสต์ต่อหน้า ฉันต้องการรับหมายเลขหน้าปัจจุบันเพื่อสร้างลิงก์ของหน้าดี ๆ ที่ด้านล่าง คุณจะได้รับหน้าปัจจุบันได้อย่างไร ฉันลองสิ่งนี้

<?php echo '(Page '.$page.' of '.$numpages.')'; ?>

และมันก็บอกว่าหน้า 1 จาก 1 ในทุกหน้า

ความคิดใด ๆ

มหัศจรรย์

คำตอบ:


23

เมื่อ WordPress ใช้การแบ่งหน้าแบบนี้จะมีตัวแปรคิวรี$pagedที่คีย์ ดังนั้นหน้า 1 $paged=1และหน้า $paged=1515

คุณสามารถรับค่าของตัวแปรนี้ด้วยรหัสต่อไปนี้:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

การได้รับจำนวนหน้าทั้งหมดค่อนข้างยุ่งยาก ก่อนอื่นคุณต้องนับโพสต์ทั้งหมดในฐานข้อมูล จากนั้นกรองตามที่โพสต์เผยแพร่ (เทียบกับแบบร่างกำหนดเวลาถังขยะ ฯลฯ ) จากนั้นคุณต้องหารจำนวนนี้ด้วยจำนวนโพสต์ที่คุณคาดว่าจะปรากฏในแต่ละหน้า:

$total_post_count = wp_count_posts();
$published_post_count = $total_post_count->publish;
$total_pages = ceil( $published_post_count / $posts_per_page );

ฉันยังไม่ได้ทดสอบสิ่งนี้ แต่คุณอาจต้องดึงข้อมูล$posts_per_pageแบบเดียวกับที่คุณดึงข้อมูล$paged(โดยใช้get_query_var())


8
ทำไมไม่ใช้$wp_query->max_num_pages?
t31os

1
นั่นเป็นทางเลือกเสียง ส่วนหนึ่งของ$wp_queryฉันลืมสนิทอยู่ที่นั่น: - /
EAMann

@EAMann BTW: นอกจากนี้ยังมีfound_postsคุณสมบัติ "จำนวนโพสต์ทั้งหมดที่พบที่ตรงกับพารามิเตอร์การค้นหาปัจจุบัน", wp_count_posts () เป็นประเภทของค่าใช้จ่าย
jave.web

8

คุณสามารถทำได้ด้วยรหัสบรรทัดเดียว แต่จากนั้นอีกครั้งคุณอาจต้องการเพิ่มรหัสในที่อื่น ๆ ดังนั้นฟังก์ชันมักจะมีประโยชน์มากกว่า

function current_paged( $var = '' ) {
    if( empty( $var ) ) {
        global $wp_query;
        if( !isset( $wp_query->max_num_pages ) )
            return;
        $pages = $wp_query->max_num_pages;
    }
    else {
        global $$var;
            if( !is_a( $$var, 'WP_Query' ) )
                return;
        if( !isset( $$var->max_num_pages ) || !isset( $$var ) )
            return;
        $pages = absint( $$var->max_num_pages );
    }
    if( $pages < 1 )
        return;
    $page = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
    echo 'Page ' . $page . ' of ' . $pages;
}

หมายเหตุ:รหัสสามารถเข้าไปในไฟล์ฟังก์ชั่นของคุณ

เพียงเรียกใช้ฟังก์ชันที่คุณต้องการแสดงข้อความ "หน้า x ของ y" เช่น

<?php current_paged(); ?>

หากคุณต้องการรหัสเพื่อทำงานกับแบบสอบถามที่กำหนดเองเช่น สิ่งที่คุณสร้างขึ้นโดยใช้WP_Queryจากนั้นส่งต่อตามชื่อของตัวแปรที่เก็บเคียวรีไปยังฟังก์ชัน

ตัวอย่างแบบสอบถามที่ไม่มีอยู่:

$fred = new WP_Query;
$fred->query();
if( $fred->have_posts() ) 
... etc..

รับหน้าปัจจุบันสำหรับแบบสอบถามแบบกำหนดเองโดยใช้ฟังก์ชันที่โพสต์ก่อนหน้านี้ ..

<?php current_paged( 'fred' ); ?>

หากคุณต้องการลืมการสนับสนุนแบบสอบถามที่กำหนดเองโดยสิ้นเชิงและคุณกำลังมองหาซับไลน์จากนั้นก็ควรทำ ..

<?php echo 'Page '. ( get_query_var('paged') ? get_query_var('paged') : 1 ) . ' of ' . $wp_query->max_num_pages; ?>

หวังว่าจะช่วย .. :)


1
ถ้าฉันเป็นคุณฉันจะตรวจสอบว่า$varเป็นแบบสอบถาม: if( is_a( $var, 'WP_Query' ) )จะกลับจริงถ้ามันเป็นวัตถุแบบสอบถาม
John P Bloch

ใช่มันเป็นความคิดที่สมเหตุสมผลมากจริง ๆ แล้ว!
t31os


0

ตัวเลือกหนึ่งที่ใช้ได้กับหน้าเก็บถาวรทั้งหมดของฉันคือ:

$paged_maxnum = $GLOBALS['wp_query']->max_num_pages;

if ( $paged_maxnum > 1 ) {

    $paged_current_page = get_query_var( 'paged' ) ? intval( get_query_var( 'paged' ) ) : 1;
    $title_page_nrs = 'page nr ' . $paged_current_page . ' of ' . $paged_maxnum;

    echo '<title>' . get_the_archive_title( '', false ) . ' - ' . $title_page_nrs . ' | Your Website Name</title>';

} else {

    echo '<title>' . get_the_archive_title( '', false ) . ' | Your Website Name</title>'; 

}

แบบสอบถามแรกถ้ามีมากกว่าหนึ่งหน้าในเรื่องนี้wp_queryแล้วชื่อ concatenate กับหน้าปัจจุบันผ่านและหน้าทั้งหมดที่มี$paged_current_page $title_page_nrsในที่สุดechoมัน หากเหนือกว่า 1 หน้าเป็นอันดับแรกแสดงelseว่าไม่มีการเพจ สิ่งนี้จะลงในไฟล์เก็บถาวรของฉัน php หรือเทมเพลตสำหรับประเภทนี้ มันผลิต:

<title>Taxonomy title - page nr 1 of 4 | Your Website Name</title>

หรือ

<title>Taxonomy title | Your Website Name</title>

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