get_template_part in for loop

3

Debido a la configuración de mi plantilla (y diseño), necesito poder colocar 4 publicaciones diferentes en 4 divs diferentes.

Por ejemplo, mi estructura sería así

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

Pero estoy teniendo algunos problemas para que esto funcione, uso get_posts para obtener las 4 últimas publicaciones.

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

Y luego trato de mostrar mi publicación

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

En template-parts/post-thumbnail.php estoy intentando mostrar el título y el enlace permanente, pero siempre muestra el título y el enlace de la página actual. Nunca de la publicación real.

    
pregunta woutr_be 21.07.2017 - 06:10

4 respuestas

5

Su problema es que la variable pasada a setup_postdata() debe ser la variable global $post , como esto:

// 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();

Ahora las funciones normales de la plantilla, como the_post_thumbnail() dentro de la parte de la plantilla, harán referencia a la publicación correcta.

    
respondido por el Jacob Peattie 21.07.2017 - 09:52
3

$ posts no estarían disponibles en el contexto de post-thumbnail.php si está usando get_template_part () , por lo que utilizará la ID de publicación encontrada para la página actual. Debería usar Locate_template () para hacer que la variable esté disponible, que es lo que get_template_part usa internamente, como esto:

<?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(); ?>

Entonces podrías tener todo lo que tienes en la plantilla page-templates / post-thumbnail.php con los datos de publicación correctos:

<div>
    <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</div>
    
respondido por el Tim Elsass 21.07.2017 - 08:13
3

Además de jugar con los globales, puede escribir un bucle personalizado que no requiera absolutamente ningún trabajo adicional para que la parte de su plantilla funcione. Por ejemplo:

$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' );
    }
}

Hecho. No es necesario configurar los datos de la publicación para cada publicación en el bucle.

Por cierto, get_posts() usa un WP_Query() para obtener las publicaciones, pero la diferencia es que no configura los datos de la publicación para usted, y debe restablecerse después del ciclo.

    
respondido por el Jack Johansson 21.07.2017 - 10:20
2

Llévalo a tus provincias

<?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 es importante para restablecer el resultado de una consulta actual.

    
respondido por el While1 21.07.2017 - 06:55

Lea otras preguntas en las etiquetas