วิธีแสดงลิงค์เลขหน้าสำหรับ WP_User_Query


10

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

รหัสของฉันอยู่ด้านล่าง แต่ฉันไม่รู้วิธีรับลิงก์เพื่อนำทางระหว่างหน้าต่างๆของผู้แต่งเพื่อให้ทำงานได้ มีใครช่วยฉันบ้าง ฉันมีความรู้สึกว่านี่อาจเป็นประโยชน์ แต่ฉันไม่รู้ว่าจะใช้งานอย่างไร:

paginate_links ()

ขอบคุณ

Osu

    <?php 
/* ****************************************************************** */
                        /* !LIST AUTHORS */
/* ****************************************************************** */ 

// THANKS TO:
// http://www.mattvarone.com/wordpress/list-users-with-wp_user_query/

// pagination
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; // Needed for pagination
$paged -= 1;
$limit = 2;
$offset = $paged * $limit;

// prepare arguments
$args  = array(
    // search only for Authors role
    'role'      => 'Subscriber',
    // order results by display_name
    'orderby'   => 'display_name',
    // return all fields
    'fields'    => 'all_with_meta',
    'number'    => $limit,
    'offset'    => $offset      
);
// Create the WP_User_Query object
$wp_user_query = new WP_User_Query($args);
// Get the results
$authors = $wp_user_query->get_results();
// Check for results
if (!empty($authors))
{
    echo '<div class="author-entry">';
    // loop trough each author
    foreach ($authors as $author)
    {
        $author_info = get_userdata($author->ID); ?>

        <span style="float:left;padding:0 5px 0 0;"><?php echo get_avatar( $author->ID, 50 ); /* http://codex.wordpress.org/Function_Reference/get_avatar */ ?></span>
        <span class="fn"><strong>First name</strong> : <?php echo $author_info->first_name; ?></span><br />
        <span class="ln"><strong>Last name</strong> : <?php echo $author_info->last_name; ?></span><br />
        <span class="em"><strong>Email address</strong> : <a href="mailto:<?php echo $author_info->user_email; ?>"><?php echo $author_info->user_email; ?></a></span><br />
        <span class="we"><strong>Website</strong> : <a href="<?php echo $author_info->user_url; ?>"><?php echo $author_info->user_url; ?></a></span><br />

        <span class="de"><strong>Bio</strong> :<br /><?php echo $author_info->description ; ?></span>
        <div class="clear">&nbsp;</div>

    <?php 
    }
    echo '</div>';
} else {
    echo 'No authors found';
}
?>

<?php /* WHAT DO I PUT HERE TO CREATE THE PAGINATION LINKS? */ ?>

หากคุณกำลังมองหาอาแจ็กซ์จากนั้นไปที่นี่ wordpress.stackexchange.com/questions/113379/ …
Sabir Abdul Gafoor Shaikh

คำตอบ:


17

สิ่งนี้จะทำให้คุณใกล้ชิดจริงๆ ฉันไม่ได้ทำการทดสอบ แต่มันเกือบจะเหมือนกับการตั้งค่าที่ฉันใช้ไปสองสามครั้ง

/*
 * We start by doing a query to retrieve all users
 * We need a total user count so that we can calculate how many pages there are
 */

$count_args  = array(
    'role'      => 'Subscriber',
    'fields'    => 'all_with_meta',
    'number'    => 999999      
);
$user_count_query = new WP_User_Query($count_args);
$user_count = $user_count_query->get_results();

// count the number of users found in the query
$total_users = $user_count ? count($user_count) : 1;

// grab the current page number and set to 1 if no page number is set
$page = isset($_GET['p']) ? $_GET['p'] : 1;

// how many users to show per page
$users_per_page = 5;

// calculate the total number of pages.
$total_pages = 1;
$offset = $users_per_page * ($page - 1);
$total_pages = ceil($total_users / $users_per_page);


// main user query
$args  = array(
    // search only for Authors role
    'role'      => 'Subscriber',
    // order results by display_name
    'orderby'   => 'display_name',
    // return all fields
    'fields'    => 'all_with_meta',
    'number'    => $users_per_page,
    'offset'    => $offset // skip the number of users that we have per page  
);

// Create the WP_User_Query object
$wp_user_query = new WP_User_Query($args);

// Get the results
$authors = $wp_user_query->get_results();

// check to see if we have users
if (!empty($authors))
{
    echo '<div class="author-entry">';
    // loop trough each author
    foreach ($authors as $author)
    {
        $author_info = get_userdata($author->ID); ?>

        <span style="float:left;padding:0 5px 0 0;"><?php echo get_avatar( $author->ID, 50 ); /* http://codex.wordpress.org/Function_Reference/get_avatar */ ?></span>
        <span class="fn"><strong>First name</strong> : <?php echo $author_info->first_name; ?></span><br />
        <span class="ln"><strong>Last name</strong> : <?php echo $author_info->last_name; ?></span><br />
        <span class="em"><strong>Email address</strong> : <a href="mailto:<?php echo $author_info->user_email; ?>"><?php echo $author_info->user_email; ?></a></span><br />
        <span class="we"><strong>Website</strong> : <a href="<?php echo $author_info->user_url; ?>"><?php echo $author_info->user_url; ?></a></span><br />

        <span class="de"><strong>Bio</strong> :<br /><?php echo $author_info->description ; ?></span>
        <div class="clear">&nbsp;</div>

    <?php 
    }
    echo '</div>';
} else {
    echo 'No authors found';
}

// grab the current query parameters
$query_string = $_SERVER['QUERY_STRING'];

// The $base variable stores the complete URL to our page, including the current page arg

// if in the admin, your base should be the admin URL + your page
$base = admin_url('your-page-path') . '?' . remove_query_arg('p', $query_string) . '%_%';

// if on the front end, your base is the current page
//$base = get_permalink( get_the_ID() ) . '?' . remove_query_arg('p', $query_string) . '%_%';

echo paginate_links( array(
    'base' => $base, // the base URL, including query arg
    'format' => '&p=%#%', // this defines the query parameter that will be used, in this case "p"
    'prev_text' => __('&laquo; Previous'), // text for previous page
    'next_text' => __('Next &raquo;'), // text for next page
    'total' => $total_pages, // the total number of pages we have
    'current' => $page, // the current page
    'end_size' => 1,
    'mid_size' => 5,
));

2
1 จะได้มีความสุขถ้ารหัสจะ splitted และอธิบาย :)
Kaiser

5
มีเพิ่มบางความเห็นที่ดีขึ้นและการแก้ไขข้อผิดพลาดหรือสอง :)
ปิ๊ปปิ้น

ขอบคุณสำหรับ @Pippin นี้ฉันจะลองใช้เมื่อเข้าห้องสตูดิโอ คำถามหนึ่ง: ฉันจะใส่อะไรในส่วน 'your-page-path' ของ admin_url? นั่นคือรากของเว็บไซต์ของฉันหรือไม่
Osu

หน้าเว็บที่แสดงผู้ใช้ของคุณในผู้ดูแลระบบหรือส่วนหน้าใช่ไหม
Pippin

1
แนวทางที่น่าสนใจ ฉันสังเกตเห็นว่าคุณกำลังเรียกใช้ 2 ข้อความค้นหาที่นี่: คนแรกที่ได้รับผู้ใช้ทั้งหมดและคนที่สองเพื่อรับเฉพาะผู้ใช้ในหน้าเว็บที่เหมาะสม มันจะไม่ทำงานได้ดีขึ้นถ้าคุณใช้เพียง 1 แบบสอบถามแล้วใช้ array_slice เพื่อแยกผลลัพธ์ออกเป็นหน้า? ดูเหมือนว่าคุณกำลังทำการสืบค้นที่แตกต่างกัน 2 รายการในข้อมูลเดียวกับที่คุณสามารถบันทึกประสิทธิภาพบางอย่างได้โดยการทิ้งไว้
codescribblr

11

คุณไม่ควรใช้คำตอบโดย Pippin แบบสอบถามไม่มีประสิทธิภาพมาก $user_count_queryในตัวอย่างสามารถส่งคืนผู้ใช้สูงสุด 999,999 คนจากฐานข้อมูลของคุณไปยังสคริปต์ของคุณพร้อมฟิลด์ผู้ใช้ทั้งหมด สิ่งนี้จะส่งผลกระทบต่อหน่วยความจำและ / หรือการ จำกัด เวลาสำหรับ PHP หาก / เมื่อเว็บไซต์ของคุณมีขนาดใหญ่พอ

แต่นั่นอาจเป็นทางออกเดียวในปี 2555

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

<?php

// Pagination vars
$current_page = get_query_var('paged') ? (int) get_query_var('paged') : 1;
$users_per_page = 2; // RAISE THIS AFTER TESTING ;)

$args = array(
    'number' => $users_per_page, // How many per page
    'paged' => $current_page // What page to get, starting from 1.
);

$users = new WP_User_Query( $args );

$total_users = $users->get_total(); // How many users we have in total (beyond the current page)
$num_pages = ceil($total_users / $users_per_page); // How many pages of users we will need

?>
    <h3>Page <?php echo $current_page; ?> of <?php echo $num_pages; ?></h3>
    <p>Displaying <?php echo $users_per_page; ?> of <?php echo $total_users; ?> users</p>

    <table>
        <thead>
            <tr>
                <th>First Name</th>
                <th>Last Name</th>
                <th>Email</th>
            </tr>
        </thead>

        <tbody>
            <?php
            if ( $users->get_results() ) foreach( $users->get_results() as $user )  {
                $firstname = $user->first_name;
                $lastname = $user->last_name;
                $email = $user->user_email;
                ?>
                <tr>
                    <td><?php echo esc_html($firstname); ?></td>
                    <td><?php echo esc_html($lastname); ?></td>
                    <td><?php echo esc_html($email); ?></td>
                </tr>
                <?php
            }
            ?>
        </tbody>
    </table>

    <p>
        <?php
        // Previous page
        if ( $current_page > 1 ) {
            echo '<a href="'. add_query_arg(array('paged' => $current_page-1)) .'">Previous Page</a>';
        }

        // Next page
        if ( $current_page < $num_pages ) {
            echo '<a href="'. add_query_arg(array('paged' => $current_page+1)) .'">Next Page</a>';
        }
        ?>
    </p>

ตัวอย่างที่แสดงหน้า 2:

สารบัญของผู้ใช้เริ่มต้นที่หน้า 2


อัปเดต 6/8/2561: วิธีเพิ่มหมายเลขหน้าแทนถัดไป / ก่อนหน้า

หากคุณต้องการมีหมายเลขหน้าแทนการเชื่อมโยงหน้าถัดไป / ก่อนหน้านี่คือวิธีการตั้งค่า โปรดทราบว่าคุณจะต้องแทนที่ตัวเลขด้วยการเชื่อมโยงหน้าพวกเขาจะไม่สามารถคลิกได้ในตัวอย่างนี้ (ขึ้นอยู่กับhttps://stackoverflow.com/a/11274294/470480แก้ไขเพื่อแสดงจำนวนกลางที่สอดคล้องกันและไม่เพิ่ม "... " เว้นแต่ว่าหน้าจะถูกข้ามไปจริง)

คุณสามารถดูไฟล์ gist ของฉันซึ่งมีฟังก์ชั่นที่ใช้ซ้ำได้สำหรับวัตถุประสงค์นี้

$current_page = 5; // Example
$num_pages = 10; // Example

$edge_number_count = 2; // Change this, optional

$start_number = $current_page - $edge_number_count;
$end_number = $current_page + $edge_number_count;

// Minus one so that we don't split the start number unnecessarily, eg: "1 ... 2 3" should start as "1 2 3"
if ( ($start_number - 1) < 1 ) {
    $start_number = 1;
    $end_number = min($num_pages, $start_number + ($edge_number_count*2));
}

// Add one so that we don't split the end number unnecessarily, eg: "8 9 ... 10" should stay as "8 9 10"
if ( ($end_number + 1) > $num_pages ) {
    $end_number = $num_pages;
    $start_number = max(1, $num_pages - ($edge_number_count*2));
}

if ($start_number > 1) echo " 1 ... ";

for($i=$start_number; $i<=$end_number; $i++) {
    if ( $i === $current_page ) echo " [{$i}] ";
    else echo " {$i} ";
}

if ($end_number < $num_pages) echo " ... {$num_pages} ";

เอาต์พุต (จากหน้า 1 ถึง 10):

[1]  2  3  4  5  ... 10 
1  [2]  3  4  5  ... 10 
1  2  [3]  4  5  ... 10 
1  2  3  [4]  5  ... 10 

1 ...  3  4  [5]  6  7  ... 10 
1 ...  4  5  [6]  7  8  ... 10 

1 ...  6  [7]  8  9  10
1 ...  6  7  [8]  9  10
1 ...  6  7  8  [9]  10
1 ...  6  7  8  9  [10]

ฉันเห็นด้วย. คำตอบของปิ๊ปปิ้นต้องใช้ 2 ฮิตกับฐานข้อมูลซึ่งควรหลีกเลี่ยงถ้าเป็นไปได้
ซูโม่

1
สวัสดี @ radley-sustaire นี่เป็นทางออกที่ดี แต่ฉันสงสัยว่าถ้ามีวิธีเปลี่ยนส่วน "การแสดง 2 จาก 6 ผู้ใช้" เป็นช่วงจริงของผู้ใช้ต่อหน้า ดังนั้นอย่างเช่น "การแสดง 1-2 จาก 6" สำหรับหน้า 1, "3-4 จาก 6" สำหรับหน้า 2 และ "5-6 จาก 6" สำหรับหน้า 3 ในขณะนี้มันก็แสดง "2 จาก 6" สำหรับ ทุกหน้า
damienoneill2001

1
@ damienoneill2001 นั่นเป็นความคิดที่ดีที่คุณสามารถเริ่มต้นด้วยสิ่งที่ชอบและ$start_user_num = (($current_page-1) * $users_per_page) + 1; $end_user_num = $start_user_num + count($users->get_results());
Radley Sustaire

@ RadleySustaire ยอดเยี่ยมขอบคุณสำหรับสิ่งนั้น ตอนแรกผมได้รับข้อผิดพลาดต่อไปนี้: Call to a member function get_results() on a non-objectดังนั้นผมจึงมีการแก้ไขเพิ่มเติม$end_user_numberการ$start_user_num + ($users_per_page-1);และแก้ปัญหา ขอบคุณอีกครั้ง!
damienoneill2001

กลับกลายเป็นว่าฉันพูดกับที่เร็ว ๆ นี้ เมื่อฉันไปถึงหน้าสุดท้ายที่ไม่มีรายชื่อผู้ใช้เต็มรูปแบบมันก็แสดงให้เห็นถึงตัวเลขที่ไม่ถูกต้องสำหรับ$end_user_numberวิธีการแก้ปัญหาของฉัน กลับไปที่กระดานวาดรูปฮ่า!
damienoneill2001

1

เครดิตเต็มควรไปที่ @ radley-ค้ำจุนสำหรับคำตอบของเขา แต่ฉันเห็นความผิดพลาดเล็กน้อยกับมันดังนั้นฉันจึงแบ่งปันคำตอบเวอร์ชันของฉันที่นี่

ในเวอร์ชันของฉันฉันยังกรองผลลัพธ์ตามสถานที่ตั้งคำหลัก ฯลฯ ดังนั้นบางหน้ามีผลลัพธ์น้อยกว่า '$ users_per_page' var ตัวอย่างเช่นหากผู้ใช้ของฉันต่อหน้าถูกตั้งค่าให้แสดง 10 แต่ผลลัพธ์ของตัวกรองส่งคืนผู้ใช้ 3 คนเท่านั้นฉันได้รับ 'แสดง 10 จาก 3 ผู้ใช้' ที่ด้านบนของหน้า เห็นได้ชัดว่ามันไม่สมเหตุสมผลดังนั้นฉันจึงเพิ่มคำสั่ง "if" เพื่อตรวจสอบว่าจำนวนผลลัพธ์นั้นสูงกว่าตัวแปร '$ users_per_page'

Radley หากคุณแก้ไขคำตอบของคุณด้วยการอัปเดตฉันจะออกเสียงลงคะแนนให้เป็นคำตอบที่ถูกต้องเพราะฉันคิดว่ามันดีกว่าคำตอบของ Pippin

นี่คือรหัสสุดท้ายสำหรับทุกคนที่ต้องการมัน

<?php

// Pagination vars
$current_page = get_query_var('paged') ? (int) get_query_var('paged') : 1;
$users_per_page = 10;

$args = array(
    'number' => $users_per_page, // How many per page
    'paged' => $current_page // What page to get, starting from 1.
);

$users = new WP_User_Query( $args );

$total_users = $users->get_total(); // How many users we have in total (beyond the current page)
$num_pages = ceil($total_users / $users_per_page); // How many pages of users we will need

if ($total_users < $users_per_page) {$users_per_page = $total_users;}

?>
    <h3>Page <?php echo $current_page; ?> of <?php echo $num_pages; ?></h3>
    <p>Displaying <?php echo $users_per_page; ?> of <?php echo $total_users; ?> users</p>

    <table>
        <thead>
            <tr>
                <th>First Name</th>
                <th>Last Name</th>
                <th>Email</th>
            </tr>
        </thead>

        <tbody>
            <?php
            if ( $users->get_results() ) foreach( $users->get_results() as $user )  {
                $firstname = $user->first_name;
                $lastname = $user->last_name;
                $email = $user->user_email;
                ?>
                <tr>
                    <td><?php echo esc_html($firstname); ?></td>
                    <td><?php echo esc_html($lastname); ?></td>
                    <td><?php echo esc_html($email); ?></td>
                </tr>
                <?php
            }
            ?>
        </tbody>
    </table>

    <p>
        <?php
        // Previous page
        if ( $current_page > 1 ) {
            echo '<a href="'. add_query_arg(array('paged' => $current_page-1)) .'">Previous Page</a>';
        }

        // Next page
        if ( $current_page < $num_pages ) {
            echo '<a href="'. add_query_arg(array('paged' => $current_page+1)) .'">Next Page</a>';
        }
        ?>
    </p>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.