Come mostrare i link di paginazione per WP_User_Query?

4 lug 2012, 16:42:37
Visualizzazioni: 18.8K
Voti: 11

Penso di essere quasi arrivato, ma non riesco a far apparire i link di paginazione per una directory di autori che sto creando.

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

paginate_links()

Grazie

Osu

    <?php 
/* ****************************************************************** */
                        /* !LISTA AUTORI */
/* ****************************************************************** */ 

// RINGRAZIAMENTI A:
// http://www.mattvarone.com/wordpress/list-users-with-wp_user_query/

// paginazione
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; // Necessario per paginazione
$paged -= 1;
$limit = 2;
$offset = $paged * $limit;

// prepara argomenti
$args  = array(
    // cerca solo il ruolo Subscriber
    'role'      => 'Subscriber',
    // ordina risultati per display_name
    'orderby'   => 'display_name',
    // restituisce tutti i campi
    'fields'    => 'all_with_meta',
    'number'    => $limit,
    'offset'    => $offset      
);
// Crea l'oggetto WP_User_Query
$wp_user_query = new WP_User_Query($args);
// Ottieni i risultati
$authors = $wp_user_query->get_results();
// Verifica se ci sono risultati
if (!empty($authors))
{
    echo '<div class="author-entry">';
    // ciclo attraverso ogni autore
    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>Nome</strong> : <?php echo $author_info->first_name; ?></span><br />
        <span class="ln"><strong>Cognome</strong> : <?php echo $author_info->last_name; ?></span><br />
        <span class="em"><strong>Email</strong> : <a href="mailto:<?php echo $author_info->user_email; ?>"><?php echo $author_info->user_email; ?></a></span><br />
        <span class="we"><strong>Sito web</strong> : <a href="<?php echo $author_info->user_url; ?>"><?php echo $author_info->user_url; ?></a></span><br />

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

    <?php 
    }
    echo '</div>';
} else {
    echo 'Nessun autore trovato';
}

// Paginazione
$total_users = $wp_user_query->get_total(); // Numero totale di utenti
$total_pages = ceil($total_users / $limit); // Calcola pagine totali

if ($total_pages > 1) {
    echo '<div class="pagination">';
    echo paginate_links(array(
        'base'     => get_pagenum_link(1) . '%_%',
        'format'   => 'page/%#%',
        'current'  => max(1, $paged + 1),
        'total'    => $total_pages,
        'prev_text' => '&laquo; Precedente',
        'next_text' => 'Successiva &raquo;'
    ));
    echo '</div>';
}
?>
1
Commenti

se stai cercando informazioni su Ajax allora visita qui http://wordpress.stackexchange.com/questions/113379/how-to-display-pagination-links-for-wp-user-query-in-ajax

Sabir Abdul Gafoor Shaikh Sabir Abdul Gafoor Shaikh
8 set 2013 11:27:03
Tutte le risposte alla domanda 3
9
18

Questo codice dovrebbe avvicinarti molto al risultato desiderato. Non l'ho testato, ma è quasi identico a una configurazione che ho utilizzato diverse volte.

/*
 * Iniziamo con una query per recuperare tutti gli utenti
 * Abbiamo bisogno del conteggio totale degli utenti per calcolare quante pagine ci saranno
 */

$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();

// conta il numero di utenti trovati nella query
$total_users = $user_count ? count($user_count) : 1;

// ottieni il numero della pagina corrente e imposta 1 se nessun numero di pagina è impostato
$page = isset($_GET['p']) ? $_GET['p'] : 1;

// quanti utenti mostrare per pagina
$users_per_page = 5;

// calcola il numero totale di pagine.
$total_pages = 1;
$offset = $users_per_page * ($page - 1);
$total_pages = ceil($total_users / $users_per_page);


// query principale per gli utenti
$args  = array(
    // cerca solo per il ruolo Subscriber
    'role'      => 'Subscriber',
    // ordina i risultati per display_name
    'orderby'   => 'display_name',
    // restituisce tutti i campi
    'fields'    => 'all_with_meta',
    'number'    => $users_per_page,
    'offset'    => $offset // salta il numero di utenti che abbiamo per pagina  
);

// Crea l'oggetto WP_User_Query
$wp_user_query = new WP_User_Query($args);

// Ottieni i risultati
$authors = $wp_user_query->get_results();

// verifica se abbiamo utenti
if (!empty($authors))
{
    echo '<div class="author-entry">';
    // cicla attraverso ogni autore
    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>Nome</strong> : <?php echo $author_info->first_name; ?></span><br />
        <span class="ln"><strong>Cognome</strong> : <?php echo $author_info->last_name; ?></span><br />
        <span class="em"><strong>Indirizzo email</strong> : <a href="mailto:<?php echo $author_info->user_email; ?>"><?php echo $author_info->user_email; ?></a></span><br />
        <span class="we"><strong>Sito web</strong> : <a href="<?php echo $author_info->user_url; ?>"><?php echo $author_info->user_url; ?></a></span><br />

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

    <?php 
    }
    echo '</div>';
} else {
    echo 'Nessun autore trovato';
}

// ottieni i parametri della query corrente
$query_string = $_SERVER['QUERY_STRING'];

// La variabile $base memorizza l'URL completo alla nostra pagina, incluso l'argomento della pagina corrente

// se sei nell'admin, la tua base dovrebbe essere l'URL dell'admin + la tua pagina
$base = admin_url('your-page-path') . '?' . remove_query_arg('p', $query_string) . '%_%';

// se sei nel front end, la tua base è la pagina corrente
//$base = get_permalink( get_the_ID() ) . '?' . remove_query_arg('p', $query_string) . '%_%';

echo paginate_links( array(
    'base' => $base, // l'URL base, incluso l'argomento della query
    'format' => '&p=%#%', // questo definisce il parametro della query che verrà utilizzato, in questo caso "p"
    'prev_text' => __('&laquo; Precedente'), // testo per la pagina precedente
    'next_text' => __('Successivo &raquo;'), // testo per la pagina successiva
    'total' => $total_pages, // il numero totale di pagine che abbiamo
    'current' => $page, // la pagina corrente
    'end_size' => 1,
    'mid_size' => 5,
));
4 lug 2012 18:03:14
Commenti

+1 Mi sarebbe piaciuto se il codice fosse stato suddiviso e spiegato :)

kaiser kaiser
4 lug 2012 23:28:04

Ecco, ho aggiunto alcuni commenti migliori e corretto un paio di bug :)

Pippin Pippin
4 lug 2012 23:53:22

Grazie per questo @Pippin, lo proverò quando sarò in studio. Una domanda: cosa devo inserire nella parte 'your-page-path' di admin_url? È la root del mio sito?

Osu Osu
5 lug 2012 19:02:10

La pagina che mostra i tuoi utenti è nell'amministrazione o nel front end?

Pippin Pippin
5 lug 2012 23:10:23

Ciao @Pippin, è nel front end, ma ero interessato a capire a cosa servisse quella parte del codice :)

Osu Osu
6 lug 2012 12:41:58

Quella parte del codice è necessaria per generare i link di impaginazione. La funzione paginate_links() ha bisogno di sapere a quale URL aggiungere gli argomenti della query. Ti ho semplicemente fornito un esempio per l'amministrazione e uno per il front end, ma puoi ignorare la versione per l'amministrazione.

Pippin Pippin
6 lug 2012 16:57:43

Adoro questo template, funziona perfettamente ;) grazie mille. Per chi copia e incolla (e magari lo modifica) - la variabile $limit deve essere cambiata in $users_per_page. Immagino sia andata persa quando sono state aggiunte le spiegazioni.

Sagive Sagive
11 set 2014 15:38:49

Approccio interessante. Ho notato che stai eseguendo 2 query qui: la prima per ottenere tutti gli utenti e la seconda solo per quelli nella pagina appropriata. Non sarebbe più performante usare una sola query e poi usare array_slice per suddividere i risultati in pagine? Visto che stai eseguendo 2 query diverse sugli stessi dati, potresti risparmiare prestazioni eliminandone una.

codescribblr codescribblr
22 giu 2015 05:35:06

La query usata per contare il totale degli utenti può essere sostituita con $total_users = $wp_user_query->get_total();

1naveengiri 1naveengiri
15 mar 2019 14:18:12
Mostra i restanti 4 commenti
6
12

Non dovresti davvero utilizzare la risposta di Pippin. La query è molto inefficiente. $user_count_query nell'esempio può restituire fino a 999.999 utenti dal tuo database al tuo script, con tutti i campi degli utenti. Questo sicuramente raggiungerà i limiti di memoria e/o tempo per PHP se/quando il tuo sito crescerà abbastanza.

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

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

<?php

// Variabili per la paginazione
$current_page = get_query_var('paged') ? (int) get_query_var('paged') : 1;
$users_per_page = 2; // AUMENTA QUESTO DOPO I TEST ;)

$args = array(
    'number' => $users_per_page, // Quanti per pagina
    'paged' => $current_page // Quale pagina ottenere, partendo da 1.
);

$users = new WP_User_Query( $args );

$total_users = $users->get_total(); // Quanti utenti abbiamo in totale (oltre la pagina corrente)
$num_pages = ceil($total_users / $users_per_page); // Quante pagine di utenti ci serviranno

?>
    <h3>Pagina <?php echo $current_page; ?> di <?php echo $num_pages; ?></h3>
    <p>Visualizzazione di <?php echo $users_per_page; ?> su <?php echo $total_users; ?> utenti</p>

    <table>
        <thead>
            <tr>
                <th>Nome</th>
                <th>Cognome</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
        // Pagina precedente
        if ( $current_page > 1 ) {
            echo '<a href="'. add_query_arg(array('paged' => $current_page-1)) .'">Pagina Precedente</a>';
        }

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

Esempio che mostra la pagina 2:

tabella degli utenti, partendo dalla pagina 2


Aggiornamento 8/6/2018: Come aggiungere numeri di pagina invece di Successiva/Precedente

Se vuoi avere numeri di pagina invece di link per pagina successiva/precedente, ecco come puoi configurarlo. Nota che dovrai sostituire i numeri con link alle pagine, non saranno cliccabili in questo esempio (basato su https://stackoverflow.com/a/11274294/470480, modificato per mostrare una quantità consistente di numeri centrali e non aggiungere "..." a meno che una pagina non sia effettivamente saltata).

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

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

$edge_number_count = 2; // Modifica questo, opzionale

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

// Meno uno così da non dividere inutilmente il numero iniziale, es: "1 ... 2 3" dovrebbe iniziare come "1 2 3"
if ( ($start_number - 1) < 1 ) {
    $start_number = 1;
    $end_number = min($num_pages, $start_number + ($edge_number_count*2));
}

// Più uno così da non dividere inutilmente il numero finale, es: "8 9 ... 10" dovrebbe rimanere "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 (dalla 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]
14 mag 2017 05:10:44
Commenti

Sono d'accordo. La risposta di Pippin richiede 2 accessi al database che dovrebbero essere evitati se possibile.

The Sumo The Sumo
18 ago 2017 18:16:27

Ciao @radley-sustaire, questa è un'ottima soluzione, ma mi chiedevo se ci fosse un modo per cambiare la parte "visualizzazione 2 di 6 utenti" con l'intervallo effettivo di utenti per pagina. Quindi qualcosa come "visualizzazione 1-2 di 6" per la pagina 1, "3-4 di 6" per la pagina 2 e "5-6 di 6" per la pagina 3. Al momento, mostra semplicemente "2 di 6" per tutte le pagine.

damienoneill2001 damienoneill2001
13 feb 2018 12:50:27

@damienoneill2001 Questa è una buona idea, puoi iniziare con qualcosa come: $start_user_num = (($current_page-1) * $users_per_page) + 1; e $end_user_num = $start_user_num + count($users->get_results());.

Radley Sustaire Radley Sustaire
14 feb 2018 01:04:27

@RadleySustaire eccellente, grazie per questo. Inizialmente ho ricevuto il seguente errore: Call to a member function get_results() on a non-object quindi ho modificato $end_user_number in $start_user_num + ($users_per_page-1); e questo ha risolto il problema. Grazie ancora!

damienoneill2001 damienoneill2001
14 feb 2018 13:42:49

A quanto pare ho parlato troppo presto. Quando arrivo all'ultima pagina che non contiene un elenco completo di utenti, ovviamente mostra la cifra sbagliata per $end_user_number nella mia soluzione. Torniamo alla fase di progettazione, ha!

damienoneill2001 damienoneill2001
14 feb 2018 15:41:20

paged non sembra funzionare per me, piuttosto offset

Tim Hallman Tim Hallman
6 mar 2019 22:23:58
Mostra i restanti 1 commenti
0

Il merito completo dovrebbe andare a @radley-sustaire per la sua risposta, ma ho notato un piccolo problema nella sua soluzione, quindi condivido qui la mia versione.

Nella mia versione stavo anche filtrando i risultati per località, parole chiave ecc., quindi alcune pagine avevano meno risultati della variabile '$users_per_page'. Ad esempio, se avevo impostato di mostrare 10 utenti per pagina, ma il filtro restituiva solo 3 utenti, ottenevo "Visualizzazione di 10 su 3 utenti" in cima alla pagina. Ovviamente non aveva senso, quindi ho aggiunto un semplice controllo "if" per verificare se il conteggio dei risultati fosse maggiore della variabile '$users_per_page'.

Radley, se modificherai la tua risposta con questo aggiornamento, voterò volentieri per te come risposta corretta, poiché penso sia migliore della soluzione di Pippin.

Ecco il codice finale per chiunque ne abbia bisogno.

<?php

// Variabili per la paginazione
$current_page = get_query_var('paged') ? (int) get_query_var('paged') : 1;
$users_per_page = 10;

$args = array(
    'number' => $users_per_page, // Quanti utenti per pagina
    'paged' => $current_page // Quale pagina ottenere, partendo da 1.
);

$users = new WP_User_Query( $args );

$total_users = $users->get_total(); // Quanti utenti abbiamo in totale (oltre la pagina corrente)
$num_pages = ceil($total_users / $users_per_page); // Quante pagine di utenti saranno necessarie

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

?>
    <h3>Pagina <?php echo $current_page; ?> di <?php echo $num_pages; ?></h3>
    <p>Visualizzazione di <?php echo $users_per_page; ?> su <?php echo $total_users; ?> utenti</p>

    <table>
        <thead>
            <tr>
                <th>Nome</th>
                <th>Cognome</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
        // Pagina precedente
        if ( $current_page > 1 ) {
            echo '<a href="'. add_query_arg(array('paged' => $current_page-1)) .'">Pagina Precedente</a>';
        }

        // Pagina successiva
        if ( $current_page < $num_pages ) {
            echo '<a href="'. add_query_arg(array('paged' => $current_page+1)) .'">Pagina Successiva</a>';
        }
        ?>
    </p>
21 ago 2017 10:56:06