La publicación no muestra la fecha si hay otra publicación con la misma fecha


19

Tengo una publicación personalizada tipo "prensa". e hizo una plantilla de página las publicaciones de consultas de ese tipo. Se supone que las publicaciones deben mostrar su fecha de publicación, pero si hay más de una publicación con la misma fecha, solo la primera publicación muestra la fecha y las otras no. ¿Hay alguna manera de mostrar la fecha de cada publicación?

ingrese la descripción de la imagen aquí

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

Respuestas:


40

Me enfrenté a un problema similar en el pasado porque modifiqué mi función de fecha. Y luego las publicaciones mostraban la fecha si solo cada publicación tenía una fecha diferente; de ​​lo contrario, se volvió en blanco.

Intenta agregar en su <?php echo get_the_date(); ?>lugar.


26

¿Por qué no se muestra?

Cuando observa la fuente de la the_date()función, notará dos globales:

global $currentday, $previousday;

Y luego hay una regla si hay una fecha para mostrar ... o no. La verificación es similar a la realizada con is_new_day():

if ( $currentday != $previousday ) {

    // show date

    // Set global
    $previousday = $currentday;
}
// else
return null;

Como puede ver, el $previousdayinstante se establece en $currentday;. Entonces se hace eco una vez. Justo después de eso, ambos días son iguales y la verificación fallará. Esa es la razón por la cual tu primera publicación lo muestra, pero las otras no lo muestran.

¿Por qué se nota?

Si te preguntas por qué muestra más de una fecha, después de que el global se eucalice, tendrás que echarle un vistazosetup_postdata() . Esta función se llama the_post();y es responsable de configurar todo para una sola publicación en el bucle.

if ( have_posts() )
{
    while ( have_posts() )
    {
        the_post(); # <-- Calls setup_postdata( $post );

        // your loop stuff here
    }
}

Los aspectos internos de setup_postdata()son bastante fáciles de entender (al menos para lo que se establecen los globales):

$currentday = mysql2date('d.m.y', $post->post_date, false);
$currentmonth = mysql2date('m', $post->post_date, false);

Entonces, la parte móvil es $previousdaycontra la cual $currentdayse establece y comprueba lo global. Y a menos que haya un nuevo día , the_date()no mostrará nada.

Simplemente configure sus publicaciones en días totalmente diferentes y de repente verá que la fecha aparece en cada publicación.

¿Cuál es la idea detrás de eso?

En realidad, la idea es bastante simple y está presente desde v0.7.1, al menos esto es lo que dice phpDocBlock: ¿Por qué le gustaría mostrar la fecha de cada publicación en un archivo? Un archivo se ve así:

+--------------+
| 28.10.2014   |
+--------------+
| Post Title A |
| Post Title B |
+--------------+
| 29.10.2014   |
+--------------+
| Post Title C |
| Post Title D |
+--------------+

¿No estás de acuerdo con eso? Bueno, entonces simplemente estás usando una función que pretendía ser algo totalmente diferente.

¿Por qué get_the_date()funciona y cómo usarlo de la manera correcta?

No se ve afectado por el if / else en la the_date()función (la comprobación global). Tampoco no tiene el filtro. ¿Cómo arreglar eso? Sencillo:

echo apply_filters( 'the_date', get_the_date(), get_option( 'date_format' ), '', '' );

Esto agrega cualquier devolución de llamada adjunta al the_datefiltro a su salida personalizada. También utiliza la configuración de date_formatopción predeterminada como predeterminada, que también utiliza the_date(). Y evita cualquiera beforey aftervalores, de nuevo, exactamente como la the_date()función.


1
Gracias kaiser Eso explica por qué a veces no se imprime la fecha. Muchas gracias.
Robert hue

1
Explicación muy completa. Mejor que la respuesta aceptada.
Nilambar Sharma

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

accesorios para profundizar en este @kaiser - más información de lo que esperaba en un tema tan mundano
serraosays

1
Esta respuesta es mejor que la explicación de WP docs.
Ian

10

No use the_date(), en su lugar use the_time().

the_date devuelve solo la fecha, the_time devuelve la fecha + la hora. No sé la razón por la cual WordPress no devolverá más de una fecha cuando the_datese usa en un bucle. Pero tiene que ver con el hecho de que el valor es el mismo. Si utiliza the_timeel valor nunca es el mismo, por lo tanto, siempre devuelve el valor. Entonces puedes imprimir algo como<?php the_time('F j, Y'); ?>

Este enlace del códice explica cómo the_date funciona mucho mejor que yo.


1

Bruto lo fuerza.

<?php the_time('F j, Y'); ?> - <?php the_time(); ?>

Trabajó para mí, muestra la fecha completa, la hora de cada publicación, independientemente de si es la misma fecha o no.


0

Solo aparece una vez porque así es como funcionaría un diario. Mostraría la fecha en la parte superior y usted escribiría sus 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 obtener más información, escribí un tutorial al respecto aquí: ¿Por qué la función the_date () en WordPress solo aparece una vez en la primera publicación?


Tenga en cuenta que si desea promocionar su propio producto / blog, debe divulgar su afiliación , de lo contrario, su respuesta puede ser marcada como spam. Lea Cómo no ser un spammer
DavidPostill
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.