Пользователи вместо сообщений: Как изменить основной запрос?
Я пытаюсь создать архив пользователей. Моей первой мыслью было использовать WP_User_Query
внутри страницы для создания вторичного цикла.
$wp_user_query = new WP_User_Query( $args );
// Loop here.
Это, по-видимому, работает хорошо, пока я не попытаюсь посетить страницы 2, 3, 4 и так далее.
Основной запрос (который обрабатывает разбивку на страницы) предназначен для страницы , поэтому в основном запросе есть только 1 "сообщение". Это означает, что есть первая страница:
- example.com/page-name /
... но ничего из нижеперечисленного не существует в глаза основного запроса:
- example.com/page-name/page/2 /
- example.com/page-name/page/3 /
- example.com/page-name/page/4 /
Как вы можете видеть, мой подход к использованию вторичного цикла не очень хорош, потому что разбивка на страницы не выполняется.
Мой вопрос
Можно ли изменить основной цикл для запроса пользователей, а не сообщений? Если да, то как это можно сделать?
Если вы считаете, что это плохой подход, пожалуйста, скажите, почему (я был бы рад услышать альтернативы).
1 answers
Пользовательский параметр ПОЛУЧЕНИЯ разбиения на страницы
Мы можем использовать пользовательский параметр разбиения на страницы GET, напримерupage
или, возможно, более уникальный, как wpse-user-page
, для использования с вашим WP_User_Query
. Таким образом, вы избегаете влияния, например, на основной запрос post.
Создание ссылок на страницы с помощью pageinate_links()
Мы можем использовать paginate_links()
чтобы создать разбивку на страницы:
$args = array(
'base' => '%_%',
'format' => '?upage=%#%',
'total' => $total_pages, // e.g. ceil( $total_users / $number );
'current' => $current_page, // from our custom GET pagination parameter
);
$paginate_html = sprintf(
'<div class="users-pagination">%s</div>',
paginate_links( $args )
);
Где отобразить архив пользователя?
Мы можем, например, отобразить его на данной странице, использование шорткода или пользовательского шаблона страницы .
Улучшите URL-адрес разбиения на страницы пользовательского архива
Вот несколько подходов для улучшения пользовательского параметра разбиения на страницы GET:
A) Добавьте его в качестве пользовательской конечной точки на страницы с:
add_rewrite_endpoint( 'upage', EP_PAGES );
Подключив это к действию init
, а затем после сохранения постоянных ссылок получите доступ к архиву пользователей со всех страниц:
example.tld/authoes/upage/123/
example.tld/someotherpage/asubpage/upage/123/
... etc ...
Затем мы извлекаем текущую страницу с помощью:
get_query_var( 'upage', 1 );
Б) Если мы хотим нацелиться на определенный фрагмент страницы (например, authors
), мы можем подключить следующее к крючку init
:
add_rewrite_rule(
'^authors/upage/?([0-9]{1,})/?$',
'index.php?pagename=authors&upage=$matches[1]',
'top'
);
, А затем зарегистрируйте upage
в качестве переменной запроса:
add_filter( 'query_vars', function( $vars ) {
$vars[] = 'upage';
return $vars;
} );
После сохранения постоянных ссылок мы получаем доступ к пользовательскому архиву из:
example.tld/authors/upage/123/
C) Если бы мы могли также переопределить часть URL page
, которая соответствует переменной запроса paged
, с помощью:
add_rewrite_rule(
'^authors/page/?([0-9]{1,})/?$',
'index.php?pagename=authors&upage=$matches[1]',
'top'
);
Где мы регистрируем upage
в качестве переменной запроса как раньше.
Затем, после сохранения постоянных ссылок, мы можем получить доступ к пользовательскому архиву из:
example.tld/authors/page/123/
D) Мы также могли бы просто использовать переменную запроса page
для страницы authors
и получить доступ к пользовательскому архиву с помощью:
example.tld/authors/123/
Где находится текущая страница:
get_query_var( 'page', 1 );
Обратите внимание, что это будет мешать разбиению содержимого на страницы , но для этой переменной запроса нет проверки ограничений.
E) Мы могли бы смоделировать, как комментирует разбивка на страницы обрабатывается в ядре, которое использует переписывание, подобное этому:
(.?.+?)/comment-page-([0-9]{1,})/?$
Где cpage
- соответствующая переменная запроса разбиения комментариев на страницы для соответствия ([0-9]{1,})
.
В качестве альтернативы можно также рассмотреть возможность использования REST API с подходом javascript. Ядро поставляется с wp-api Базовая клиентская библиотека, которая может обрабатывать, например, коллекцию пользователей.
Надеюсь, это поможет!