web-dev-qa-db-fra.com

Est-il possible d'imbriquer get_previous_post ()?

J'essaie de récupérer l'image sélectionnée de l'article précédent et du 2e article précédent, ainsi que l'image sélectionnée des deux articles suivants.

<div id="cooler-nav" class="navigation row">
<?php $prevPost = get_previous_post(true);
    if($prevPost) {?>
    <div class="nav-box previous col-md-3">
    <?php $prevthumbnail = get_the_post_thumbnail($prevPost->ID, array('medium'));}?>
    <?php previous_post_link('%link',"$prevthumbnail  %title", TRUE); ?>
    </div>

<?php $prevprevPost = get_previous_post(get_previous_post(true));
    if($prevprevPost) {?>
    <div class="nav-box previous col-md-3">
    <?php $prevprevthumbnail = get_the_post_thumbnail($prevprevPost->ID, array('medium'));}?>
    <?php previous_post_link('%link',"$prevprevthumbnail  %title", TRUE); ?>
    </div>

<?php $nextPost = get_next_post(true);
    if($nextPost) { ?>
    <div class="nav-box next col-md-3">
    <?php $nextthumbnail = get_the_post_thumbnail($nextPost->ID, array('medium') ); } ?>
    <?php next_post_link('%link',"$nextthumbnail  %title", TRUE); ?>
    </div>

<?php $nextnextPost = get_next_post(get_next_post(true));
    if($nextnextPost) {?>
    <div class="nav-box next col-md-3">
    <?php $nextnextthumbnail = get_the_post_thumbnail($nextnextPost->ID, array('medium'));}?>
    <?php next_post_link('%link',"$nextnextthumbnail  %title", TRUE); ?>
    </div>
</div><!--#cooler-nav div -->

Au lieu des liens suivants et précédents, je voudrais montrer quatre images en vedette des publications environnantes.

1
HannesH

Comme je l'ai dit précédemment dans un commentaire

Vous utilisez des valeurs non valides dans get_previous_post() et get_next_post(). Vous êtes mieux ici d'écrire votre propre fonction

Je suis venu avec ce qui suit. :

  • Obtenez un tableau de tous les articles et déterminez la position de l'article en cours.

  • Obtenez les identifiants des publications des deux côtés de la publication actuelle. La quantité d'ID dépend de la valeur définie par $x_from_current. La valeur par défaut actuelle est un, ce qui signifie qu’il récupérera l’ID en regard de la publication en cours. Si défini à deux, il récupérera deux publications à côté de la publication actuelle

  • Vous avez également la possibilité de configurer la fonction pour obtenir les publications suivantes/précédentes du même terme que la publication actuelle. Rappelez-vous juste de définir la taxonomie alors, ainsi que cette valeur par défaut, à category

J'ai décidé de ne renvoyer que les identifiants des publications adjacentes car vous devez afficher des vignettes. Dans ce cas, vous n'aurez besoin que de ces identifiants.

Voici la fonction. Je l'ai bien commenté pour que vous puissiez comprendre comment fonctionne la fonction et comment l'utiliser

function get_x_post_from_current( $x_from_current, $in_same_term, $taxonomy, $previous ) {

    // Get the current single post ID. To be save, use get_queried_object_id()
    $current_post_id = get_queried_object_id();

    // Option to choose if adjacent posts should be from the same term. Should then set $taxonomy
    if( true === $in_same_term ) {

        /**
         * Use wp_get_post_terms() to retrieve the terms/categories the current post belongs
         * to
         *
         * @see http://codex.wordpress.org/Function_Reference/wp_get_post_terms
         *
        */ 
        $terms = wp_get_post_terms( $current_post_id, $taxonomy, ['fields' => 'ids'] );

        if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){

        /**
         * Use tax_query to retrieve a list of posts from the same term as the current post.
         * To speed up the query, get only post ID's. We don't need any other field's info
         *
         * @see http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
        */ 
        $args = [
            'posts_per_page' => -1,
            'fields' => 'ids',
            'tax_query' => [
                [
                    'taxonomy' => $taxonomy,
                    'field' => 'term_id',
                    'terms' => $terms[0],
                    'include_children' => false,
                ]
            ]       
        ];

        }

    }else{

        // Default if $in_same_term is false
        $args = [
            'posts_per_page' => -1,
            'fields' => 'ids'
        ];

    }

    $q = new WP_Query( $args );

    // Get the current post position. Will be used to determine adjacent posts
    $current_post_position = array_search( $current_post_id, $q->posts );

    /**
     * Previous posts = Newer posts
     * Next Posts = Older posts
     *
     * If $previous is true, reverse array, use array_slice to get the desired amount 
     * of ID's on the left of the current post. Reverse that array to keep synchronous order
     *
     * If $previous is false, slice the array to the right of the current post
     *
    */ 
    if( true === $previous ) {

        $reverse_position   = count( $q->posts ) - ( $current_post_position + 1 );
        $array_reverse      = array_reverse( $q->posts );
        $keys   = array_slice( $array_reverse, $reverse_position + 1, $x_from_current );

    }else{

        $keys = array_slice( $q->posts, $current_post_position + 1, $x_from_current );

    }

    // Returns an array of post ID's or an empty string if no next/previous post is found
    return $keys;

}

// Get the previous post's ID's. Amount of ID's to retrieve is set by $x_from_current
function get_previous_x_post_id( $x_from_current = 1, $in_same_term = false, $taxonomy = 'category' ) {

    return get_x_post_from_current( $x_from_current,$in_same_term, $taxonomy, true );

}

// Get the next post's ID's. Amount of ID's to retrieve is set by $x_from_current
function get_next_x_post_id( $x_from_current = 1, $in_same_term = false, $taxonomy = 'category' ) {

    return get_x_post_from_current( $x_from_current,$in_same_term, $taxonomy, false ); 

}

Voici comment utiliser les fonctions de votre single.php. Dans votre cas, vous avez besoin de deux messages des deux côtés (messages suivants/précédents).

$previous_posts = get_previous_x_post_id( 2 ); 
?><pre><?php var_dump($previous_posts); ?></pre><?php // Just to see the output 

if( $previous_posts ) {

    foreach ( $previous_posts as $previous_post ) {

        // $previous_post holds the post ID. Use $previous_post to return the post thumbnail

        //Get the post title
        $get_post = get_post( $previous_post );
        echo apply_filters( 'the_title', $get_post->post_title ); 

     }

}

Faites la même chose pour les prochains articles.

Ceci est juste le minimum. Vous pouvez l'étendre comme bon vous semble. Vous pouvez également consulter ce message que j'ai récemment publié. Il s’agit d’une fonction très étendue de post-pagination unique qui utilise des référents et plusieurs types de post si nécessaire. Vous pouvez très facilement construire cette fonctionnalité là-bas

EDITS COMME COMMENTAIRES

Par exemple, j'aimerais les organiser de gauche à droite, ainsi, 1,2,4,5. Mais maintenant, il est commandé en 2,1,5,4 et je ne veux pas les retourner

Dans le code d'origine, pour une raison inconnue, j'ai inversé le tableau d'ID de publication renvoyé pour les publications précédentes. C'est maintenant corrigé (ou selon les connaissances, je ne peux malheureusement rien tester maintenant)

Je voudrais ajouter le titre sous la vignette puis-je changer les champs en identifiants et en titre?

Il n'y a pas d'option pour retourner simplement les titres des publications. La meilleure solution consiste à utiliser les identifiants de message renvoyés par la fonction et à les utiliser avec get_post pour obtenir le message spécifique et à partir de là, utiliser le titre du message.

Il serait très coûteux de modifier la fonction elle-même pour y remédier, car vous devrez récupérer tous les messages au complet, et si vous avez un millier de messages, vous courez le risque de perdre votre temps. C’est pourquoi j’ai eu l’idée d’obtenir tous les identifiants de post car cela est rapide et pas très cher. Il est également préférable de faire quatre petites requêtes sur la base de données pour obtenir les informations sur les quatre publications pertinentes.

S'il vous plaît voir le code ci-dessus pour les versions mises à jour

1
Pieter Goosen

L'astuce est que cette fonction ne fonctionne que sur courant post. Mais c'est quelque chose que vous pouvez ajuster.

Donc, en principe, quelque chose comme ceci devrait fonctionner (non testé):

global $post;
$post = get_next_post();
setup_postdata( $post ); // the next is now current
// do things
$post = get_next_post(); // and this time we got the next for next
// do more things
wp_reset_postdata(); // clean up when we are done
0
Rarst