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.
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.
$ 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>
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.
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.