La entrada no muestra la fecha si hay otra entrada con la misma fecha
Tengo un tipo de entrada personalizada "press" y creé una plantilla de página que consulta las entradas de ese tipo. Las entradas deberían mostrar su fecha de publicación, pero si hay más de una entrada con la misma fecha, solo la primera entrada muestra la fecha y las otras no. ¿Hay alguna forma de mostrar la fecha de cada entrada?
<?php get_header(); ?>
<?php
$wp_query = new WP_Query();
$wp_query -> query('post_type=press&showposts=100');
while ($wp_query->have_posts()) : $wp_query->the_post(); ?>
<div id="press">
<div class="press-item cf">
<div class="press-img"><a href="<?php the_field('link'); ?>"><?php the_post_thumbnail('medium');?></a> </div>
<div class="press-content">
<div class="press-title"><a href="<?php the_field('link'); ?>"><?php echo get_the_title(); ?></a> </div>
<div class="press-excerpt"><?php the_excerpt(); ?> </div>
<div class="press-date"><?php the_date(); ?></div>
</div>
</div>
</div>
<?php endwhile; ?>
<?php get_footer(); ?>

Me encontré con un problema similar en el pasado porque modifiqué mi función de fecha. Y entonces las publicaciones mostraban la fecha solo si cada publicación tenía una fecha diferente, de lo contrario devolvía un espacio en blanco.
Prueba agregando <?php echo get_the_date(); ?>
en su lugar.

¿Por qué no se muestra?
Cuando miras el código fuente de la función the_date()
, notarás dos variables globales:
global $currentday, $previousday;
Y luego hay una regla que determina si se muestra una fecha o no. La verificación es similar a la que se hace con is_new_day()
:
if ( $currentday != $previousday ) {
// mostrar fecha
// Establecer global
$previousday = $currentday;
}
// else
return null;
Como puedes ver, $previousday
se establece inmediatamente como $currentday;
. Así que se muestra una vez. Justo después, ambos días son iguales y la verificación fallará. Esa es la razón por la que tu primera publicación lo muestra, pero las demás no.
¿Por qué se muestra?
Si te preguntas por qué entonces muestra más de una fecha, después de que las variables globales se igualan, tendrás que mirar setup_postdata()
. Esta función es llamada por the_post();
y es responsable de configurar todo para una sola publicación en el bucle.
if ( have_posts() )
{
while ( have_posts() )
{
the_post(); # <-- Llama a setup_postdata( $post );
// tu código del bucle aquí
}
}
El funcionamiento interno de setup_postdata()
es bastante fácil de entender (al menos en cuanto a cómo se establecen las variables globales):
$currentday = mysql2date('d.m.y', $post->post_date, false);
$currentmonth = mysql2date('m', $post->post_date, false);
Así que la parte dinámica es $previousday
contra la cual se establece y verifica la variable global $currentday
. Y a menos que sea un nuevo día, the_date()
no mostrará nada.
Simplemente establece tus publicaciones en días totalmente diferentes y de repente verás que la fecha aparece en cada publicación.
¿Cuál es la idea detrás de esto?
En realidad, la idea es bastante simple y está presente desde la versión 0.7.1 - al menos eso es lo que indica el phpDocBlock: ¿Por qué querrías mostrar la fecha para cada publicación en un archivo? Un archivo se ve así:
+--------------+
| 28.10.2014 |
+--------------+
| Título A |
| Título B |
+--------------+
| 29.10.2014 |
+--------------+
| Título C |
| Título D |
+--------------+
¿No estás de acuerdo con eso? Bueno, entonces simplemente estás usando una función que estaba destinada a algo totalmente diferente.
¿Por qué funciona get_the_date()
y cómo usarla de la manera correcta?
No está afectada por el if/else en la función the_date()
(la verificación de variables globales). Tampoco tiene el filtro. ¿Cómo solucionarlo? Simple:
echo apply_filters( 'the_date', get_the_date(), get_option( 'date_format' ), '', '' );
Esto añade cualquier callback asociado al filtro the_date
a tu salida personalizada. También usa la opción date_format
por defecto - que también es usada por the_date()
. Y evita cualquier valor before
y after
- nuevamente, exactamente como la función the_date()
.

Gracias kaiser. Eso explica por qué a veces falla al imprimir la fecha. Muchas gracias.

@Nilambar La respuesta aceptada es la versión tl;dr y está perfectamente bien :)

props por investigar esto @kaiser - más información de la que esperaba sobre un tema tan mundano

No uses the_date()
, en su lugar usa the_time()
.
the_date solo devuelve la fecha, the_time devuelve la fecha + la hora. No sé la razón por la que WordPress no devuelve más de una fecha cuando se usa the_date
en un bucle. Pero tiene que ver con el hecho de que el valor es el mismo. Si usas the_time
el valor nunca es el mismo, por lo tanto siempre devuelve el valor. Así que puedes imprimir algo como <?php the_time('F j, Y'); ?>
Este enlace del codex, explica cómo funciona the_date mucho mejor que yo.

Solo aparece una vez porque así es como funcionaría un diario. Mostraría la fecha en la parte superior y escribirías tus entradas debajo de ella. Utilizo este código para mostrar las fechas de cada publicación usando the_time.
<?php the_time(get_option('date_format')); ?>
Para más información, escribí un tutorial sobre esto aquí: Por qué la función the_date() en WordPress solo aparece una vez en la primera publicación

Por favor, ten en cuenta que si deseas promocionar tu propio producto/blog debes divulgar tu afiliación, de lo contrario tu respuesta podría marcarse como spam. Por favor, lee Cómo no ser un spammer
