Il post non mostra la data se esiste un altro post con la stessa data
Ho un tipo di post personalizzato "press" e ho creato un template di pagina che esegue query sui post di quel tipo. I post dovrebbero mostrare la loro data di pubblicazione, ma se ci sono più post con la stessa data, solo il primo post mostra la data mentre gli altri no. C'è un modo per mostrare la data di ogni post?
<?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(); ?>

In passato ho affrontato un problema simile perché avevo modificato la mia funzione di data. Di conseguenza, i post mostravano la data solo se ogni post aveva una data diversa, altrimenti restituiva vuoto.
Prova ad aggiungere <?php echo get_the_date(); ?>
invece.

Perché non viene visualizzato?
Quando esamini il codice sorgente della funzione the_date()
, noterai due variabili globali:
global $currentday, $previousday;
Poi c'è una condizione che determina se mostrare o meno una data. Il controllo è simile a quello effettuato con is_new_day()
:
if ( $currentday != $previousday ) {
// mostra la data
// Imposta il globale
$previousday = $currentday;
}
// altrimenti
return null;
Come puoi vedere, $previousday
viene immediatamente impostato su $currentday;
. Quindi viene visualizzato una sola volta. Subito dopo, entrambe le date saranno uguali e il controllo fallirà. Questo è il motivo per cui il tuo primo post mostra la data, ma gli altri no.
Perché viene visualizzato?
Se ti stai chiedendo perché poi mostra più di una data, dopo che le variabili globali vengono eguagliate, dovrai dare un'occhiata a setup_postdata()
. Questa funzione viene chiamata da the_post();
ed è responsabile di configurare tutto per un singolo post nel loop.
if ( have_posts() )
{
while ( have_posts() )
{
the_post(); # <-- Chiama setup_postdata( $post );
// qui il tuo codice del loop
}
}
Il funzionamento interno di setup_postdata()
è abbastanza semplice da capire (almeno per quanto riguarda l'impostazione delle variabili globali):
$currentday = mysql2date('d.m.y', $post->post_date, false);
$currentmonth = mysql2date('m', $post->post_date, false);
Quindi la parte dinamica è $previousday
rispetto alla quale viene impostato e verificato il globale $currentday
. E a meno che non ci sia un nuovo giorno, the_date()
non mostrerà nulla.
Basta impostare i tuoi post su giorni completamente diversi e improvvisamente vedrai apparire la data su ogni post.
Qual è l'idea alla base di questo?
In realtà l'idea è piuttosto semplice ed è presente dalla versione 0.7.1 - almeno questo è ciò che afferma il phpDocBlock: Perché vorresti visualizzare la data per ogni post in un archivio? Un archivio si presenta così:
+--------------+
| 28.10.2014 |
+--------------+
| Post Titolo A |
| Post Titolo B |
+--------------+
| 29.10.2014 |
+--------------+
| Post Titolo C |
| Post Titolo D |
+--------------+
Non sei d'accordo? Beh, allora stai semplicemente usando una funzione che era pensata per essere qualcosa di completamente diverso.
Perché get_the_date()
funziona e come usarlo nel modo corretto
Non è influenzato dall'if/else nella funzione the_date()
(il controllo delle variabili globali). Inoltre non ha il filtro. Come risolvere? Semplice:
echo apply_filters( 'the_date', get_the_date(), get_option( 'date_format' ), '', '' );
Questo aggiunge tutte le callback collegate al filtro the_date
al tuo output personalizzato. Utilizza anche l'impostazione predefinita dell'opzione date_format
come default - esattamente come fa the_date()
. Ed evita qualsiasi valore before
e after
- di nuovo, esattamente come la funzione the_date()
.

Grazie kaiser. Questo spiega perché a volte non riesce a stampare la data. Grazie mille.

grazie per aver approfondito la questione @kaiser - più informazioni di quante ne avessi mai immaginate su un problema così banale

Questa risposta è migliore della spiegazione nella documentazione ufficiale di WP.

Non usare the_date()
, usa invece the_time()
.
the_date restituisce solo la data, the_time restituisce la data + l'ora. Non conosco il motivo per cui WordPress non restituisca più di una data quando the_date
viene usato in un loop. Ma ha a che fare con il fatto che il valore è lo stesso. Se usi the_time
il valore non è mai lo stesso, quindi restituisce sempre il valore. Quindi puoi stampare qualcosa come <?php the_time('F j, Y'); ?>
Questo link dal codex, spiega come funziona the_date molto meglio di quanto faccia io.

Appare solo una volta perché è così che funziona un diario. Mostrerebbe la data in alto e scriveresti i tuoi post sotto di essa. Uso questo codice per visualizzare le date per ogni post utilizzando the_time.
<?php the_time(get_option('date_format')); ?>
Per maggiori informazioni ho scritto un tutorial a riguardo qui: Perché la funzione the_date() in WordPress Compare Solo Una Volta sul Primo Post

Si prega di notare che se si desidera promuovere il proprio prodotto/blog è necessario dichiarare la propria affiliazione, altrimenti la risposta potrebbe essere contrassegnata come spam. Si prega di leggere Come non essere uno spammer
