WP_User_Query के लिए पृष्ठांकन लिंक कैसे प्रदर्शित करें?


10

मुझे लगता है कि मैं इसके साथ लगभग वहाँ हूँ, लेकिन मैं लेखकों की एक निर्देशिका के लिए दिखाने के लिए पृष्ठांकन लिंक नहीं प्राप्त कर सकता हूं।

मेरा कोड नीचे है, लेकिन मुझे नहीं पता कि लेखकों के पृष्ठों के बीच काम करने के लिए नेविगेट करने के लिए लिंक कैसे प्राप्त करें। क्या कोई मेरी मदद कर सकता है? मुझे लग रहा है कि यह उपयोग का हो सकता है, लेकिन मुझे नहीं पता कि इसे कैसे लागू किया जाए:

paginate_links ()

धन्यवाद

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

आप देख रहे हैं अजाक्स के लिए तो यहाँ जाएँ wordpress.stackexchange.com/questions/113379/...
साबिर अब्दुल गफूर शेख

जवाबों:


17

यह आपको वास्तव में पास होना चाहिए। मैंने इसका परीक्षण नहीं किया है, लेकिन यह एक सेटअप के समान है जिसे मैंने कुछ बार उपयोग किया है।

/*
 * 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 का आनंद लिया होगा यदि कोड को अलग किया जाएगा और समझाया जाएगा :)
kaiser

5
वहाँ, कुछ बेहतर टिप्पणियाँ जोड़ीं और एक बग या दो :) तय किया
पिपिन

इस @ पिप्पिन के लिए धन्यवाद, जब मैं स्टूडियो में पहुँचूँगा तो इसे आज़माऊँगा। एक प्रश्न: मैं admin_url के 'आपके पृष्ठ-पथ' भाग में क्या डालूँ? क्या मेरी साइट का मूल है?
Osu

क्या वह पृष्ठ जो आपके उपयोगकर्ताओं को व्यवस्थापक या सामने के छोर पर दिखा रहा है?
पिप्पिन

1
दिलचस्प दृष्टिकोण। मैंने देखा कि आप यहाँ 2 प्रश्न चला रहे हैं: पहला सभी उपयोगकर्ताओं को प्राप्त करने के लिए और दूसरा उपयुक्त पृष्ठ पर केवल उपयोगकर्ताओं को प्राप्त करने के लिए। अगर आप केवल 1 क्वेरी का उपयोग करते हैं और फिर परिणाम में पृष्ठों को विभाजित करने के लिए array_slice का उपयोग करते हैं तो क्या यह बेहतर प्रदर्शन नहीं करेगा? ऐसा लगता है कि आप एक ही डेटा पर 2 अलग-अलग क्वेरी कर रहे हैं, जिसे आप एक ड्रॉप करके कुछ प्रदर्शन को बचा सकते हैं।
कोडब्लाब्बर

11

आपको वास्तव में पिपिन द्वारा उत्तर का उपयोग नहीं करना चाहिए। क्वेरी बहुत ही अक्षम है। $user_count_queryउदाहरण में उपयोगकर्ता के सभी क्षेत्रों के साथ आपके डेटाबेस से आपकी स्क्रिप्ट पर 999,999 उपयोगकर्ता वापस आ सकते हैं। यह निश्चित रूप से मेमोरी और / या PHP के लिए समय सीमा को हिट करेगा अगर आपकी साइट काफी बड़ी हो जाती है।

लेकिन हो सकता है कि यह 2012 में एकमात्र समाधान हो।

यहाँ यह करने के लिए एक बेहतर तरीका है। इस उदाहरण में मुझे केवल अगला और पिछला पृष्ठ मिला है, लेकिन यदि आपको क्रमांकित अंकन की आवश्यकता है, तो चर इसे बनाने के लिए हैं। वर्डप्रेस के पास एक पेजिनेशन फ़ंक्शन नहीं है जो WP_User_Query (मेरी जानकारी के लिए) के साथ संगत है।

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

उदाहरण दिखा पेज 2:

उपयोगकर्ताओं की तालिका, पृष्ठ 2 पर शुरू हो रही है


6/8/2018 अपडेट करें: अगला / पिछला के बजाय पेज नंबर कैसे जोड़ें

यदि आप अगले / पिछले पेज लिंक के बजाय पेज नंबर रखना चाहते हैं , तो यहां बताया गया है कि आप इसे कैसे सेट कर सकते हैं। ध्यान दें कि आपको पृष्ठ लिंक के साथ संख्याओं को बदलने की आवश्यकता होगी, वे इस उदाहरण में क्लिक करने योग्य नहीं होंगे ( https://stackoverflow.com/a/11274294/470480 पर आधारित , मध्यम संख्या की एक सुसंगत राशि दिखाने के लिए संशोधित और जोड़ नहीं "..." जब तक कि कोई पृष्ठ वास्तव में छोड़ नहीं दिया जाता)।

आप मेरी जिस्ट फ़ाइल भी देख सकते हैं जिसमें इस उद्देश्य के लिए पुन: प्रयोज्य कार्य शामिल है।

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

आउटपुट (पेज 1 से 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]

मैं सहमत हूँ। पिपिन के उत्तर में db पर 2 हिट की आवश्यकता होती है जिसे यदि संभव हो तो टाला जाना चाहिए।
सूमो

1
Hi @ radley-sustaire, यह एक शानदार समाधान है, लेकिन मैं सोच रहा था कि क्या प्रति पृष्ठ उपयोगकर्ताओं की वास्तविक श्रेणी में "6 उपयोगकर्ताओं में से 2 को प्रदर्शित करने" वाले हिस्से को बदलने का कोई तरीका है। तो पेज 1 के लिए "6 का ​​1-2 प्रदर्शित करना", पेज 2 के लिए "3-4 का 6" और पेज 3 के लिए "5-6 का 6" जैसा कुछ है। फिलहाल, यह सिर्फ "2 ऑफ 6" के लिए दिखाता है सभी पेज।
damienoneill2001

1
@ damienoneill2001 यह एक अच्छा विचार है, आप कुछ इस तरह से शुरू कर सकते हैं: $start_user_num = (($current_page-1) * $users_per_page) + 1;और $end_user_num = $start_user_num + count($users->get_results());
राडली सुस्टेयर

@RadleySustaire उत्कृष्ट, इसके लिए धन्यवाद। सबसे पहले, मुझे निम्नलिखित त्रुटि प्राप्त हुई: Call to a member function get_results() on a non-objectइसलिए मैंने इसमें संशोधन $end_user_numberकिया $start_user_num + ($users_per_page-1);और इस समस्या को हल किया। एक बार फिर धन्यवाद!
damienoneill2001

इस पर मैंने जल्द ही बात की। जब मुझे अंतिम पृष्ठ मिलता है जिसमें उपयोगकर्ताओं की पूरी सूची नहीं होती है, तो यह स्पष्ट रूप $end_user_numberसे मेरे समाधान के लिए गलत आंकड़ा दिखाता है । ड्राइंग बोर्ड पर वापस, हा!
डेमियनोनिल 200 1

1

पूरा श्रेय उनके उत्तर के लिए @ राडले-सुस्टेयर को जाना चाहिए, लेकिन मैंने इसके साथ एक छोटी सी गड़बड़ दिखाई, इसलिए मैं यहां उत्तर का अपना संस्करण साझा कर रहा हूं।

अपने संस्करण के साथ, मैं स्थान, कीवर्ड आदि द्वारा परिणामों को फ़िल्टर कर रहा था, इसलिए कुछ पृष्ठों में '$ users_per_page' संस्करण की तुलना में कम परिणाम थे। इसलिए उदाहरण के लिए यदि मेरे पृष्ठ पर प्रति उपयोगकर्ता 10 दिखाने के लिए सेट किया गया था, लेकिन फ़िल्टर के परिणाम केवल 3 उपयोगकर्ताओं को लौटाए गए, तो मुझे पृष्ठ के शीर्ष पर '3 उपयोगकर्ताओं में से 10 प्रदर्शित करना' मिला। जाहिर है कि इससे कोई मतलब नहीं था इसलिए मैंने एक सरल "अगर" बयान को यह जांचने के लिए जोड़ा कि क्या परिणाम गिनती '$ users_per_page' चर से अधिक थी।

रेडली, यदि आप अपने उत्तर को अपडेट के साथ संपादित करते हैं, तो मैं खुशी से इसका सही जवाब दूंगा क्योंकि मुझे लगता है कि यह पिप्पिन के समाधान से बेहतर है।

तो यह किसी के लिए भी अंतिम कोड है जो वह चाहता है।

<?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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.