Aufgrund der Einrichtung meiner Vorlage (und meines Layouts) muss ich in der Lage sein, 4 verschiedene Posts in 4 verschiedenen Divs zu platzieren.
Zum Beispiel würde meine Struktur so sein
<div>Post 1</div>
<div>
<div>Post 2</div>
<div>
<div>Post 3</div>
<div>Post 4</div>
</div>
</div>
Aber ich habe einige Probleme damit, das zum Laufen zu bringen. Ich benutze get_posts
, um die 4 neuesten Beiträge zu erhalten.
$posts = get_posts(array(
'post_type' => 'post',
'post_count' => 4
));
Und dann versuche ich, meinen Beitrag anzuzeigen
<?php setup_postdata($posts[0]); ?>
<?php get_template_part( 'template-parts/post-thumbnail' ); ?>
<?php wp_reset_postdata(); ?>
In template-parts/post-thumbnail.php
versuche ich, den Titel und den Permalink anzuzeigen, aber es werden immer der Titel und der Link der aktuellen Seite angezeigt. Niemals von der eigentlichen Post.
Ihr Problem ist, dass die an setup_postdata()
übergebene Variable must die globale $post
-Variable ist, wie folgt:
// 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();
Nun verweisen normale Vorlagenfunktionen wie the_post_thumbnail()
im Vorlagenteil auf den richtigen Beitrag.
$ posts wäre im Kontext von post-thumbnail.php nicht verfügbar, wenn Sie get_template_part () verwenden. Daher wird die Beitrags-ID verwendet, die für die aktuelle Seite gefunden wurde. Sie sollten locate_template () verwenden, um die Variable verfügbar zu machen. Dies wird von get_template_part intern folgendermaßen verwendet:
<?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(); ?>
Dann können Sie alles, was Sie in der Vorlage page-templates/post-thumbnail.php haben, mit den richtigen Post-Daten versehen:
<div>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</div>
Abgesehen davon, dass Sie sich mit den Globalen herumschlagen, können Sie eine benutzerdefinierte Schleife schreiben, die absolut keine zusätzliche Arbeit erfordert, damit Ihr Vorlagenteil funktioniert. Zum Beispiel:
$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' );
}
}
Erledigt. Sie müssen die Post-Daten nicht für jeden Post in der Schleife einrichten.
Übrigens verwendet get_posts()
selbst eine WP_Query()
, um die Posts abzurufen, aber der Unterschied besteht darin, dass die Daten des Posts nicht für Sie eingerichtet werden und dass sie nach der Schleife zurückgesetzt werden müssen.
Bring es in deine Provinzen
<?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
ist wichtig, um das Ergebnis einer aktuellen Abfrage zurückzusetzen.