Пользователи вместо сообщений: Как изменить основной запрос?


Я пытаюсь создать архив пользователей. Моей первой мыслью было использовать 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 /

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

Мой вопрос

Можно ли изменить основной цикл для запроса пользователей, а не сообщений? Если да, то как это можно сделать?

Если вы считаете, что это плохой подход, пожалуйста, скажите, почему (я был бы рад услышать альтернативы).

Author: henrywright, 2017-05-27

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 Базовая клиентская библиотека, которая может обрабатывать, например, коллекцию пользователей.

Надеюсь, это поможет!

 2
Author: birgire, 2017-05-28 10:59:14