Как отобразить ссылки на страницы для WP_User_Query?


10

Я думаю, что я почти с этим, но я не могу получить ссылки на нумерацию страниц для каталога авторов, которые я создаю.

Мой код ниже, но я не знаю, как заставить работать ссылки на страницах авторов. Может кто-нибудь помочь мне? У меня есть ощущение, что это может быть полезно, но я не знаю, как это реализовать:

paginate_links ()

Спасибо

Осу

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

если вы ищете Ajax, тогда посетите здесь 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
Там добавили несколько лучших комментариев и исправили одну или две ошибки :)
Пиппин

Спасибо за этот @Pippin, я попробую, когда попаду в студию. Один вопрос: что я помещаю в часть пути вашей страницы в admin_url? Это корень моего сайта?
Осу

Это страница, которая показывает ваших пользователей в админке или на внешнем интерфейсе?
Пиппин

1
Интересный подход. Я заметил, что вы запускаете 2 запроса: первый - для всех пользователей, а второй - только для пользователей на соответствующей странице. Разве это не будет работать лучше, если вы используете только 1 запрос, а затем используете array_slice для разделения результатов на страницы? Кажется, поскольку вы выполняете 2 разных запроса для одних и тех же данных, вы можете снизить производительность, отбросив один.
codescribblr

11

Вы действительно не должны использовать ответ Пиппина. Запрос очень неэффективен. $user_count_queryв этом примере можно вернуть до 999 999 пользователей из вашей базы данных в ваш сценарий со всеми пользовательскими полями. Это наверняка затронет память и / или ограничения по времени для PHP, если / когда ваш сайт станет достаточно большим.

Но это, возможно, было единственным решением еще в 2012 году.

Вот лучший способ сделать это. В этом примере у меня есть только следующая и предыдущая страницы, но если вам нужна нумерованная нумерация страниц, то для ее создания есть переменные. В WordPress нет функции разбиения на страницы, которая совместима с 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


Обновление 8/8/2018: Как добавить номера страниц вместо Следующая / Предыдущая

Если вы хотите иметь номера страниц вместо ссылок на следующую / предыдущую страницу, вот как это можно настроить. Обратите внимание, что вам нужно будет заменить числа ссылками на страницы, в этом примере они не будут активными (на основе https://stackoverflow.com/a/11274294/470480 , измененных для отображения согласованного количества средних чисел и не добавляющих "...", если страница фактически не пропущена).

Вы также можете увидеть мой файл gist, который содержит функцию многократного использования для этой цели.

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

Я согласен. Ответ Пиппина требует 2 попадания в БД, которых следует избегать, если это возможно.
Сумо

1
Привет @ radley-sustaire, это отличное решение, но мне было интересно, есть ли способ изменить часть «отображение 2 из 6 пользователей» на фактический диапазон пользователей на страницу. Таким образом, что-то вроде «отображения 1-2 из 6» для страницы 1, «3-4 из 6» для страницы 2 и «5-6 из 6» для страницы 3. На данный момент, это просто показывает «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в моем решении. Вернуться к чертежной доске, ха!
damienoneill2001

1

Полный ответ должен быть получен от @ radley-sustaire за его ответ, но я заметил небольшой сбой, так что я делюсь своей версией ответа здесь.

В моей версии я также фильтровал результаты по местоположению, ключевым словам и т. Д., Поэтому некоторые страницы имели меньше результатов, чем переменная '$ users_per_page'. Так, например, если для моих пользователей на странице было установлено значение 10, но результаты фильтра вернули только 3 пользователей, я получил «Отображение 10 из 3 пользователей» в верхней части страницы. Очевидно, что это не имело смысла, поэтому я добавил простой оператор if, чтобы проверить, было ли количество результатов больше, чем переменная $ 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 и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.