web-dev-qa-db-fra.com

Utilisation de previous_post_link et next_post_link pour envelopper la séquence postérieure

Pour un seul type de message personnalisé, j'utilise previous_post_link et next_post_link avec des flèches simples. (Bien que les flèches de texte soient montrées ici, dans la réalité, j'utilise des graphiques avec le texte masqué via CSS.) Code:

<nav class="arrowNav">
    <div class="nav-previous">
       <?php previous_post_link('%link', '«'); ?>
    </div>

    <div class="nav-next">
       <?php next_post_link('%link', '»'); ?>
    </div>
</nav>

Cela fonctionne très bien, sauf pour les cas Edge. J'aimerais que les articles soient bien entourés: c’est-à-dire que, pour le premier article, previous_post_link soit lié au dernier dernier article, et pour le dernier message next_post_link serait lié au premier message . Il semble que la valeur par défaut pour ces deux cas est null. Comment puis-je tester le statut du premier et du dernier message et créer des liens pour chacun?

2
boomturn

Ajoutez les fonctions personnalisées suivantes dans le fichier functions.php et au lieu d’appeler les fonctions previous_post_link et next_post_link, appelez custom_next_post_link et custom_previous_post_link, respectivement.

 function custom_adjacent_post_link( $format, $link, $in_same_cat = false, $excluded_categories = '', $previous = true ) {
if ( $previous && is_attachment() )
        $post = get_post( get_post()->post_parent );
else
        $post = get_adjacent_post( $in_same_cat, $excluded_categories, $previous );

if ( ! $post ) {            
    $post =  '';
    $args = 'posts_per_page=1&orderby=date&ignore_sticky_posts=1';

    if($previous)
        $args .= '&order=DESC';
    else
        $args .= '&order=ASC';

   $the_query = new WP_Query( $args );
    while ( $the_query->have_posts() ) :
         $the_query->the_post();
         $post = get_post(get_the_ID());   
    endwhile;
    wp_reset_postdata();
} 

$title = $post->post_title;

if ( empty( $post->post_title ) )
        $title = $previous ? __( 'Previous Post' ) : __( 'Next Post' );

$title = apply_filters( 'the_title', $title, $post->ID );
$date = mysql2date( get_option( 'date_format' ), $post->post_date );
$rel = $previous ? 'prev' : 'next';

$string = '<a href="' . get_permalink( $post ) . '" rel="'.$rel.'">';
$inlink = str_replace( '%title', $title, $link );
$inlink = str_replace( '%date', $date, $inlink );
$inlink = $string . $inlink . '</a>';

$output = str_replace( '%link', $inlink, $format );
$adjacent = $previous ? 'previous' : 'next';
echo apply_filters( "{$adjacent}_post_link", $output, $format, $link, $post );
}
function custom_previous_post_link($format='&laquo; %link', $link='%title', $in_same_cat = false, $excluded_categories = '') {
custom_adjacent_post_link($format, $link, $in_same_cat, $excluded_categories, true);
}
function custom_next_post_link($format='%link &raquo;', $link='%title', $in_same_cat = false, $excluded_categories = '') {
custom_adjacent_post_link($format, $link, $in_same_cat, $excluded_categories, false);
}
3
Vinod Dalvi

La réponse acceptée fonctionne, mais probly aurait dû utiliser get_posts () à la place d'un wpquery et d'une boucle complets:

    if ( ! $post ) { 
    $args = array('posts_per_page'=> 1,
            'orderby'=> 'date',
            'ignore_sticky_posts' => 1
            );
    if($previous)
        $args['order']='DESC';
    else
       $args['order']='ASC';
    $adjposts = get_posts($args);
    $post = $adjposts[0];   
} 

Il est généralement mal vu d'utiliser wpquery si vous n'en avez pas besoin. Avec tout le crédit, sinon, à Vinod Dalvi.

3
Doug Cassidy