¿Por qué the_content() no funciona en esta página {single-custom_post_type.php}?
Este código es de mi página single-publication.php
.
Muestra los campos personalizados relevantes (aquí envueltos en etiquetas de plantilla), pero the_content()
no muestra el contenido de la entrada. He recurrido a usar $post->post_content
(que funciona), pero el misterio persiste:
<div class="publication-info">
<?php printf("<h2>%s</h2>", get_the_title() ); ?>
<div class="publication-meta publication-credit"><?php the_publication_credit(); ?></div>
<div class="publication-meta publication-date"><?php the_publication_date(); ?></div><br />
<div class="publication-blurb" style="font-family:sans-serif;"><?php echo $post->post_content; // the_content() no funciona. ¿Por qué no? ?></div>
</div>
¿Qué está pasando aquí?
EDICIÓN: Me vi impulsado a hacer esta pregunta porque creía - erróneamente, como resultó ser - que el funcionamiento de $post
y que get_the_title()
devolviera un título eran una señal inequívoca de estar dentro del loop. Pero aparentemente este no es el caso. cf Codex sobre The Loop (segundo párrafo) y Codex sobre get_the_title() (lista de parámetros). ¿Alguien puede explicarlo?
Es muy probable que tu HTML no esté incluido en el loop. Asegúrate de que tu código se vea así:
if(have_posts()): while(have_posts()): the_post(); ?>
<div class="publication-info">
<?php printf("<h2>%s</h2>", get_the_title() ); ?>
<div class="publication-meta publication-credit"><?php the_publication_credit(); ?></div>
<div class="publication-meta publication-date"><?php the_publication_date(); ?></div><br />
<div class="publication-blurb" style="font-family:sans-serif;"><?php echo $post->post_content; // ¿Por qué the_content() no funciona aquí? ?></div>
</div>
<?php endwhile; endif;

sí, esto funciona. gracias. pero ¿cómo podría usar get_the_title() fuera del loop? el codex dice $ID
(int) (opcional) ID del post o dejar vacío para usar el post actual en The Loop

Porque usa el objeto $post que está configurado para la página. Es un poco inestable, sin duda. the_content() depende de la función the_post().

Sí, tienes que colocar la función the_content()
dentro del loop. La forma en que veo que the_content()
debería configurarse es en un archivo single.php
o post-type.php
. Pero por alguna razón no es así. Todavía necesitas tener un loop en el archivo single.php
o post-type.php
.

muchas gracias. una última petición: ¿puedes indicarme algún recurso que explique un poco más sobre cuándo y cómo se establece realmente $post, si no se establece al inicio del loop? me gustaría entenderlo.

@BrianFegter corrígeme si me equivoco: en single-{post_type}.php
, siempre hay 1 post. Por lo tanto, el while(have_posts()){}
puede omitirse. ¿No es así?

@ShivanRaptor Las mejores prácticas indican que siempre se debe incluir el loop

También estoy confundido con esto. ¿Alguien puede explicar más claramente por qué el título está disponible fuera del bucle, pero el contenido no? @Brian dices que es porque usa el objeto de publicación establecido para la página, pero ¿ese objeto no contiene también los datos del contenido? ¿Qué me estoy perdiendo aquí, por favor?

Algunos datos relacionados con las publicaciones no están disponibles por defecto en get_posts, como el contenido de la publicación a través de the_content()
o el ID numérico. Esto se resuelve llamando a una función interna setup_postdata()
, con el array $post como argumento:
<?php
$args = array( 'posts_per_page' => 3 );
$lastposts = get_posts( $args );
foreach ( $lastposts as $post ) :
setup_postdata( $post ); ?>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php the_content(); ?>
<?php endforeach;
wp_reset_postdata();
?>
