Wie werden Paginierungslinks für WP_User_Query angezeigt?

10

Ich glaube, ich bin damit fast fertig, aber ich kann die Paginierungslinks für ein Verzeichnis der Autoren, die ich erstelle, nicht anzeigen.

Mein Code ist unten, aber ich weiß nicht, wie ich die Links zum Navigieren zwischen den Seiten der Autoren zum Laufen bringen kann. Kann mir jemand helfen? Ich habe das Gefühl, dass dies von Nutzen sein könnte, aber ich weiß nicht, wie ich es implementieren soll:

paginate_links ()

Vielen Dank

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
quelle
Wenn Sie nach Ajax suchen, besuchen Sie hier wordpress.stackexchange.com/questions/113379/…
Sabir Abdul Gafoor Shaikh

Antworten:

17

Dies sollte Sie wirklich nah bringen. Ich habe es nicht getestet, aber es ist fast identisch mit einem Setup, das ich einige Male verwendet habe.

/*
 * 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,
));
Pippin
quelle
2
+1 Hätte es genossen, wenn der Code aufgeteilt und erklärt worden wäre :)
Kaiser
5
Dort einige bessere Kommentare hinzugefügt und ein oder zwei Fehler behoben :)
Pippin
Danke für diesen @Pippin, ich werde es ausprobieren, wenn ich im Studio bin. Eine Frage: Was füge ich in den 'your-page-path'-Teil der admin_url ein? Ist das die Wurzel meiner Seite?
Osu
Wird die Seite, auf der Ihre Benutzer angezeigt werden, im Administrator oder im Frontend angezeigt?
Pippin
1
Interessanter Ansatz. Mir ist aufgefallen, dass Sie hier zwei Abfragen ausführen: die erste, um alle Benutzer zu erhalten, und die zweite, um nur die Benutzer auf die entsprechende Seite zu bringen. Wäre es nicht besser, wenn Sie nur eine Abfrage verwenden und dann array_slice verwenden würden, um die Ergebnisse in Seiten aufzuteilen? Da Sie zwei verschiedene Abfragen für dieselben Daten ausführen, können Sie anscheinend Leistung sparen, indem Sie eine löschen.
Codescribblr
11

Sie sollten die Antwort von Pippin wirklich nicht verwenden. Die Abfrage ist sehr ineffizient. $user_count_queryIm Beispiel können bis zu 999.999 Benutzer aus Ihrer Datenbank mit allen Benutzerfeldern an Ihr Skript zurückgegeben werden. Dies wird sicherlich den Speicher und / oder das Zeitlimit für PHP erreichen, wenn Ihre Site groß genug wird.

Aber das war vielleicht die einzige Lösung im Jahr 2012.

Hier ist ein besserer Weg, dies zu tun. In diesem Beispiel habe ich nur die nächste und vorherige Seite, aber wenn Sie eine nummerierte Paginierung benötigen, sind die Variablen da, um sie aufzubauen. WordPress hat keine Paginierungsfunktion, die mit WP_User_Query kompatibel ist (meines Wissens).

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

Beispiel für Seite 2:

Benutzertabelle ab Seite 2


Update 08.06.2008: Hinzufügen von Seitenzahlen anstelle von Weiter / Zurück

Wenn Sie Seitenzahlen anstelle von Links zur nächsten / vorherigen Seite haben möchten, können Sie dies wie folgt einrichten. Beachten Sie, dass Sie die Zahlen durch Seitenlinks ersetzen müssen. In diesem Beispiel können sie nicht angeklickt werden (basierend auf /programming//a/11274294/470480 , geändert, um eine konsistente Anzahl von mittleren Zahlen anzuzeigen und nicht hinzuzufügen das "...", es sei denn, eine Seite wird tatsächlich übersprungen).

Sie können auch meine Hauptdatei sehen, die eine wiederverwendbare Funktion für diesen Zweck enthält.

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

Ausgabe (von Seite 1 bis 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
quelle
Genau. Pippins Antwort erfordert 2 Treffer auf der Datenbank, die nach Möglichkeit vermieden werden sollten.
Der Sumo
1
Hallo @ radley-sustaire, dies ist eine großartige Lösung, aber ich habe mich gefragt, ob es eine Möglichkeit gibt, den Teil "Anzeige von 2 von 6 Benutzern" in den tatsächlichen Benutzerbereich pro Seite zu ändern. So etwas wie "1-2 von 6 anzeigen" für Seite 1, "3-4 von 6" für Seite 2 und "5-6 von 6" für Seite 3. Im Moment wird nur "2 von 6" für angezeigt alle Seiten.
damienoneill2001
1
@ damienoneill2001 Das ist eine gute Idee, du kannst mit so etwas beginnen wie: $start_user_num = (($current_page-1) * $users_per_page) + 1;und $end_user_num = $start_user_num + count($users->get_results());.
Radley Sustaire
@RadleySustaire ausgezeichnet, danke dafür. Zunächst erhielt ich folgende Fehlermeldung: Call to a member function get_results() on a non-objectso geändert ich $end_user_numberzu $start_user_num + ($users_per_page-1);und dass das Problem gelöst. Danke noch einmal!
damienoneill2001
Es stellte sich heraus, dass ich bald darüber gesprochen habe. Wenn ich zur letzten Seite komme, die keine vollständige Liste der Benutzer enthält, wird offensichtlich die falsche Zahl für die $end_user_numberin meiner Lösung angezeigt. Zurück zum Zeichenbrett, ha!
damienoneill2001
1

Der volle Kredit sollte an @ radley-sustaire für seine Antwort gehen, aber ich habe einen kleinen Fehler entdeckt, also teile ich meine Version der Antwort hier.

Mit meiner Version habe ich die Ergebnisse auch nach Speicherort, Schlüsselwort usw. gefiltert, sodass einige Seiten weniger Ergebnisse hatten als die Variable '$ users_per_page'. Wenn zum Beispiel meine Benutzer pro Seite auf 10 eingestellt waren, die Ergebnisse des Filters jedoch nur 3 Benutzer zurückgaben, wurde oben auf der Seite "10 von 3 Benutzern anzeigen" angezeigt. Offensichtlich machte dies keinen Sinn, also fügte ich eine einfache "if" -Anweisung hinzu, um zu überprüfen, ob die Ergebnisanzahl höher als die Variable '$ users_per_page' war.

Radley, wenn Sie Ihre Antwort mit dem Update bearbeiten, werde ich sie gerne als die richtige Antwort wählen, da ich denke, dass sie besser ist als Pippins Lösung.

Dies ist also der endgültige Code für jeden, der ihn möchte.

<?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>
Der Sumo
quelle