it-swarm.com.de

get_template_part in for-Schleife

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.

4
woutr_be

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.

6
Jacob Peattie

$ 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>
3
Tim Elsass

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.

3
Jack Johansson

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.

2
While1