web-dev-qa-db-fra.com

La pagination est cassée et j'ai besoin d'aide pour la réparer

Je rencontre un problème de pagination sur un site sur lequel je travaille. La cliente a remarqué que sur ses pages de catégorie, la pagination ne fonctionne pas après page 1. Ce que je veux dire, c’est que sur pages 2 et les versions ultérieures, les publications ne s'affichent plus à partir de la boucle WordPress. Je me demandais juste pourquoi c'était et comment je pourrais le réparer?

Voici le code de ma page de modèle pour les pages de catégorie:

<?php
get_header();?>
<div class="section blog">
    <div class="container">
        <div class="row">
            <div class="col-xs-12 col-md-8">
                <div class="share">
                        <span>Share:</span>
                        <a href="#" target="_blank">
                            <span class="fa-stack fa-lg">
                                <i class="fa fa-circle fa-stack-2x"></i>
                                <i class="fa fa-Twitter fa-stack-1x"></i>
                            </span>
                        </a>
                        <a href="#" target="_blank">
                            <span class="fa-stack fa-lg">
                                <i class="fa fa-circle fa-stack-2x"></i>
                                <i class="fa fa-facebook fa-stack-1x"></i>
                            </span>
                        </a>
                        <a href="#" target="_blank">
                            <span class="fa-stack fa-lg">
                                <i class="fa fa-circle fa-stack-2x"></i>
                                <i class="fa fa-linkedin fa-stack-1x"></i>
                            </span>
                        </a>
                </div>
                        <?php

                            $link = $_SERVER[HTTP_Host] . $_SERVER[REQUEST_URI];
                            $link_array = explode('/',$link);
                            $page = $link_array[count($link_array)-2];

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

                            $args = array(
                            'post_type' => 'post',
                            'posts_per_page' => 4,
                            'paged' => $paged,
                            'category_name' => $page
                            );

                            $post_query = new WP_Query( $args );

                            if($post_query->have_posts() ) {
                                while($post_query->have_posts() ) {
                                    $post_query->the_post();
                                    $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'single-post-thumbnail' );
                                    if($image[0] == ''){
                                        $image[0] = get_template_directory_uri() . '/img/placeholder-blog.jpg';
                                    }
                        ?>

                <article>
                    <div class="post">
                        <div class="row">
                            <div class="col-xs-12 col-md-12">
                                <div class="head">  
                                    <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
                                    <span><?php the_time('F j, Y'); ?> by <?php echo get_the_author(); ?> | <a href="<?php the_permalink(); ?>">Leave a Comment</a></span>
                                </div>
                            </div>
                        </div>
                        <div class="row">
                            <div class="col-xs-12 col-md-3 feature-image">
                                <img src="<?php echo $image[0]; ?>" alt="">
                            </div>
                            <div class="col-xs-12 col-md-9">
                                <p><?php $content = get_the_content(); echo mb_strimwidth($content, 0, 400, '...'); ?></p>
                            </div>
                        </div>
                        <div class="row">
                            <div class="col-xs-12 col-md-12">
                                <div class="category">
                                    <p>
                                        Filed Under: 
                                        <?php
                                            $category = get_the_category();
                                            foreach($category as $key=>$cat){
                                                echo '<a href="' . get_site_url() . '/blog/' . $cat->slug . '">' . $cat->name . '</a>';
                                                if(($key+1) != count($category)){
                                                    echo ', ';
                                                }
                                            }
                                        ?>
                                    </p>
                                </div>
                            </div>
                        </div>
                    </div>
                </article>
                <hr>
                        <?php
                                }
                            }
                        ?>


                        <div class="section nav text-center">
                            <!-- pagination here -->
                            <?php
                                if (function_exists(custom_pagination)) {
                                custom_pagination($custom_query->max_num_pages,"",$paged);
                                }
                            ?>

                        </div>


            </div>
            <div class="col-xs-12 col-md-4">
                <?php include('inc/sidebar.php'); ?>
            </div>
        </div>
    </div>
</div>
<?php 
include('inc/connect.php');
get_footer(); 
?>

Il existe également une fonction personnalisée intégrée dans functions.php pour la pagination, qui contient peut-être aussi un problème:

function custom_pagination($numpages = '', $pagerange = '', $paged='') {

  if (empty($pagerange)) {
    $pagerange = 2;
  }

  /**
   * This first part of our function is a fallback
   * for custom pagination inside a regular loop that
   * uses the global $paged and global $wp_query variables.
   * 
   * It's good because we can now override default pagination
   * in our theme, and use this function in default quries
   * and custom queries.
   */
  global $paged;
  if (empty($paged)) {
    $paged = 1;
  }
  if ($numpages == '') {
    global $wp_query;
    $numpages = $wp_query->max_num_pages;
    if(!$numpages) {
        $numpages = 1;
    }
  }

  /** 
   * We construct the pagination arguments to enter into our paginate_links
   * function. 
   */
  $pagination_args = array(
    'base'            => get_pagenum_link(1) . '%_%',
    'format'          => 'page/%#%',
    'total'           => $numpages,
    'current'         => $paged,
    'show_all'        => False,
    'end_size'        => 1,
    'mid_size'        => $pagerange,
    'prev_next'       => True,
    'prev_text'       => __('<i class="fa fa-angle-left"></i>'),
    'next_text'       => __('<i class="fa fa-angle-right"></i>'),
    'type'            => 'plain',
    'add_args'        => false,
    'add_fragment'    => ''
  );

  $paginate_links = paginate_links($pagination_args);

  if ($paginate_links) {
    echo "<nav class='custom-pagination'>";
      echo $paginate_links;
    echo "</nav>";
  }

}

Voici des exemples en direct de tels:

https://www.staceybarr.com/measure-up/category/podcast/page/2/
https://www.staceybarr.com/measure-up/category/podcast/page/1/

Tout me semble correct, mais hélas, il y a toujours un problème, je me demandais si je pouvais obtenir de l'aide pour cela. Toute aide est grandement appréciée!

1
NeoLobster

Je ne suis pas sûr de savoir pourquoi la première page fonctionne mais la seconde ne fonctionne pas, bien que cela puisse être un indice du problème. Vers le bas de la page de modèle de catégorie, vous avez les éléments suivants:

if (function_exists(custom_pagination)) {
    custom_pagination($custom_query->max_num_pages,"",$paged);
}

Si vous examinez ce qui précède, il existe une variable appelée $custom_query. Cela ressemble à une requête WordPress qui devrait pouvoir contenir un élément max_numb_pages. Le problème est que $custom_query n'existe nulle part ailleurs sur la page et ne semble pas être global. Vous devriez le changer pour refléter votre requête sur la page, $post_query. Le code mis à jour ressemblerait à ceci:

if (function_exists(custom_pagination)) {
    custom_pagination($post_query->max_num_pages,"",$paged);
}

Cela devrait indiquer à la pagination qu'il y a un certain nombre de pages et éventuellement rendre le lien correct.

De plus, je vous recommanderais print_r la sortie de $link, $link_array, $page et $paged pour déterminer si toutes ces variables produisent la réponse correcte.

$link = $_SERVER[HTTP_Host] . $_SERVER[REQUEST_URI];
$link_array = explode('/',$link);
$page = $link_array[count($link_array)-2];

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

$args = array(
'post_type' => 'post',
'posts_per_page' => 4,
'paged' => $paged,
'category_name' => $page
);

print_r($link);
print_r($link_array);
print_r($page);
print_r($paged);
print_r($args);

Dans le cas de $args, assurez-vous qu'il indique à WordPress la page correcte dans l'attribut paged.

2
Tom