Bagaimana cara menampilkan tautan pagination untuk WP_User_Query?

10

Saya pikir saya hampir sampai di sana dengan ini, tetapi saya tidak bisa mendapatkan tautan pagination untuk ditampilkan untuk direktori penulis yang saya buat.

Kode saya di bawah ini, tetapi saya tidak tahu bagaimana cara mendapatkan tautan untuk bernavigasi di antara halaman penulis agar berfungsi. Ada yang bisa bantu saya? Saya merasa ini mungkin berguna, tetapi saya tidak tahu bagaimana cara mengimplementasikannya:

paginate_links ()

Terima kasih

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? */ ?>
Osu
sumber
jika Anda mencari Ajax maka kunjungi di sini wordpress.stackexchange.com/questions/113379/...
Sabir Abdul Gafoor Shaikh

Jawaban:

17

Ini seharusnya membuat Anda benar-benar dekat. Saya belum mengujinya, tetapi hampir identik dengan pengaturan yang telah saya gunakan beberapa kali.

/*
 * 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,
));
Pippin
sumber
2
+1 Akan menikmati jika kode akan dibelah dan dijelaskan :)
kaiser
5
Di sana, menambahkan beberapa komentar yang lebih baik dan memperbaiki satu atau dua bug :)
Pippin
Terima kasih untuk @Pippin ini, saya akan mencobanya ketika saya masuk studio. Satu pertanyaan: apa yang harus saya letakkan di bagian 'your-page-path' di admin_url? Apakah itu root situs saya?
Osu
Apakah halaman yang menampilkan pengguna Anda di admin atau di ujung depan?
Pippin
1
Pendekatan yang menarik. Saya perhatikan Anda menjalankan 2 pertanyaan di sini: yang pertama untuk mendapatkan semua pengguna dan yang kedua hanya untuk mendapatkan pengguna di halaman yang sesuai. Tidakkah kinerjanya lebih baik jika Anda hanya menggunakan 1 query dan kemudian menggunakan array_slice untuk membagi hasil menjadi halaman? Tampaknya karena Anda melakukan 2 kueri yang berbeda pada data yang sama Anda dapat menyimpan beberapa kinerja dengan menjatuhkannya.
codescribblr
11

Anda benar-benar tidak boleh menggunakan jawaban oleh Pippin. Permintaannya sangat tidak efisien. $user_count_querydalam contoh ini dapat mengembalikan hingga 999.999 pengguna dari database Anda ke skrip Anda, dengan semua bidang pengguna. Ini pasti akan menekan memori dan / atau batas waktu untuk PHP jika / ketika situs Anda tumbuh cukup besar.

Tapi itu mungkin satu-satunya solusi di tahun 2012.

Ini cara yang lebih baik untuk melakukannya. Dalam contoh ini saya hanya punya halaman berikutnya dan sebelumnya, tetapi jika Anda memang perlu pagination bernomor, variabel ada untuk membangunnya. WordPress tidak memiliki fungsi pagination yang kompatibel dengan WP_User_Query (setahu saya).

<?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>

Contoh menunjukkan halaman 2:

tabel pengguna, mulai dari halaman 2


Pembaruan 6/8/2018: Cara menambahkan nomor halaman daripada Berikutnya / Sebelumnya

Jika Anda ingin memiliki nomor halaman alih-alih tautan halaman berikutnya / sebelumnya, berikut adalah cara Anda mengaturnya. Perhatikan bahwa Anda perlu mengganti angka dengan tautan halaman, mereka tidak akan dapat diklik dalam contoh ini (berdasarkan https://stackoverflow.com/a/11274294/470480 , dimodifikasi untuk menunjukkan jumlah angka tengah yang konsisten dan tidak menambah "..." kecuali halaman sebenarnya dilewati).

Anda juga dapat melihat file inti saya yang berisi fungsi yang dapat digunakan kembali untuk tujuan ini.

$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} ";

Output (dari halaman 1 hingga 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]
Radley Sustaire
sumber
Saya setuju. Jawaban Pippin membutuhkan 2 hit pada db yang harus dihindari jika memungkinkan.
The Sumo
1
Hai @ radley-sustaire, ini adalah solusi hebat, tapi saya bertanya-tanya apakah ada cara untuk mengubah bagian "menampilkan 2 dari 6 pengguna" menjadi kisaran aktual pengguna per halaman. Jadi sesuatu seperti "menampilkan 1-2 dari 6" untuk halaman 1, "3-4 dari 6" untuk halaman 2 dan "5-6 dari 6" untuk halaman 3. Saat ini, itu hanya menunjukkan "2 dari 6" untuk semua halaman.
damienoneill2001
1
@ damienoneill2001 Itu ide yang bagus, Anda bisa mulai dengan sesuatu seperti: $start_user_num = (($current_page-1) * $users_per_page) + 1;dan $end_user_num = $start_user_num + count($users->get_results());.
Radley Sustaire
@RadleySustaire luar biasa, terima kasih untuk itu. Pada awalnya, saya menerima kesalahan berikut: Call to a member function get_results() on a non-objectjadi saya diubah $end_user_numberke $start_user_num + ($users_per_page-1);dan memecahkan masalah. Terima kasih lagi!
damienoneill2001
Ternyata saya segera berbicara dengan itu. Ketika saya sampai ke halaman terakhir yang tidak berisi daftar lengkap pengguna, itu jelas menunjukkan angka yang salah untuk $end_user_numbersolusi saya. Kembali ke papan gambar, ha!
damienoneill2001
1

Penghargaan penuh harus diberikan kepada @ radley-sustaire atas jawabannya, tetapi saya melihat ada kesalahan kecil sehingga saya membagikan versi jawaban saya di sini.

Dengan versi saya, saya juga memfilter hasil berdasarkan lokasi, kata kunci dll sehingga beberapa halaman memiliki hasil lebih sedikit daripada var '$ users_per_page'. Jadi misalnya jika pengguna saya per halaman diatur untuk menampilkan 10, tetapi hasil filter hanya mengembalikan 3 pengguna, saya mendapat 'Menampilkan 10 dari 3 pengguna' di bagian atas halaman. Jelas ini tidak masuk akal jadi saya menambahkan pernyataan "jika" sederhana untuk memeriksa apakah hasilnya lebih tinggi dari variabel '$ users_per_page'.

Radley, jika Anda mengedit jawaban Anda dengan pembaruan, saya akan dengan senang hati memilihnya sebagai jawaban yang benar karena saya pikir itu lebih baik daripada solusi Pippin.

Jadi ini adalah kode final untuk siapa saja yang menginginkannya.

<?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>
Sumo
sumber