Come mostrare i link di paginazione per WP_User_Query?
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:
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"> </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' => '« Precedente',
'next_text' => 'Successiva »'
));
echo '</div>';
}
?>

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"> </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' => __('« Precedente'), // testo per la pagina precedente
'next_text' => __('Successivo »'), // 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,
));

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?

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

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

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.

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.

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.

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:
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]

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

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

@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!

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!

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>
