web-dev-qa-db-fra.com

pagination redirigeant depuis l'URL du numéro de page avant la page demandée

J'ai un personnel appelé CPT. Sur leurs pages single-staff.php, j'ai une liste d'éléments auxquels ils sont liés. Cela est devenu trop long, nous voulons maintenant la pagination. Je peux très bien créer les liens de page, mais il se redirige lui-même vers une URL sans le/page/numéro.

http://wonkhedev.jynk.net/staff/mark-leach/ page principale

http://wonkhedev.jynk.net/staff/mark-leach/page/2/ page 2 lien mais est redirigé vers http://wonkhedev.jynk.net/staff/mark-leach/

//in functions.php
function get_author_articles($id){

  // backwards finds CPT 'blogs' this staff member is related to.
  $meta_query = array(
    'paged' =>  get_query_var('paged'),
    'post_type' => 'blogs',
    'meta_query' => array(
      array(
        'key' => 'blog_author', // name of custom field, ACF
        'value' => '"' . $id . '"',  // CPT 'staff' id.
        'compare' => 'LIKE'
      )
    ),
    'posts_per_page' => 20,
  );

  $author_articles = query_posts($meta_query);

  return $author_articles;

}

// dans single-staff.php

$blog_articles = get_author_articles($post->ID);
$blog_articles_total = $wp_query->found_posts;    
<?php if ($wp_query->max_num_pages > 1) : ?>
      <nav class="post-nav">
        <ul class="pager">
          <li class="previous"><?php next_posts_link(__('&larr; Older Articles', 'roots')); ?></li>
          <li class="next"><?php previous_posts_link(__('Newer Articles &rarr;', 'roots')); ?></li>
        </ul>
      </nav>
    <?php endif; ?>
1
v3nt

Vous ne devez jamais utiliser query_post car il casse l'objet de requête principal et le réinitialise à la requête personnalisée actuelle. Cela casse les plugins et les fonctionnalités personnalisées telles que les publications et la pagination. J'ai fait un réponse étendue sur cela, alors assurez-vous de le vérifier, ainsi que la réponse de @Rarst .

Il convient également de noter que les pages simples, tout comme les pages de couverture statiques, utilisent page et non paged comme le font les pages d’archives normales et les pages.

Regardons d’abord la fonction de vos messages associés:

ARTICLES SIMILAIRES

Nous voudrions d’abord bien coder la fonction pour la rendre sûre et dynamique. J'accepte que $id devrait être l'identifiant de publication unique de la publication que vous visualisez. Par conséquent, gardons cela à l'esprit, codons la fonction:

Juste quelques notes avant de faire:

  • Le code est commenté, il sera donc facile à suivre

  • Le code nécessite PHP 5.4 +

  • Modifier le code au besoin

Voici le code

/**
 * Function to return realted posts_per_page
 *
 * @param (array) $args Compatible argumnets to pass to WP_Query
 * @return $author_articles
 */
function get_author_articles( $args = [] )
{
    // First make sure we are on a single page, else return false
    if ( !is_single() )
        return false;

    // Get the single post object we are on
    $current_post = get_queried_object();

    // Set our $page variable
    $page = get_query_var( 'page' ) ? get_query_var( 'page' ) : 0;

    // backwards finds CPT 'blogs' this staff member is related to.
    $meta_query_defaults = [
        'post__not_in'   => $current_post->ID, // Excludes the current post
        'paged'          => $page,
        'post_type'      => $current_post->post_type,
        'posts_per_page' => 20,
        'meta_query'     => [
            [
                'key'     => 'blog_author', // name of custom field, ACF
                'value'   => $current_post->ID,  // CPT 'staff' id.
                'compare' => 'LIKE'
            ]
        ],
    ];

    // Add our custom arguments to the $meta_query_defaults array
    if (    $args
         && is_array( $args )
    ) {
        $meta_query_defaults = wp_parse_args(  $args, $meta_query_defaults );
    }

    $author_articles = new WP_Query( $meta_query_defaults );

    return $author_articles;
}

Vous pouvez passer, en tant que premier paramètre, un tableau de paramètres valide pour WP_Query afin d'ajuster et de modifier les paramètres par défaut de la fonction transmise à WP_Query.

PAGINATION

Comme je l'ai dit, les pages à publication unique et les pages de couverture statiques utilisent page et non paged. Pour que la pagination fonctionne correctement, vous avez besoin d’une fonction personnalisée complète. J'ai déjà utilisé cette fonction il y a quelque temps, que vous pouvez vérifier ici .

Voici des versions légèrement modifiées

function get_single_pagination_link( $pagenum = 1 ) {
    global $wp_rewrite;

    if(    !is_single() 
        || !$wp_rewrite->permalink_structure 
    )
        return false;

    $pagenum = (int) $pagenum;

    $post_id = get_queried_object_id();
    $request = get_permalink( $post_id );

    if ( $pagenum > 1 )
        $request = trailingslashit( $request ) . user_trailingslashit( $pagenum );
   return esc_url( $request );
}

function get_next_single_page_link ( $label = null, $max_page = 0 ) {
    global $wp_query;

    if( !is_single() ) 
        return false;

    if ( !$max_page ) {
        $max_page = $wp_query->max_num_pages;
    }

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

    $next_page = intval($paged) + 1;

    if ( null === $label ) {
        $label = __( 'Next Page &raquo;' );
    }

    if ( ( $next_page <= $max_page ) ) {
        return '<a href="' . get_single_pagination_link( $next_page ) . '">' . $label . '</a>';
    } else {
        return false;
    }
}

function get_previous_single_page_link( $label = null ) {

    if( !is_single() ) 
        return false; 

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

    $prev_page = intval($paged) - 1;

    if ( null === $label ) {
        $label = __( '&laquo; Previous Page' );
    }

    if ( ( $prev_page > 0 ) ) {
        return '<a href="' . get_single_pagination_link( $prev_page ) . '">' . $label . '</a>';
    } else {
        return false;
    }
}

UTILISATION DE BASE

Vous pouvez maintenant l'utiliser comme suit

$q = get_author_articles();
if ( $q->have_posts() ) {
    while ( $q->have_posts() ) {
    $q->the_post();

        // Add your markup, etc.

    }
    echo get_previous_single_page_link();
    echo get_next_single_page_link( null , $q->max_num_pages );

    wp_reset_postdata();
}    
3
Pieter Goosen