Liens continus pour les articles précédents et suivants dans WordPress

Publié par Jean-Michel le

Ce que j’ai, c’est une page qui affiche une publication d’une catégorie et en bas, il y a un lien de publication précédente et suivante. Le problème que j’ai est que lorsqu’il arrive au dernier, je veux revenir au début. Cela fonctionne jusqu’à la fin si vous êtes sur le premier, mais ne revenez pas au début si vous êtes sur le dernier, il affiche simplement le dernier message si vous êtes sur le dernier message.

Voici mon code jusqu’à présent :

<?php 
$prev_post = get_adjacent_post( true, '', true );
$next_post = get_adjacent_post( true, '', false );
$prev_post_id = $prev_post->ID;
$next_post_id = $next_post->ID;
?>

<?php if ($prev_post_id == '') {
$query = new WP_Query( array ( 'orderby' => 'ASC', 'posts_per_page' => '1', 'cat=4' ));

  while($query->have_posts()):
       $query->the_post();
       $prev_post_id = $query->post->ID;
  endwhile;
} ?>
<?php if ($next_post_id == '') {
  $query2 = new WP_Query( array ( 'orderby' => 'DESC', 'posts_per_page' => '1', 'cat=4'    ));
  while($query2->have_posts()):
       $query2->the_post();
       $next_post_id = $query2->post->ID;
  endwhile;
} ?>

<a href="<?php echo get_permalink($prev_post_id); ?>" class="prev-footer-item">
  <div class="prev-inner">
    <h3 class="gamma"><?php echo get_the_title($prev_post_id ); ?></h3>
    <h4 class="delta"><?php the_field('subtitle', $prev_post_id ); ?></h4>
    <div class="footer-overlay"></div>
  </div>
 </a>
<a href="<?php echo get_permalink($next_post_id); ?>" class="next-footer-item">
  <div class="next-inner">
    <h3 class="gamma"><?php echo get_the_title($next_post_id); ?></h3>
    <h4 class="delta"><?php the_field('subtitle', $next_post_id); ?></h4>
    <div class="footer-overlay"></div>
  </div>
</a>

Je suis sûr que c’est quelque chose d’assez évident qui me manque, n’est-ce pas ?

Mise à jour : messages précédents de travail :

[request] => SELECT SQL_CALC_FOUND_ROWS  as1_posts.ID FROM as1_posts  WHERE 1=1  AND as1_posts.post_type = 'post' AND (as1_posts.post_status = 'publish' OR as1_posts.post_status = 'private')  ORDER BY as1_posts.post_date DESC LIMIT 0, 1

Ne fonctionne pas Messages suivants :

[request] => SELECT SQL_CALC_FOUND_ROWS  as1_posts.ID FROM as1_posts  WHERE 1=1  AND as1_posts.post_type = 'post' AND (as1_posts.post_status = 'publish' OR as1_posts.post_status = 'private')  ORDER BY as1_posts.post_date DESC LIMIT 0, 1

Solution n°1 trouvée

Je ne vois rien qui me saute aux yeux, mais j’ai ajouté une ifdéclaration à vos deux boucles (pour éviter les erreurs), ajoutée wp_reset_postdata()après chaque boucle, et supprimé le besoin de $queryet $query2– vous pouvez simplement utiliser $querypour les deux si vous ne souhaitez pas utiliser les résultats de la requête pour autre chose que cela.

Une autre pensée – êtes-vous certains des get_adjacent_post()retours ''pour l’ID de publication s’il n’existe pas ? Pourrait-il être null, ou '0'par exemple. Cela vaut peut- être la peine d’être fait var_dump($next_post_id)et vérifié.

Éditer

J’ai oublié de mentionner, get_adjacent_post()suppose que le post_typemessage adjacent est le même que celui que vous consultez actuellement. Je ne vois pas cela comme un problème cependant, comme vous l’avez déjà dit, cela fonctionne dans l’autre sens, mais c’est quelque chose à garder à l’esprit pour l’avenir.

<?php
if($prev_post_id === '') :

    $query = new WP_Query(array('orderby' => 'ASC', 'posts_per_page' => '1', 'cat=4'));

    if($query->have_posts()) : while($query->have_posts()) :
        $query->the_post();
        $prev_post_id = get_the_ID();
        endwhile;
    endif;

    wp_reset_postdata();

endif;

if($next_post_id === '') :

    $query = new WP_Query(array('orderby' => 'DESC', 'posts_per_page' => '1', 'cat=4'));

    if($query->have_posts()) : while($query->have_posts()) :
            $query->the_post();
            $next_post_id = get_the_ID();
        endwhile;
    endif;

    wp_reset_postdata();

endif;
?>

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *