Il post non mostra la data se esiste un altro post con la stessa data

28 ott 2014, 20:50:23
Visualizzazioni: 35.8K
Voti: 25

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?

esempio di visualizzazione della data nei 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(); ?>
0
Tutte le risposte alla domanda 5
0
53

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.

28 ott 2014 21:03:01
6
30

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().

28 ott 2014 22:44:17
Commenti

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

Robert hue Robert hue
29 ott 2014 03:58:45

Spiegazione molto completa. Meglio della risposta accettata.

Nilambar Sharma Nilambar Sharma
29 ott 2014 05:43:02

@Nilambar La risposta accettata è la versione tl;dr e va benissimo :)

kaiser kaiser
29 ott 2014 05:48:56

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

serraosays serraosays
13 ott 2016 03:02:08

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

Ian Ian
10 apr 2017 01:19:37

Ha funzionato anche per me. Ottimo.

Robert Andrews Robert Andrews
22 gen 2019 10:04:40
Mostra i restanti 1 commenti
0
10

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.

28 ott 2014 21:01:58
0

Forza bruta.

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

Ha funzionato per me, mostra la data completa e l'ora per ogni post indipendentemente dal fatto che sia la stessa data o meno.

24 dic 2016 01:55:38
1

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

9 apr 2017 14:13:27
Commenti

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

DavidPostill DavidPostill
9 apr 2017 14:32:40