web-dev-qa-db-fra.com

Utilisateurs au lieu de messages: Comment modifier la requête principale?

J'essaie de créer une archive d'utilisateurs. Ma première pensée a été d'utiliser WP_User_Query dans une page pour créer une boucle secondaire.

$wp_user_query = new WP_User_Query( $args );
// Loop here.

Cela semble bien fonctionner jusqu'à ce que j'essaie de consulter les pages 2, 3, 4, etc.

La requête principale (qui gère la pagination) est destinée à la page . Il n'y a donc qu'un "post" dans la requête principale. Cela signifie qu'il y a une première page:

  • exemple.com/nom-page/

... mais rien de ce qui suit n'existe aux yeux de la requête principale:

  • exemple.com/nom-page/page/2/
  • exemple.com/nom-page/page/3/
  • exemple.com/nom-page/page/4/

Comme vous pouvez le constater, l'utilisation d'une boucle secondaire ne me convient pas, car la pagination échoue.

Ma question

La boucle principale peut-elle être modifiée pour interroger des utilisateurs et non des publications? Si oui, comment cela peut-il être fait?

Si vous pensez que c'est une mauvaise approche, veuillez expliquer pourquoi (je serais heureux d'entendre d'autres solutions).

2
henrywright

Paramètre de pagination GET personnalisé

Nous pouvons utiliser un paramètre de pagination GET personnalisé, par exemple. upage ou probablement plus unique que wpse-user-page, à utiliser avec votre WP_User_Query. De cette façon, vous évitez d’affecter, par exemple, la requête principale post.

Génère des liens de pagination avec pageinate_links()

Nous pouvons utiliser paginate_links() pour générer la pagination:

$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 ) 
);

Où afficher l'archive utilisateur?

Nous pouvons par exemple l'afficher sur une page donnée, en utilisant un shortcode ou un modèle de page personnalisé .

Confirmez l'URL de pagination de l'archive utilisateur

Voici quelques approches pour simplifier le paramètre de pagination GET personnalisé:

A) Ajoutez-le comme point de terminaison personnalisé aux pages avec:

add_rewrite_endpoint( 'upage', EP_PAGES );

en l'accrochant à l'action init puis, après avoir enregistré les permaliens, accédez à l'archive utilisateur à partir de toutes les pages:

example.tld/authoes/upage/123/
example.tld/someotherpage/asubpage/upage/123/
... etc ...

Ensuite, nous récupérons la page actuelle avec:

get_query_var( 'upage', 1 );

B) Si nous voulons cibler un slug de page donné (par exemple, authors), nous pouvons accrocher ce qui suit dans le crochet init:

add_rewrite_rule( 
    '^authors/upage/?([0-9]{1,})/?$', 
    'index.php?pagename=authors&upage=$matches[1]', 
    'top'
);

puis enregistrez upage en tant que variable de requête:

add_filter( 'query_vars', function( $vars ) {
    $vars[] = 'upage';
    return $vars;
} );

Après avoir enregistré les permaliens, nous accédons à l’archive utilisateur à partir de:

example.tld/authors/upage/123/

C) Si nous pouvions également redéfinir la partie page url, elle correspond à la variable de requête paged avec:

add_rewrite_rule( 
    '^authors/page/?([0-9]{1,})/?$', 
    'index.php?pagename=authors&upage=$matches[1]', 
    'top'
);

où nous enregistrons upage comme variable de requête comme auparavant.

Ensuite, après avoir sauvegardé des permaliens, nous pouvons accéder à l’archive utilisateur à partir de:

example.tld/authors/page/123/

D) Nous pourrions aussi simplement utiliser la variable de requête page pour la page authors et accéder à l'archive utilisateur avec:

example.tld/authors/123/

où la page actuelle est:

get_query_var( 'page', 1 );

Notez que cela interférerait avec la pagination de contenu , mais il n'y a pas de vérification de limite pour cette variable de requête.

E) Nous pourrions simuler comment la pagination des commentaires est gérée en core, qui utilise une réécriture comme celle-ci:

(.?.+?)/comment-page-([0-9]{1,})/?$

cpage est la variable de requête de pagination de commentaire correspondante pour la correspondance ([0-9]{1,}).

Alternativement, on pourrait également envisager d'utiliser l'API REST avec l'approche javascript. Le noyau est livré avec la bibliothèque client wp-api Backbone qui peut, par exemple, gérer. collection d'utilisateurs.

J'espère que ça aide!

2
birgire