web-dev-qa-db-fra.com

Articles liés de pagination d'auteurs ne fonctionnant pas sur le site de production

Le code que j'utilise a été adapté de cet exemple et a été testé avec succès sur mon hôte local, mais lorsque je passe le site à un serveur actif, la pagination se bloque avec les permaliens wordpress définis (/% postname% /) et ne fonctionne que avec les permaliens par défaut de wp (? p = 123). Le problème est que cela ne me montre aucune page 404, mais cela ne me permet pas non plus de passer aux deuxième ou troisième pages, ni à aucune autre si elles existent.

Ceci est une page de liste (postype personnalisé) (single-listing.php) et j'ai la page comme ceci:

  1. Le contenu actuel de la liste unique;
  2. Commentaires;
  3. Ce code (pour lister tous les posts de l'auteur de cette liste);
  4. Annonces connexes

J'ai fait quelques recherches et j'ai même essayé de remplacer "paginé" parce que la requête var pour les archives paginées et les publications uniques devrait utiliser "page" et suivre @pietergoosen indice concernant cet avis en activant On mysql. trace_mode dans mon php.ini local. Après cela, j'ai redémarré tous les services dans wampp et la pagination sur localhost a fonctionné, donc je ne pense pas que cela puisse être le problème.

Ceci est mon code:

  <?php  
  global $authordata, $post;

$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
$args = array( 
    'author'            => $authordata->ID, 
    'post_type'         => 'post', 
    'post__not_in'      => array( $post->ID ), 
    'posts_per_page'    => 3,
    'paged'             => $paged
);
$authors_posts = new WP_Query( $args );

if( $authors_posts->have_posts()) : while( $authors_posts->have_posts()) : 
$authors_posts->the_post(); ?>

<a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>" ><?php the_title(); ?></a>

 <?php the_post_thumbnail( array(80,135));?>
 <?php $excerpt = get_the_excerpt(); echo string_limit_words($excerpt,40);?>
        <?php endwhile; ?>

 <?php if($authors_posts->max_num_pages)
 if(function_exists('wp_pagenavi'))
 wp_pagenavi(array(
'query' =>$authors_posts   
 )); ?>
 <?php endif; wp_reset_query(); ?>

EDIT

J'ai sélectionné la réponse @pietergoosen comme celle qui a résolu mon problème, mais je ne comprenais pas pourquoi mon code cessait de fonctionner sur un serveur actif. Maintenant, je n'utiliserai probablement jamais ces informations, mais j'aimerai sûrement savoir pourquoi mon code fonctionne sur localhost (avec wampserver) et non sur un serveur réel ...

Si vous connaissez la réponse à cette question, veuillez commenter. Merci!

3
Alex

Comme je l'ai dit, toute cette configuration que vous recherchez n'est pas possible en natif avec de jolis permaliens. Votre configuration fonctionne probablement avec la structure permalien par défaut car les deux requêtes (la requête principale et votre requête personnalisée) lisent ces permaliens de la même manière. Lorsque vous passez à de jolis permaliens, les deux requêtes de la page unique interprètent l'URL différemment, ce qui entraîne l'échec de l'une ou l'autre lorsque vous essayez de paginer votre requête personnalisée.

Les pages simples n'ont jamais été conçues pour être paginées de cette manière, en utilisant spécialement de jolis permaliens. Je suis allé jouer avec quelques idées, et la meilleure façon de le faire est

  • Pour écrire vos propres fonctions de pagination pouvant lire le numéro de page à partir de l'URL

  • Ecrivez votre propre fonction qui peut ajouter le numéro de page à l'URL, par exemple en ajoutant /2/ à l'URL de pages simples.

Je dois souligner que si vous paginez un article avec <!--nextpage-->, votre article paginera également avec votre requête personnalisée. De plus, si votre structure de lien permanent n'est pas définie sur /%postname%/, le code échouera et affichera un message d'erreur via wp_die().

LE CODE

Voici le code qui obtiendra la page suivante/précédente et ajoutera également le numéro de page à l'URL.

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

    if( is_singular() && $wp_rewrite->permalink_structure == '/%postname%/') {

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

    }else{

        wp_die( '<strong>The function get_single_pagination_link() requires that your permalinks are set to /%postname%/</strong>' );

    }
}

Vous pouvez utiliser cette fonction comme suit pour obtenir le lien d’une page dans la page unique lors de la pagination de votre requête personnalisée.

get_single_pagination_link( 'pagenumber_of_previous_or_next_page' );

Encore une fois, comme je l’ai dit, il n’existe aucune fonction de pagination permettant de paginer votre requête personnalisée ou de lire des numéros de page à partir de l’URL. Vous devez donc écrire la vôtre.

Voici mon idée de créer des liens vers les pages suivantes et précédentes dans votre requête personnalisée. Si vous regardez de plus près, vous verrez comment j'ai utilisé la fonction déclarée précédente get_single_pagination_link() pour obtenir les liens vers les pages suivante et précédente.

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

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

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

    if( is_singular() ) {

        $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>';
        }

    }
}

function get_previous_single_page_link( $label = null ) {

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

    if( is_singular() ) {

        $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>';
        }

    }

}

Vous pouvez maintenant utiliser ces deux fonctions dans votre code pour paginer votre requête personnalisée. Les deux fonctions fonctionnent exactement de la même manière que get_next_posts_link() et get_previous_posts_link() et utilisent les mêmes paramètres, vous devez donc vous rappeler que vous devez passer le paramètre $max_page pour votre requête personnalisée.

Voici votre requête personnalisée avec ces fonctions.

function get_related_author_posts() {

    global $authordata, $post;

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

    $args = array( 
        'posts_per_page'    => 2,
        'paged'             => $paged
    );
    $authors_posts = new WP_Query( $args );

    $output = '';

    if( $authors_posts->have_posts() ) {

        $output = '<ul>';

        while( $authors_posts->have_posts() ) {
            $authors_posts->the_post();

            $output .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a>' . get_the_excerpt() . '</li>';

        }

        $output .= '</ul>';

        $output .= get_previous_single_page_link();
        $output .= get_next_single_page_link( null , $authors_posts->max_num_pages );

        wp_reset_postdata();
    }

    return $output;

}
2
Pieter Goosen