Jak wyświetlić linki do stronicowania dla WP_User_Query?


10

Myślę, że już prawie jestem przy tym, ale nie mogę wyświetlić linków do stronicowania dla katalogu autorów, które tworzę.

Mój kod jest poniżej, ale nie wiem, jak uzyskać linki do nawigacji między stronami autorów do pracy. Czy ktoś może mi pomóc? Mam wrażenie, że to może się przydać, ale nie wiem, jak to zaimplementować:

paginate_links ()

Dzięki

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

Odpowiedzi:


17

To powinno cię naprawdę zbliżyć. Nie testowałem tego, ale jest prawie identyczny z konfiguracją, z której korzystałem kilka razy.

/*
 * 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 Byłoby mi miło, gdyby kod został podzielony i wyjaśniony :)
Kaiser

5
Tam dodałem kilka lepszych komentarzy i naprawiłem błąd lub dwa :)
Pippin

Dzięki za ten @Pippin, wypróbuję go, kiedy wejdę do studia. Jedno pytanie: co mam umieścić w części „Twoja-strona-ścieżka” w admin_url? Czy to jest katalog główny mojej witryny?
Osu,

Czy strona wyświetlająca użytkowników w panelu administratora lub interfejsie użytkownika?
Pippin

1
Ciekawe podejście Zauważyłem, że uruchamiasz tutaj 2 zapytania: pierwsze, aby uzyskać wszystkich użytkowników, a drugie, aby tylko użytkownicy na odpowiedniej stronie. Czy nie działałoby to lepiej, gdybyś użył tylko 1 zapytania, a następnie użyłszy array_slice do podzielenia wyników na strony? Wygląda na to, że ponieważ wykonujesz 2 różne zapytania na tych samych danych, możesz zaoszczędzić trochę wydajności, usuwając jedno.
codecribblr

11

Naprawdę nie powinieneś używać odpowiedzi Pippin. Zapytanie jest bardzo nieefektywne. $user_count_queryw tym przykładzie może zwrócić do skryptu do 999,999 użytkowników ze wszystkimi polami użytkownika. To z pewnością uderzy w pamięć i / lub limity czasowe dla PHP, jeśli / gdy Twoja strona będzie wystarczająco duża.

Ale to mogło być jedyne rozwiązanie w 2012 roku.

Oto lepszy sposób, aby to zrobić. W tym przykładzie mam tylko następną i poprzednią stronę, ale jeśli potrzebujesz numerowanego stronicowania, zmienne są tam, aby je rozwinąć. WordPress nie ma funkcji stronicowania zgodnej z WP_User_Query (o ile mi wiadomo).

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

Przykład pokazujący stronę 2:

tabela użytkowników, od strony 2


Aktualizacja 6/8/2018: Jak dodawać numery stron zamiast Następny / Poprzedni

Jeśli chcesz mieć numery stron zamiast linków do następnej / poprzedniej strony, oto jak możesz to skonfigurować. Pamiętaj, że musisz zastąpić liczby linkami do stron, w tym przykładzie nie będzie można ich kliknąć (na podstawie https://stackoverflow.com/a/11274294/470480 , zmodyfikowano tak, aby wyświetlać stałą liczbę liczb średnich i nie dodawać „...”, chyba że strona zostanie faktycznie pominięta).

Możesz również zobaczyć mój plik gist, który zawiera funkcję wielokrotnego użytku do tego celu.

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

Wyjście (od strony 1 do 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]

Zgadzam się. Odpowiedź Pippina wymaga 2 trafień na db, których należy unikać, jeśli to możliwe.
Sumo

1
Cześć @ radley-sustaire, jest to świetne rozwiązanie, ale zastanawiałem się, czy istnieje sposób na zmianę części „wyświetlanie 2 z 6 użytkowników” na rzeczywisty zakres użytkowników na stronie. Więc coś w rodzaju „wyświetlanie 1-2 z 6” dla strony 1, „3-4 z 6” dla strony 2 i „5-6 z 6” dla strony 3. W tej chwili pokazuje tylko „2 z 6” dla strony 1 wszystkie strony.
damienoneill2001

1
@ damienoneill2001 To dobry pomysł, możesz zacząć od czegoś takiego: $start_user_num = (($current_page-1) * $users_per_page) + 1;i $end_user_num = $start_user_num + count($users->get_results());.
Radley Sustaire,

@RadleySustaire doskonale, dziękuję za to. Początkowo otrzymałem następujący błąd: Call to a member function get_results() on a non-objecttak I wprowadza $end_user_numbersię $start_user_num + ($users_per_page-1);i rozwiązał problem. Dzięki jeszcze raz!
damienoneill2001

Okazuje się, że wkrótce z tym rozmawiałem. Kiedy przechodzę do ostatniej strony, która nie zawiera pełnej listy użytkowników, pokazuje ona oczywiście nieprawidłową liczbę dla $end_user_numbermojego rozwiązania. Wróć do deski kreślarskiej, ha!
damienoneill2001

1

Pełne podziękowania powinny zostać przekazane @ radley-sustaire za jego odpowiedź, ale zauważyłem drobną usterkę, dlatego dzielę się swoją wersją odpowiedzi tutaj.

W mojej wersji filtrowałem również wyniki według lokalizacji, słowa kluczowego itp., Więc niektóre strony miały mniej wyników niż zmienna „$ users_per_page”. Na przykład jeśli dla moich użytkowników na stronie ustawiono wyświetlanie 10, ale wyniki filtru zwracają tylko 3 użytkowników, u góry strony wyświetla się „Wyświetlanie 10 z 3 użytkowników”. Oczywiście nie miało to sensu, dlatego dodałem prostą instrukcję „if”, aby sprawdzić, czy liczba wyników jest wyższa niż zmienna „$ users_per_page”.

Radley, jeśli edytujesz swoją odpowiedź za pomocą aktualizacji, chętnie zagłosuję na nią jako poprawną odpowiedź, ponieważ uważam, że jest lepsza niż rozwiązanie Pippina.

To jest ostateczny kod dla każdego, kto tego chce.

<?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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.