Cum să afișezi link-uri de paginare pentru WP_User_Query în WordPress

4 iul. 2012, 16:42:37
Vizualizări: 18.8K
Voturi: 11

Cred că sunt aproape gata cu asta, dar nu reușesc să fac să apară link-urile de paginare pentru un director de autori pe care îl creez.

Mai jos este codul meu, dar nu știu cum să fac să funcționeze link-urile pentru navigarea între paginile cu autori. Poate cineva să mă ajute? Am senzația că această funcție ar putea fi utilă, dar nu știu cum să o implementez:

paginate_links()

Mulțumesc,

Osu

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

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

// paginare
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; // Necesar pentru paginare
$paged -= 1;
$limit = 2;
$offset = $paged * $limit;

// pregătim argumentele
$args  = array(
    // căutăm doar rolul de Abonat
    'role'      => 'Subscriber',
    // ordonăm rezultatele după display_name
    'orderby'   => 'display_name',
    // returnăm toate câmpurile
    'fields'    => 'all_with_meta',
    'number'    => $limit,
    'offset'    => $offset      
);
// Creăm obiectul WP_User_Query
$wp_user_query = new WP_User_Query($args);
// Obținem rezultatele
$authors = $wp_user_query->get_results();
// Verificăm dacă există rezultate
if (!empty($authors))
{
    echo '<div class="author-entry">';
    // iterăm prin fiecare autor
    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>Prenume</strong> : <?php echo $author_info->first_name; ?></span><br />
        <span class="ln"><strong>Nume</strong> : <?php echo $author_info->last_name; ?></span><br />
        <span class="em"><strong>Adresă email</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>Biografie</strong> :<br /><?php echo $author_info->description ; ?></span>
        <div class="clear"> </div>

    <?php 
    }
    echo '</div>';
} else {
    echo 'Nu s-au găsit autori';
}
?>

<?php /* CE TREBUIE SĂ PUN AICI PENTRU A CREA LINK-URILE DE PAGINARE? */ ?>
1
Comentarii

dacă cauți Ajax, atunci vizitează aici 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 sept. 2013 11:27:03
Toate răspunsurile la întrebare 3
9
18

Acest cod ar trebui să te aducă foarte aproape de soluția dorită. Nu l-am testat, dar este aproape identic cu o configurație pe care am folosit-o de câteva ori.

/*
 * Începem prin a face o interogare pentru a prelua toți utilizatorii
 * Avem nevoie de numărul total de utilizatori pentru a putea calcula câte pagini există
 */

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

// numărăm câți utilizatori au fost găsiți în interogare
$total_users = $user_count ? count($user_count) : 1;

// preluăm numărul paginii curente și setăm 1 dacă nu este setat niciun număr de pagină
$page = isset($_GET['p']) ? $_GET['p'] : 1;

// câți utilizatori să afișăm pe pagină
$users_per_page = 5;

// calculăm numărul total de pagini.
$total_pages = 1;
$offset = $users_per_page * ($page - 1);
$total_pages = ceil($total_users / $users_per_page);


// interogarea principală pentru utilizatori
$args  = array(
    // căutăm doar rolul de Abonat
    'role'      => 'Subscriber',
    // ordonăm rezultatele după display_name
    'orderby'   => 'display_name',
    // returnăm toate câmpurile
    'fields'    => 'all_with_meta',
    'number'    => $users_per_page,
    'offset'    => $offset // sărim peste numărul de utilizatori pe care îi avem pe pagină  
);

// Cream obiectul WP_User_Query
$wp_user_query = new WP_User_Query($args);

// Preluăm rezultatele
$authors = $wp_user_query->get_results();

// verificăm dacă avem utilizatori
if (!empty($authors))
{
    echo '<div class="author-entry">';
    // parcurgem fiecare autor
    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>Prenume</strong> : <?php echo $author_info->first_name; ?></span><br />
        <span class="ln"><strong>Nume</strong> : <?php echo $author_info->last_name; ?></span><br />
        <span class="em"><strong>Adresă email</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>Biografie</strong> :<br /><?php echo $author_info->description ; ?></span>
        <div class="clear">&nbsp;</div>

    <?php 
    }
    echo '</div>';
} else {
    echo 'Nu s-au găsit autori';
}

// preluăm parametrii curenti ai interogării
$query_string = $_SERVER['QUERY_STRING'];

// Variabila $base stochează URL-ul complet către pagina noastră, inclusiv argumentul paginii curente

// dacă sunteți în admin, baza ar trebui să fie URL-ul adminului + calea paginii
$base = admin_url('your-page-path') . '?' . remove_query_arg('p', $query_string) . '%_%';

// dacă sunteți pe front-end, baza este pagina curentă
//$base = get_permalink( get_the_ID() ) . '?' . remove_query_arg('p', $query_string) . '%_%';

echo paginate_links( array(
    'base' => $base, // URL-ul de bază, inclusiv argumentul de interogare
    'format' => '&p=%#%', // acesta definește parametrul de interogare care va fi folosit, în acest caz "p"
    'prev_text' => __('&laquo; Anterior'), // text pentru pagina anterioară
    'next_text' => __('Următor &raquo;'), // text pentru pagina următoare
    'total' => $total_pages, // numărul total de pagini pe care le avem
    'current' => $page, // pagina curentă
    'end_size' => 1,
    'mid_size' => 5,
));
4 iul. 2012 18:03:14
Comentarii

+1 Aș fi apreciat dacă codul ar fi fost împărțit și explicat :)

kaiser kaiser
4 iul. 2012 23:28:04

Am adăugat niște comentarii mai bune și am rezolvat câteva bug-uri :)

Pippin Pippin
4 iul. 2012 23:53:22

Mulțumesc pentru asta @Pippin, o să încerc când ajung în studio. O întrebare: ce pun în partea 'your-page-path' din admin_url? Este rădăcina site-ului meu?

Osu Osu
5 iul. 2012 19:02:10

Pagina care afișează utilizatorii este în administrare sau în front-end?

Pippin Pippin
5 iul. 2012 23:10:23

Salut @Pippin, este în front-end, dar eram curios la ce servea acea parte din cod :)

Osu Osu
6 iul. 2012 12:41:58

Această parte a codului este necesară pentru generarea link-urilor de paginare. Funcția paginate_links() trebuie să știe cărui URL să adauge argumentele de interogare. Ți-am dat doar un exemplu pentru administrare și unul pentru front-end, dar poți ignora versiunea pentru administrare.

Pippin Pippin
6 iul. 2012 16:57:43

Îmi place la nebunie acest template. Un șablon complet funcțional ;) mulțumesc mult. Pentru cei care copiază și lipesc (și poate îl editează) - variabila $limit trebuie schimbată în $users_per_page. Presupun că s-a pierdut când au fost adăugate explicațiile.

Sagive Sagive
11 sept. 2014 15:38:49

Abordare interesantă. Am observat că rulezi 2 interogări aici: prima pentru a obține toți utilizatorii și a doua pentru a obține doar utilizatorii de pe pagina corespunzătoare. Nu ar fi mai eficient din punct de vedere al performanței dacă ai folosi o singură interogare și apoi ai folosi array_slice pentru a împărți rezultatele pe pagini? Se pare că, deoarece execuți 2 interogări diferite pe aceleași date, ai putea economisi performanță renunțând la una.

codescribblr codescribblr
22 iun. 2015 05:35:06

Interogarea folosită pentru numărarea totală a utilizatorilor poate fi înlocuită cu $total_users = $wp_user_query->get_total();

1naveengiri 1naveengiri
15 mar. 2019 14:18:12
Arată celelalte 4 comentarii
6
12

Chiar nu ar trebui să folosești răspunsul lui Pippin. Interogarea este foarte ineficientă. $user_count_query din exemplu poate returna până la 999.999 de utilizatori din baza de date către scriptul tău, cu toate câmpurile utilizatorilor. Acest lucru va atinge cu siguranță limitele de memorie și/sau timp pentru PHP dacă/când site-ul tău va crește suficient de mult.

Dar aceasta poate fi singura soluție din 2012.

Iată o metodă mai bună de a face acest lucru. În acest exemplu am doar pagina următoare și anterioară, dar dacă ai nevoie de paginare numerotată, variabilele sunt acolo pentru a o construi. WordPress nu are o funcție de paginare compatibilă cu WP_User_Query (după cunoștințele mele).

<?php

// Variabile de paginare
$current_page = get_query_var('paged') ? (int) get_query_var('paged') : 1;
$users_per_page = 2; // CREȘTE ACEASTA VALOARE DUPĂ TESTARE ;)

$args = array(
    'number' => $users_per_page, // Câți pe pagină
    'paged' => $current_page // Ce pagină să obțină, începând de la 1.
);

$users = new WP_User_Query( $args );

$total_users = $users->get_total(); // Câți utilizatori avem în total (dincolo de pagina curentă)
$num_pages = ceil($total_users / $users_per_page); // Câte pagini de utilizatori vom avea nevoie

?>
    <h3>Pagina <?php echo $current_page; ?> din <?php echo $num_pages; ?></h3>
    <p>Se afișează <?php echo $users_per_page; ?> din <?php echo $total_users; ?> utilizatori</p>

    <table>
        <thead>
            <tr>
                <th>Prenume</th>
                <th>Nume</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 anterioară
        if ( $current_page > 1 ) {
            echo '<a href="'. add_query_arg(array('paged' => $current_page-1)) .'">Pagina Anterioară</a>';
        }

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

Exemplu care arată pagina 2:

tabel cu utilizatori, începând cu pagina 2


Actualizare 8/6/2018: Cum să adaugi numere de pagină în loc de Următoare/Anterioară

Dacă dorești să ai numere de pagină în loc de linkuri următoare/anterioară, iată cum poți configura acest lucru. Reține că va trebui să înlocuiești numerele cu linkuri către pagini, acestea nu vor fi clickabile în acest exemplu (bazat pe https://stackoverflow.com/a/11274294/470480, modificat pentru a afișa o cantitate consistentă de numere din mijloc și pentru a nu adăuga "..." decât dacă o pagină este efectiv sărită).

Poți vedea și fișierul meu gist care conține o funcție reutilizabilă pentru acest scop.

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

$edge_number_count = 2; // Schimbă această valoare, opțional

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

// Scade unu pentru a nu împărți numărul de început inutil, de ex: "1 ... 2 3" ar trebui să înceapă ca "1 2 3"
if ( ($start_number - 1) < 1 ) {
    $start_number = 1;
    $end_number = min($num_pages, $start_number + ($edge_number_count*2));
}

// Adaugă unu pentru a nu împărți numărul de sfârșit inutil, de ex: "8 9 ... 10" ar trebui să rămână "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} ";

Ieșire (de la pagina 1 la 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 mai 2017 05:10:44
Comentarii

Sunt de acord. Răspunsul lui Pippin necesită 2 accesări la baza de date care ar trebui evitate dacă este posibil.

The Sumo The Sumo
18 aug. 2017 18:16:27

Salut @radley-sustaire, aceasta este o soluție excelentă, dar mă întrebam dacă există o modalitate de a schimba partea cu "afișare 2 din 6 utilizatori" în intervalul real de utilizatori pe pagină. Deci ceva de genul "afișare 1-2 din 6" pentru pagina 1, "3-4 din 6" pentru pagina 2 și "5-6 din 6" pentru pagina 3. În prezent, se afișează doar "2 din 6" pentru toate paginile.

damienoneill2001 damienoneill2001
13 feb. 2018 12:50:27

@damienoneill2001 Este o idee bună, poți începe cu ceva de genul: $start_user_num = (($current_page-1) * $users_per_page) + 1; și $end_user_num = $start_user_num + count($users->get_results());.

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

@RadleySustaire excelent, mulțumesc pentru asta. La început, am primit următoarea eroare: Call to a member function get_results() on a non-object așa că am modificat $end_user_number în $start_user_num + ($users_per_page-1); și asta a rezolvat problema. Mulțumesc din nou!

damienoneill2001 damienoneill2001
14 feb. 2018 13:42:49

Se pare că am vorbit prea devreme despre asta. Când ajung la ultima pagină care nu conține o listă completă de utilizatori, evident că afișează o cifră greșită pentru $end_user_number în soluția mea. Înapoi la planșetă, ha!

damienoneill2001 damienoneill2001
14 feb. 2018 15:41:20

paged nu pare să funcționeze pentru mine, ci mai degrabă offset

Tim Hallman Tim Hallman
6 mar. 2019 22:23:58
Arată celelalte 1 comentarii
0

Toată recunoștința ar trebui să meargă către @radley-sustaire pentru răspunsul său, dar am observat o mică problemă în versiunea sa, așa că împărtășesc aici versiunea mea corectată.

În versiunea mea, filtraream rezultatele și după locație, cuvinte cheie etc., așa că unele pagini aveau mai puține rezultate decât variabila '$users_per_page'. De exemplu, dacă setam să afișez 10 utilizatori pe pagină, dar filtrarea returna doar 3 utilizatori, primeam mesajul "Se afișează 10 din 3 utilizatori" în partea de sus a paginii. Evident, acest lucru nu avea sens, așa că am adăugat o simplă condiție "if" pentru a verifica dacă numărul de rezultate era mai mare decât variabila '$users_per_page'.

Radley, dacă editezi răspunsul tău cu această actualizare, voi vota cu plăcere pentru el ca răspuns corect, deoarece cred că este mai bun decât soluția lui Pippin.

Iată codul final pentru cei care doresc să-l folosească.

<?php

// Variabile pentru paginare
$current_page = get_query_var('paged') ? (int) get_query_var('paged') : 1;
$users_per_page = 10;

$args = array(
    'number' => $users_per_page, // Câți utilizatori pe pagină
    'paged' => $current_page // Ce pagină să se afișeze, începând de la 1.
);

$users = new WP_User_Query( $args );

$total_users = $users->get_total(); // Câți utilizatori avem în total (dincolo de pagina curentă)
$num_pages = ceil($total_users / $users_per_page); // Câte pagini de utilizatori vom avea nevoie

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

?>
    <h3>Pagina <?php echo $current_page; ?> din <?php echo $num_pages; ?></h3>
    <p>Se afișează <?php echo $users_per_page; ?> din <?php echo $total_users; ?> utilizatori</p>

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

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