WP_Query Pagination sur single-custom.php

11

Ce que je cherche à faire:

Configurer WP_Query la pagination dans un fichier modèle unique-custom-post-type-type.php

Ce que j'ai fait

1) Création d'un type d'article appelé "auteurs". Chaque message de ce type est un auteur individuel.

2) Les pages d'écran d'édition standard contiennent un menu déroulant répertoriant tous les articles (auteurs) du type d'article personnalisé de l'auteur.

3) Création d'un modèle single-authors.php qui interroge toutes les publications avec les métadonnées auteur du menu déroulant. Le résultat est donc une liste de publications auxquelles le même auteur 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( '&lt; %link' ) ?></span>
    <?php } ?>

    <?php if( get_adjacent_post( false, '', false ) ) { ?>
        <span class="next"><?php next_post_link( '%link &gt;' ) ?></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 effectué des recherches et découvert qu'ils utilisaient la variable $wp_query . Toutefois, lorsque j'ai modifié ma variable de requête en $wp_query , les liens sont apparus, mais aucun clic n'a été effectué.

Une idée de l'endroit où je me trompe?

Modifier:

Pour répondre à certaines de vos questions, ma requête génère avec succès les publications que je demande, $ author_id a déjà une valeur que je n'ai pas incluse dans cet extrait de code. De même, j'ai omis le contenu réel dans la boucle while car cette partie n'est pas en cause. Le problème est que je dois paginer le contenu qui existe déjà sur cet article.

Le but de cette fonctionnalité était de permettre aux publications d'avoir des auteurs personnalisés (en dehors du système Utilisateurs intégré) et le but de ce modèle est de générer toutes les publications d'un auteur donné (qui fonctionne déjà).

    
posée Shane 08.05.2014 - 18:38

2 réponses

14

Vous avez 2 problèmes.

Premier problème

La ligne

$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

échouera, car dans une vue unique, lorsque l'URL contient '/page/XX/' , la variable définie par WordPress est 'page' et non 'paged' .

Vous pouvez penser à utiliser 'page' au lieu de 'paged' , mais cela ne fonctionnera pas non plus, car une fois que la variable 'page' est destinée à être utilisée pour une publication singulière de plusieurs pages (séparation de page utilisant <!--nextpage--> ) et une fois que la publication n'est pas multi-page, WordPress redirigera la demande vers l'URL sans '/page/XX/' .

C’est ce qui se produit lorsque vous nommez la variable de requête $wp_query .

La solution consiste à empêcher cette redirection en supprimant la fonction qui en est responsable, qui est 'redirect_canonical' accrochée à 'template_redirect' :

Donc, dans votre functions.php add:

add_action( 'template_redirect', function() {
    if ( is_singular( 'authors' ) ) {
        global $wp_query;
        $page = ( int ) $wp_query->get( 'page' );
        if ( $page > 1 ) {
            // convert 'page' to 'paged'
            $query->set( 'page', 1 );
            $query->set( 'paged', $page );
        }
        // prevent redirect
        remove_action( 'template_redirect', 'redirect_canonical' );
    }
}, 0 ); // on priority 0 to remove 'redirect_canonical' added with priority 10

Désormais, WordPress ne sera plus redirigé et définira correctement la variable 'paged' query var.

Deuxième problème

next_posts_link() et previous_posts_link() vérifient tous les deux if ( ! is_single() ) pour afficher la pagination.

Désormais, is_single() est vrai dans votre cas, car vous êtes dans un seul post de type "auteur", ces fonctions ne peuvent donc pas fonctionner comme prévu.

Vous avez 3 possibilités:

  1. Utilisez query_posts pour remplacer la requête principale
  2. Utilisez un modèle de page personnalisé au lieu d'un type de publication personnalisé, car is_single() est défini sur false pour les pages et votre code y travailler.
  3. Écrivez votre propre fonction de pagination et utilisez-la

C'est le code de la solution numéro 3:

function my_pagination_link( $label = NULL, $dir = 'next', WP_Query $query = NULL ) {
    if ( is_null( $query ) ) $query = $GLOBALS['wp_query'];
    $max_page = ( int ) $query->max_num_pages;
    // Only one page for the query, do nothing
    if ( $max_page <= 1 ) return;
    $paged = ( int ) $query->get( 'paged' );
    if ( empty( $paged ) ) $paged = 1;
    $target_page = $dir === 'next' ?  $paged + 1 : $paged - 1;
    // If we are in 1st page and required previous or in last page and required next,
    // do nothing
    if ( $target_page < 1 || $target_page > $max_page ) return; 
    if ( null === $label )  $label = __( 'Next Page &raquo;' );
    $label = preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $label );
    printf( '<a href="%s">%s</a>', get_pagenum_link( $target_page ), $label );
}

et utilisez-le comme ça dans le single-authors.php :

my_pagination_link( 'Older Entries', 'next', $author_query );
my_pagination_link( 'Newer Entries', 'prev', $author_query );
    
réponse donnée gmazzap 08.05.2014 - 21:35
0

Basé sur une autre question WPSE similaire " pagination est ne fonctionne pas avec les valeurs des champs personnalisés wp_query ", je suggèrerais donc d'ajouter global $paged; au début de votre fichier modèle:

global $paged;
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
    
réponse donnée Stephen S. 08.05.2014 - 20:26

Lire d'autres questions sur les étiquettes