Comment afficher les liens de pagination pour WP_User_Query?

10

Je pense que j'y suis presque, mais je ne peux pas afficher les liens de pagination pour un répertoire des auteurs que je crée.

Mon code est ci-dessous, mais je ne sais pas comment faire fonctionner les liens pour naviguer entre les pages des auteurs. Quelqu'un peut-il m'aider? J'ai l'impression que cela pourrait être utile, mais je ne sais pas comment le mettre en œuvre:

paginate_links ()

Merci

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
la source
si vous êtes à la recherche d'Ajax alors visitez ici wordpress.stackexchange.com/questions/113379/…
Sabir Abdul Gafoor Shaikh

Réponses:

17

Cela devrait vous rapprocher vraiment. Je ne l'ai pas testé, mais il est presque identique à une configuration que j'ai utilisée plusieurs fois.

/*
 * 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,
));
Pomme reinette
la source
2
+1 J'aurais apprécié que le code soit divisé et expliqué :)
kaiser
5
Là, ajouté de meilleurs commentaires et corrigé un bug ou deux :)
Pippin
Merci pour ce @Pippin, je vais l'essayer quand je serai en studio. Une question: qu'est-ce que je mets dans la partie 'your-page-path' de admin_url? Est-ce la racine de mon site?
Osu
La page qui montre vos utilisateurs est-elle dans l'administrateur ou sur le front-end?
Pippin
1
Approche intéressante. J'ai remarqué que vous exécutez 2 requêtes ici: la première pour obtenir tous les utilisateurs et la seconde pour obtenir uniquement les utilisateurs sur la page appropriée. Cela ne fonctionnerait-il pas mieux si vous n'utilisiez qu'une seule requête, puis utilisiez array_slice pour diviser les résultats en pages? Il semble que puisque vous effectuez 2 requêtes différentes sur les mêmes données, vous pouvez économiser des performances en en supprimant une.
codescribblr
11

Vous ne devriez vraiment pas utiliser la réponse de Pippin. La requête est très inefficace. $user_count_querydans l'exemple peut renvoyer jusqu'à 999 999 utilisateurs de votre base de données vers votre script, avec tous les champs utilisateur. Cela atteindra sûrement la mémoire et / ou les limites de temps pour PHP si / quand votre site grandit suffisamment.

Mais cela a peut-être été la seule solution en 2012.

Voici une meilleure façon de procéder. Dans cet exemple, je n'ai que la page suivante et précédente, mais si vous avez besoin d'une pagination numérotée, les variables sont là pour le construire. WordPress n'a pas de fonction de pagination compatible avec WP_User_Query (à ma connaissance).

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

Exemple montrant la page 2:

tableau des utilisateurs, à partir de la page 2


Mise à jour 6/8/2018: comment ajouter des numéros de page au lieu de Suivant / Précédent

Si vous souhaitez avoir des numéros de page au lieu des liens de page suivante / précédente, voici comment vous pouvez configurer cela. Notez que vous devrez remplacer les nombres par des liens de page, ils ne seront pas cliquables dans cet exemple (basé sur /programming//a/11274294/470480 , modifié pour afficher une quantité cohérente de nombres intermédiaires et ne pas ajouter le "..." sauf si une page est réellement sautée).

Vous pouvez également voir mon fichier gist qui contient une fonction réutilisable à cet effet.

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

Sortie (de la page 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]
Radley Sustaire
la source
Je suis d'accord. La réponse de Pippin nécessite 2 coups sûrs sur la base de données, ce qui devrait être évité si possible.
The Sumo
1
Salut @ radley-sustaire, c'est une excellente solution, mais je me demandais s'il y avait un moyen de changer la partie "affichage de 2 utilisateurs sur 6" en la gamme réelle d'utilisateurs par page. Donc quelque chose comme "afficher 1-2 sur 6" pour la page 1, "3-4 sur 6" pour la page 2 et "5-6 sur 6" pour la page 3. Pour le moment, il affiche simplement "2 sur 6" pour toutes les pages.
damienoneill2001
1
@ damienoneill2001 C'est une bonne idée, vous pouvez commencer avec quelque chose comme: $start_user_num = (($current_page-1) * $users_per_page) + 1;et $end_user_num = $start_user_num + count($users->get_results());.
Radley Sustaire
@RadleySustaire excellent, merci pour cela. Tout d' abord, j'ai reçu l'erreur suivante: Call to a member function get_results() on a non-objectsi j'ai modifié $end_user_numberà $start_user_num + ($users_per_page-1);et résolu le problème. Merci encore!
damienoneill2001
Il s'est avéré que j'en ai parlé bientôt. Lorsque j'arrive à la dernière page qui ne contient pas une liste complète des utilisateurs, cela montre évidemment le mauvais chiffre pour le $end_user_numberdans ma solution. Retour à la planche à dessin, ha!
damienoneill2001
1

Le mérite devrait être attribué à @ radley-sustaire pour sa réponse, mais j'ai repéré un petit problème avec elle, je partage donc ma version de la réponse ici.

Avec ma version, je filtrais également les résultats par emplacement, mot-clé, etc., donc certaines pages avaient moins de résultats que la var '$ users_per_page'. Ainsi, par exemple, si mes utilisateurs par page étaient définis pour afficher 10, mais que les résultats du filtre ne renvoyaient que 3 utilisateurs, j'obtenais «Affichage de 10 utilisateurs sur 3» en haut de la page. Évidemment, cela n'avait aucun sens, j'ai donc ajouté une simple instruction "si" pour vérifier si le nombre de résultats était supérieur à la variable '$ users_per_page'.

Radley, si vous modifiez votre réponse avec la mise à jour, je voterai volontiers pour elle comme la bonne réponse car je pense que c'est mieux que la solution de Pippin.

C'est donc le code final pour tous ceux qui le souhaitent.

<?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>
Le sumo
la source