Come visualizzare i collegamenti di impaginazione per WP_User_Query?


10

Penso di esserci quasi arrivato, ma non riesco a visualizzare i link di impaginazione per una directory di autori che sto creando.

Il mio codice è sotto, ma non so come far funzionare i link per navigare tra le pagine degli autori. Qualcuno può aiutarmi? Ho la sensazione che questo possa essere utile, ma non so come implementarlo:

paginate_links ()

Grazie

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

Risposte:


17

Questo dovrebbe avvicinarti molto. Non l'ho provato, ma è quasi identico a un setup che ho usato alcune volte.

/*
 * 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 Mi sarei divertito se il codice fosse stato diviso e spiegato :)
kaiser

5
Lì, ha aggiunto alcuni commenti migliori e risolto un bug o due :)
Pipino

Grazie per questo @Pippin, lo proverò quando arrivo in studio. Una domanda: cosa inserisco nella parte 'your-page-path' di admin_url? È questa la radice del mio sito?
Osu,

La pagina che mostra i tuoi utenti nell'amministratore o nel front-end?
Pipino,

1
Approccio interessante Ho notato che stai eseguendo 2 query qui: la prima per ottenere tutti gli utenti e la seconda per ottenere solo gli utenti nella pagina appropriata. Le prestazioni non sarebbero migliori se si utilizzasse solo 1 query e si utilizzasse array_slice per suddividere i risultati in pagine? Sembra che dal momento che tu stia eseguendo 2 query diverse sugli stessi dati che potresti risparmiare alcune prestazioni lasciandone cadere una.
codescribblr,

11

Non dovresti davvero usare la risposta di Pipino. La query è molto inefficiente. $user_count_querynell'esempio può restituire fino a 999.999 utenti dal database allo script, con tutti i campi utente. Questo sicuramente colpirà la memoria e / o i limiti di tempo per PHP se / quando il tuo sito diventerà abbastanza grande.

Ma quella potrebbe essere stata l'unica soluzione nel 2012.

Ecco un modo migliore per farlo. In questo esempio ho solo la pagina successiva e precedente, ma se hai bisogno di una paginazione numerata, le variabili sono lì per costruirla. WordPress non ha una funzione di impaginazione compatibile con WP_User_Query (per quanto ne so).

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

Esempio che mostra la pagina 2:

tabella degli utenti, a partire da pagina 2


Aggiornamento del 6/8/2018: come aggiungere i numeri di pagina invece di Successivo / Precedente

Se vuoi avere i numeri di pagina anziché i collegamenti alla pagina successiva / precedente, ecco come puoi configurarlo. Tieni presente che dovrai sostituire i numeri con i collegamenti alle pagine, non saranno cliccabili in questo esempio (basato su https://stackoverflow.com/a/11274294/470480 , modificato per mostrare una quantità consistente di numeri medi e non aggiungere il "..." a meno che una pagina non venga effettivamente ignorata).

Puoi anche vedere il mio file gist che contiene una funzione riutilizzabile per questo scopo.

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

Uscita (da pagina 1 a 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]

Sono d'accordo. La risposta di Pipino richiede 2 colpi sul db che dovrebbero essere evitati se possibile.
Il Sumo,

1
Ciao @ radley-sustaire, questa è un'ottima soluzione, ma mi chiedevo se c'è un modo per cambiare la parte "visualizzazione di 2 su 6 utenti" nella gamma effettiva di utenti per pagina. Quindi qualcosa come "visualizzare 1-2 di 6" per pagina 1, "3-4 di 6" per pagina 2 e "5-6 di 6" per pagina 3. Al momento, mostra solo "2 di 6" per tutte le pagine.
damienoneill2001,

1
@ damienoneill2001 È una buona idea, puoi iniziare con qualcosa del tipo: $start_user_num = (($current_page-1) * $users_per_page) + 1;e $end_user_num = $start_user_num + count($users->get_results());.
Radley Sustaire,

@RadleySustaire eccellente, grazie per quello. In un primo momento, ho ricevuto il seguente errore: Call to a member function get_results() on a non-objectcosì ho modificato $end_user_numberper $start_user_num + ($users_per_page-1);e che risolto il problema. Grazie ancora!
damienoneill2001,

A quanto pare ho parlato presto con quello. Quando arrivo alla pagina finale che non contiene un elenco completo di utenti, mostra ovviamente la cifra sbagliata per la $end_user_numbermia soluzione. Torna al tavolo da disegno, ah!
damienoneill2001,

1

Il merito completo dovrebbe essere andato a @ radley-sustaire per la sua risposta, ma ho notato un piccolo difetto con esso, quindi condivido la mia versione della risposta qui.

Con la mia versione stavo anche filtrando i risultati per posizione, parola chiave ecc. Quindi alcune pagine hanno ottenuto meno risultati rispetto alla var '$ users_per_page'. Ad esempio, se i miei utenti per pagina erano impostati per mostrare 10, ma i risultati del filtro restituivano solo 3 utenti, ho visualizzato "Visualizzazione di 10 utenti su 3" nella parte superiore della pagina. Ovviamente questo non aveva senso, quindi ho aggiunto una semplice istruzione "if" per verificare se il conteggio dei risultati fosse superiore alla variabile '$ users_per_page'.

Radley, se modifichi la tua risposta con l'aggiornamento, la voterò felicemente come la risposta corretta poiché penso che sia migliore della soluzione di Pipino.

Quindi questo è il codice finale per chiunque lo voglia.

<?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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.