Пагинация для списка пользователей

Вопрос или проблема

Я показываю всех пользователей, используя функцию get_user(). Но мне нужно разбить результаты на страницы. Я пробовал много способов, но не добился успеха. Вот код, который не работает так, как ожидалось:

$args = array( 'meta_query' => array(
    array(
        'key'   => 'ib_s2member_custom_fields',
        'value' => trim($_GET["country"]),
        'compare' => 'LIKE'
    ),
array(
        'key'   => 'ib_s2member_custom_fields',
        'value' => trim($_GET["city"]),
        'compare' => 'LIKE'
    ),
    array(
        'key'   => 'ib_s2member_custom_fields',
        'value' => $first_name,
        'compare' => 'LIKE'
    ),
array(
        'key'   => 'ib_s2member_custom_fields',
        'value' => $last_name,
        'compare' => 'LIKE'
    )
) );

$users = get_users( $args );

Вы можете использовать класс WP_User_Query вместо функции get_users() для достижения этой цели. Новый измененный код будет похож на следующий:

<?php
/*
 * Мы начинаем с запроса, чтобы получить всех пользователей
 * Нам нужно общее количество пользователей, чтобы мы могли рассчитать, сколько страниц будет
 */

$count_args  = array(
'number'    => 999999      
);
$user_count_query = new WP_User_Query($count_args);
$user_count = $user_count_query->get_results();

// подсчитываем количество пользователей, найденных в запросе
$total_users = $user_count ? count($user_count) : 1;

// получаем номер текущей страницы и устанавливаем 1, если номер страницы не установлен
$page = isset($_GET['p']) ? $_GET['p'] : 1;

// сколько пользователей показывать на странице
$users_per_page = 5;

// вычисляем общее количество страниц.
$total_pages = 1;
$offset = $users_per_page * ($page - 1);
$total_pages = ceil($total_users / $users_per_page);

// основной запрос пользователей
$args = array(
'number'    => $users_per_page,
'offset'    => $offset, 
'meta_query' => array(
'relation' => 'OR',
array(
    'key'     => 'country',
    'value'   => 'Israel',
    'compare' => '='
),
array(
    'key'     => 'age',
    'value'   => array( 20, 30 ),
    'type'    => 'numeric',
    'compare' => 'BETWEEN'
)
)
);

$user_query = new WP_User_Query( $args );

// Получаем результаты
$users = $user_query->get_results();

// Цикл пользователей
if ( ! empty( $users->results ) ) {
foreach ( $users->results as $user ) {
echo '<p>' . $user->display_name . '</p>';
}
} else {
echo 'Пользователи не найдены.';
}

// получаем текущие параметры запроса
$query_string = $_SERVER['QUERY_STRING'];

// Переменная $base хранит полный URL нашей страницы, включая аргумент текущей страницы

// если в админке, ваш базовый URL будет URL админки + ваш путь страницы
$base = admin_url('your-page-path') . '?' . remove_query_arg('p', $query_string) . '%_%';

// если на фронтенде, ваш базовый URL - это текущая страница
//$base = get_permalink( get_the_ID() ) . '?' . remove_query_arg('p', $query_string) . '%_%';

echo paginate_links( array(
'base' => $base, // базовый URL, включая аргумент запроса
'format' => '&p=%#%', // это определяет параметр запроса, который будет использоваться, в данном случае "p"
'prev_text' => __('&laquo; Предыдущая'), // текст для предыдущей страницы
'next_text' => __('Следующая &raquo;'), // текст для следующей страницы
'total' => $total_pages, // общее количество страниц
'current' => $page, // текущая страница
'end_size' => 1,
'mid_size' => 5,
));
?>

Для получения дополнительной информации о WP_User_Query посетите эту страницу.

Ответ или решение

Конечно! Ниже представлено подробное руководство по пагинации списка пользователей в WordPress с использованием класса WP_User_Query.

Пагинация списка пользователей

Вам необходимо реализовать пагинацию для списка пользователей, используя мета-запросы. Вместо функции get_users(), мы будем использовать класс WP_User_Query, который обеспечивает более гибкие возможности для работы с запросами пользователей в WordPress. Вот как это можно сделать:

Шаг 1: Подсчет общего числа пользователей

Сначала нужно выполнить запрос для получения общего количества пользователей, чтобы вычислить, сколько страниц требуется для отображения.

$count_args = array(
    'number' => -1 // Получаем всех пользователей
);
$user_count_query = new WP_User_Query($count_args);
$user_count = $user_count_query->get_results();

$total_users = $user_count ? count($user_count) : 1; // Общее количество пользователей

Шаг 2: Определение текущей страницы и количества пользователей на странице

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

$page = isset($_GET['p']) ? (int) $_GET['p'] : 1; // Текущая страница (по умолчанию 1)
$users_per_page = 5; // Количество пользователей на странице
$offset = $users_per_page * ($page - 1); // Сдвиг
$total_pages = ceil($total_users / $users_per_page); // Общее количество страниц

Шаг 3: Выполнение основного запроса пользователей

Теперь можно выполнить основной запрос для получения пользователей:

$args = array(
    'number' => $users_per_page,
    'offset' => $offset,
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'ib_s2member_custom_fields',
            'value' => trim($_GET["country"]),
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'ib_s2member_custom_fields',
            'value' => trim($_GET["city"]),
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'ib_s2member_custom_fields',
            'value' => $first_name,
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'ib_s2member_custom_fields',
            'value' => $last_name,
            'compare' => 'LIKE'
        )
    )
);

$user_query = new WP_User_Query($args);
$users = $user_query->get_results();

Шаг 4: Вывод пользователей

Теперь вы можете вывести пользователей из полученного результата:

if (!empty($users)) {
    foreach ($users as $user) {
        echo '<p>' . esc_html($user->display_name) . '</p>';
    }
} else {
    echo 'Пользователи не найдены.';
}

Шаг 5: Генерация ссылок пагинации

Для создания ссылок пагинации используем функцию paginate_links():

$query_string = $_SERVER['QUERY_STRING'];
$base = admin_url('your-page-path') . '?' . remove_query_arg('p', $query_string) . '%_%'; // базовый URL

echo paginate_links(array(
    'base' => $base, // база URL с параметрами запроса
    'format' => '&p=%#%', // параметр, который будет использоваться для навигации
    'prev_text' => __('&laquo; Назад'), // текст для предыдущей страницы
    'next_text' => __('Далее &raquo;'), // текст для следующей страницы
    'total' => $total_pages, // общее количество страниц
    'current' => $page, // текущая страница
    'end_size' => 1,
    'mid_size' => 5,
));

Заключение

Все вышеуказанные шаги обеспечивают правильную пагинацию списка пользователей на вашем сайте WordPress. Проверьте, чтобы обработать параметры извлечения и минимизировать использование глобальных переменных для лучшей организации кода.

Если у вас есть дополнительные вопросы или вам нужна дальнейшая помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...