web-dev-qa-db-fra.com

get_template_part dans la boucle

En raison de la configuration de mon modèle (et de ma mise en page), je dois pouvoir placer 4 messages différents dans 4 div différents.

Par exemple, ma structure serait comme ça

<div>Post 1</div>
<div>
    <div>Post 2</div>
    <div>
        <div>Post 3</div>
        <div>Post 4</div>
    </div>
</div>

Mais j’ai du mal à le faire fonctionner, j’utilise get_posts pour obtenir les 4 derniers messages.

$posts = get_posts(array(
    'post_type' => 'post',
    'post_count' => 4
));  

Et puis j'essaye d'afficher mon post

<?php setup_postdata($posts[0]); ?>
<?php get_template_part( 'template-parts/post-thumbnail' ); ?>
<?php wp_reset_postdata(); ?>

Dans template-parts/post-thumbnail.php, j'essaie d'afficher le titre et le lien permanent, mais le titre et le lien de la page en cours sont toujours affichés. Jamais du poste actuel.

4
woutr_be

Votre problème est que la variable passée à setup_postdata() doit être la variable globale $post, comme ceci:

// Reference global $post variable.
global $post;

// Get posts.
$posts = get_posts(array(
    'post_type' => 'post',
    'post_count' => 4
));  

// Set global post variable to first post.
$post = $posts[0];

// Setup post data.
setup_postdata( $post );

// Output template part.
get_template_part( 'template-parts/post-thumbnail' );

// Reset post data.
wp_reset_postdata();

Désormais, les fonctions de modèle normales, telles que the_post_thumbnail() à l'intérieur de la partie de modèle, référenceront le message correct.

6
Jacob Peattie

$ posts ne seraient pas disponibles dans le contexte de post-thumbnail.php si vous utilisez get_template_part () , il utilisera donc l'ID de post trouvé pour la page en cours. Vous devez utiliser Locate_template () pour rendre la variable disponible, ce que get_template_part utilise en interne, comme ceci:

<?php $posts = get_posts( array( 'post_type' => 'post', 'post_count' => 4 ) ); ?>

<?php foreach ( $posts as $post ) : setup_postdata( $post ); ?>
    <?php locate_template( 'page-templates/post-thumbnail.php', true, false ); ?>
<?php endforeach; wp_reset_postdata(); ?>

Vous pourrez alors avoir ce que vous avez dans le modèle page-templates/post-thumbnail.php avec les données de publication correctes:

<div>
    <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</div>
3
Tim Elsass

Autre que de jouer avec les globales, vous pouvez écrire une boucle personnalisée qui ne nécessite absolument aucun travail supplémentaire pour que votre partie modèle fonctionne. Par exemple:

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

$my_query = new WP_Query($args);
if ($my_query->have_posts()){
    while ($my_query->have_posts()){
        $my_query->the_post(); // This is where the post's data is set up
        get_template_part( 'template-parts/post-thumbnail' );
    }
}

Terminé. Vous n'avez pas besoin de configurer les données de publication pour chaque publication de la boucle.

En passant get_posts() lui-même utilise une WP_Query() pour récupérer les publications, mais la différence est qu’elle ne configure pas les données de la publication pour vous et qu’elle doit être réinitialisée après la boucle.

3
Jack Johansson

Emmenez-le dans vos provinces

<?php foreach ($posts as $post) : setup_postdata( $post ); ?>
    <div>
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
    </div>
<?php endforeach; wp_reset_postdata(); ?>

wp_reset_postdata est important pour réinitialiser le résultat d'une requête en cours.

2
While1