Ce que je cherche à faire:
Configuration de la WP_Query
pagination dans un fichier de modèle single-custom-post-type.php
Ce que j'ai fait
1) Création d'un type de publication appelé "auteurs". Chaque article de ce type d'article est un auteur individuel.
2) Les pages d'écran de publication standard contiennent une liste déroulante qui répertorie toutes les publications (auteurs) du type de publication personnalisé des auteurs.
3) Création d'un modèle single-authors.php qui interroge tous les messages avec les métadonnées de l'auteur dans la liste déroulante, donc le résultat est une liste de messages auxquels le même auteur leur est affecté (un peu comme une archive):
<?php
// set the "paged" parameter (use 'page' if the query is on a static front page)
global $paged;
/*We need this here to add and maintain Pagination if Template is assigned to Front Page*/
if ( get_query_var( 'paged' ) ) {
$paged = get_query_var('paged');
} elseif ( get_query_var( 'page' ) ) {
$paged = get_query_var( 'page' );
} else {
$paged = 1;
}
$args = array(
'posts_per_page' => 10,
'meta_key' => 'author_select',
'meta_value' => $author_id,
'paged' => $paged,
);
$temp = $wp_query;
$wp_query = NULL;
$wp_query = new WP_Query($args);
?>
<?php if( $wp_query->have_posts() ) : ?>
<?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
<?php // Successfully outputs the results of the above query, so I've omitted the code from this example. ?>
<?php endwhile; ?>
<div class="single_navigation">
<?php if( get_adjacent_post( false, '', true ) ) { ?>
<span class="prev"><?php previous_post_link( '< %link' ) ?></span>
<?php } ?>
<?php if( get_adjacent_post( false, '', false ) ) { ?>
<span class="next"><?php next_post_link( '%link >' ) ?></span>
<?php } ?>
</div><!--/single navigation-->
<?php endif; ?>
<?php
$wp_query = null;
$wp_query = $temp;
wp_reset_query();
?>
Sur quoi je suis coincé
Les liens de pagination n'apparaissent pas. J'ai fait quelques recherches et j'ai découvert qu'ils utilisent la $wp_query
variable, cependant quand j'ai changé ma variable de requête en $wp_query
, les liens sont apparus, mais quand on a cliqué n'a rien fait.
Une idée où je me trompe?
Éditer:
Pour répondre à certaines de vos questions, ma requête génère avec succès les messages que j'interroge, $ author_id a déjà une valeur que je n'ai pas incluse dans cet extrait de code. De même, j'ai omis la sortie de contenu réelle dans la boucle while car cette partie n'est pas le problème. Le problème est que je dois paginer le contenu qui existe déjà sur ce seul post.
Le but de cette fonctionnalité était de permettre aux publications d'avoir des auteurs personnalisés (en dehors du système intégré des utilisateurs) et le but de ce modèle est de générer toutes les publications d'un auteur donné (qui fonctionne déjà).
the_title()
'meta_value' => $author_id
que le menu déroulant est rempli? Et lors de la sélection de chaque auteur via la liste déroulante, les dix premiers articles s'affichent-ils correctement?$author_query->have_posts()
retourstrue
et que le$author_query
contient effectivement des messages?Réponses:
Vous avez 2 problèmes.
Premier problème
La ligne
échouera, car en vue de publication unique, lorsque l'URL contient
'/page/XX/'
, la variable WordPress définit est'page'
et non'paged'
.Vous pouvez penser à utiliser à la
'page'
place de'paged'
, mais cela ne fonctionnera pas non plus, car une fois que la'page'
variable est destinée à être utilisée pour une publication singulière de plusieurs pages (séparation de page à l'aide<!--nextpage-->
) et une fois que la publication n'est pas multi-page, WordPress redirigera la demande à l'URL sans'/page/XX/'
.C'est ce qui se produit lorsque vous nommez votre variable de requête
$wp_query
.La solution est d'empêcher cette redirection en supprimant la fonction qui en est responsable, qui est
'redirect_canonical'
connectée à'template_redirect'
:Donc, dans votre
functions.php
ajout:Maintenant, WordPress ne redirigera plus et définira correctement la
'paged'
requête var.Deuxième problème
next_posts_link()
et lesprevious_posts_link()
deux vérifientif ( ! is_single() )
pour afficher la pagination.Maintenant,
is_single()
c'est vrai dans votre cas, parce que vous êtes dans un seul poste de type "auteur", donc ces fonctions ne peuvent pas fonctionner comme prévu.Vous avez 3 possibilités:
query_posts
pour remplacer la requête principale (vraiment pas recommandé)is_single()
est faux pour les pages, et votre code y fonctionnera.C'est le code de la solution numéro 3:
et l'utiliser comme ça dans
single-authors.php
:la source
the_posts_pagination
mais j'ai dû prendre une copie de l'original wp_query comme indiqué dans cette question: wordpress.stackexchange.com/questions/216821/…Sur la base d'une autre question WPSE similaire " La pagination ne fonctionne pas avec les valeurs des champs personnalisés wp_query ", je suggère d'ajouter
global $paged;
au début de votre fichier de modèle:la source
$GLOBALS['paged'] = get_query_var( 'paged' );
. Sinon, utilisez simplement le contenu global.$author_query
à$wp_query
et cela semblait faire apparaître la pagination, mais quand je clique dessus, la page s'actualise et ne passe pas réellement à la page suivante, même s'il y a plusieurs pages. J'ai mis à jour ma réponse pour refléter ces changements.global
et$GLOBALS
. Un peu devar_dump()
, quelques fonctions et ça va. Pour vraiment le comprendre avec un peu d'essais / erreurs, vous aurez env. besoin d'une demi-heure. Cela vous aidera à mieux comprendre les fonctions par rapport aux classes et l'approche OOP dans son ensemble. Et cela vous rapprochera clairement de la compréhension des espaces de noms :)