Làm cách nào để hiển thị các liên kết phân trang cho WP_User_Query?


10

Tôi nghĩ rằng tôi đang ở gần đó với điều này, nhưng tôi không thể có các liên kết phân trang để hiển thị cho một thư mục của các tác giả tôi đang tạo.

Mã của tôi ở bên dưới, nhưng tôi không biết làm thế nào để các liên kết điều hướng giữa các trang của tác giả hoạt động. Ai giúp tôi với? Tôi có cảm giác nó có thể được sử dụng, nhưng tôi không biết làm thế nào để thực hiện nó:

paginating_links ()

Cảm ơn

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

nếu bạn đang tìm kiếm Ajax thì hãy truy cập vào đây wordpress.stackexchange.com/questions/113379/iêu
Sabir Abdul Gafoor Shaikh

Câu trả lời:


17

Điều này sẽ giúp bạn thực sự gần gũi. Tôi chưa thử nó, nhưng nó gần giống với thiết lập tôi đã sử dụng một vài lần.

/*
 * 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 Sẽ rất thích nếu mã được tách và giải thích :)
kaiser

5
Ở đó, đã thêm một số nhận xét tốt hơn và sửa một hoặc hai lỗi :)
Pippin

Cảm ơn vì @Pippin này, tôi sẽ dùng thử khi vào phòng thu. Một câu hỏi: tôi nên đặt gì trong phần 'your-page-path' của admin_url? Đó có phải là gốc của trang web của tôi?
Osu

Là trang đang hiển thị người dùng của bạn trong quản trị viên hoặc ở mặt trước?
Pippin

1
Cách tiếp cận thú vị. Tôi nhận thấy bạn đang chạy 2 truy vấn tại đây: lần đầu tiên để có được tất cả người dùng và lần thứ hai chỉ nhận được người dùng trên trang thích hợp. Nó sẽ không hoạt động tốt hơn nếu bạn chỉ sử dụng 1 truy vấn và sau đó sử dụng Array_slice để phân chia kết quả thành các trang? Có vẻ như bạn đang thực hiện 2 truy vấn khác nhau trên cùng một dữ liệu mà bạn có thể lưu một số hiệu suất bằng cách loại bỏ một truy vấn.
Codecripblr

11

Bạn thực sự không nên sử dụng câu trả lời của Pippin. Các truy vấn rất không hiệu quả. $user_count_querytrong ví dụ này có thể trả về 999.999 người dùng từ cơ sở dữ liệu của bạn vào tập lệnh của bạn, với tất cả các trường người dùng. Điều này chắc chắn sẽ đạt bộ nhớ và / hoặc giới hạn thời gian cho PHP nếu / khi trang web của bạn phát triển đủ lớn.

Nhưng đó có thể là giải pháp duy nhất trở lại vào năm 2012.

Đây là một cách tốt hơn để làm điều đó. Trong ví dụ này tôi chỉ có trang tiếp theo và trang trước nhưng nếu bạn cần đánh số trang, các biến sẽ ở đó để xây dựng nó. WordPress không có chức năng phân trang tương thích với WP_User_Query (theo hiểu biết của tôi).

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

Ví dụ hiển thị trang 2:

bảng người dùng, bắt đầu từ trang 2


Cập nhật 6/8/2018: Cách thêm số trang thay vì Tiếp theo / Trước

Nếu bạn muốn có số trang thay vì liên kết trang tiếp theo / trước, đây là cách bạn có thể thiết lập. Lưu ý rằng bạn sẽ cần thay thế các số bằng liên kết trang, chúng sẽ không thể nhấp được trong ví dụ này (dựa trên /programming//a/11274294/470480 , được sửa đổi để hiển thị số lượng giữa số nhất quán và không thêm "..." trừ khi một trang thực sự bị bỏ qua).

Bạn cũng có thể thấy tập tin chính của tôi có chức năng tái sử dụng cho mục đích này.

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

Đầu ra (từ trang 1 đến 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]

Tôi đồng ý. Câu trả lời của Pippin yêu cầu 2 lần truy cập vào db nên tránh nếu có thể.
Sumo

1
Xin chào @ radley-sustaire, đây là một giải pháp tuyệt vời, nhưng tôi đã tự hỏi liệu có cách nào để thay đổi phần "hiển thị 2 trong số 6 người dùng" thành phạm vi người dùng thực tế trên mỗi trang. Vì vậy, một cái gì đó như "hiển thị 1-2 trên 6" cho trang 1, "3-4 của 6" cho trang 2 và "5-6 trên 6" cho trang 3. Hiện tại, nó chỉ hiển thị "2 trên 6" cho tất cả các trang.
damienoneill2001

1
@ damienoneill2001 Đó là một ý tưởng hay, bạn có thể bắt đầu với một cái gì đó như: $start_user_num = (($current_page-1) * $users_per_page) + 1;$end_user_num = $start_user_num + count($users->get_results());.
Radley Sustaire

@RadleySustaire tuyệt vời, cảm ơn vì điều đó. Lúc đầu, tôi nhận được lỗi sau: Call to a member function get_results() on a non-objectvì vậy tôi sửa đổi $end_user_numberđể $start_user_num + ($users_per_page-1);và giải quyết vấn đề. Cảm ơn một lần nữa!
damienoneill2001

Hóa ra tôi đã nói chuyện sớm về điều đó. Khi tôi đến trang cuối cùng không chứa danh sách người dùng đầy đủ, rõ ràng nó hiển thị con số sai cho $end_user_numbergiải pháp của tôi. Quay lại bảng vẽ, ha!
damienoneill2001

1

Tín dụng đầy đủ nên đến @ radley-sustaire cho câu trả lời của anh ấy, nhưng tôi phát hiện ra một trục trặc nhỏ với nó vì vậy tôi đang chia sẻ phiên bản câu trả lời của mình ở đây.

Với phiên bản của tôi, tôi cũng đã lọc kết quả theo vị trí, từ khóa, v.v. để một số trang có ít kết quả hơn so với var $ users_per_page '. Vì vậy, ví dụ: nếu người dùng trên mỗi trang của tôi được đặt thành hiển thị 10, nhưng kết quả của bộ lọc chỉ trả về 3 người dùng, tôi đã nhận được 'Hiển thị 10 trong số 3 người dùng' ở đầu trang. Rõ ràng điều này không có ý nghĩa vì vậy tôi đã thêm một câu lệnh "nếu" đơn giản để kiểm tra xem số lượng kết quả có cao hơn biến số '$ users_per_page' hay không.

Radley, nếu bạn chỉnh sửa câu trả lời của mình bằng bản cập nhật, tôi sẽ vui vẻ bình chọn cho nó là câu trả lời đúng vì tôi nghĩ nó tốt hơn giải pháp của Pippin.

Vì vậy, đây là mã cuối cùng cho bất cứ ai muốn nó.

<?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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.