Il post non mostra la data se c'è un altro post con la stessa data


19

Ho un tipo di post personalizzato "premi". e ha creato un modello di pagina per i post delle query di quel tipo. I post dovrebbero mostrare la loro data di pubblicazione, ma se ci sono più di un post con la stessa data, solo il primo post mostra la data e gli altri no. C'è un modo per mostrare la data di ogni post?

inserisci qui la descrizione dell'immagine

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

Risposte:


40

Ho riscontrato problemi simili in passato perché ho modificato la mia funzione di data. Quindi i post visualizzavano la data se solo ogni post ha una data diversa, altrimenti viene restituito vuoto.

Prova <?php echo get_the_date(); ?>invece ad aggiungere .


26

Perché non mostra?

Quando guardi l'origine della the_date()funzione, noterai due globi:

global $currentday, $previousday;

E poi c'è una regola se c'è una data da visualizzare ... o no. Il controllo è simile a quello fatto con is_new_day():

if ( $currentday != $previousday ) {

    // show date

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

Come puoi vedere, $previousdayviene immediatamente impostato su$currentday; . Quindi viene echo una volta. Subito dopo, entrambi i giorni sono uguali e il controllo fallirà. Questo è il motivo per cui il tuo primo post lo mostra, ma gli altri non lo mostrano.

Perché lo mostra?

Se ti chiedi perché poi mostra più di una data, dopo che il globale viene euqalizzato, allora dovrai dare un'occhiatasetup_postdata() . Questa funzione viene chiamata da the_post();ed è responsabile per l'impostazione di tutto per un singolo post nel ciclo.

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

        // your loop stuff here
    }
}

Gli interni di setup_postdata()sono abbastanza facili da capire (almeno su ciò che i globali vengono impostati):

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

Quindi la parte mobile è $previousdaycontro la quale il $currentdayglobale viene impostato e verificato. E a meno che non ci sia un nuovo giorno , the_date()non verrà visualizzato nulla.

Basta impostare i tuoi post su giorni totalmente diversi e all'improvviso vedrai apparire la data su ogni post.

Qual è l'idea alla base?

In realtà l'idea è piuttosto semplice e presente dalla v0.7.1 - almeno questo è ciò che afferma phpDocBlock: Perché ti piacerebbe visualizzare la data per ogni post in un archivio? Un archivio è simile al seguente:

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

Non sei d'accordo con quello? Bene, allora stai semplicemente usando una funzione che doveva essere qualcosa di totalmente diverso.

Perché get_the_date()funziona e come usarlo nel modo giusto

Non è influenzato dall'if / else nella the_date()funzione (controllo globale). Inoltre non ha il filtro. Come risolverlo? Semplice:

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

Ciò aggiunge eventuali callback associati al the_datefiltro all'output personalizzato. Utilizza anche l'impostazione date_formatdell'opzione predefinita come predefinita, che viene utilizzata anche da the_date(). E evita qualsiasi valore beforee after- di nuovo, esattamente come la the_date()funzione.


1
Grazie Kaiser. Questo spiega perché a volte non riesce a stampare la data. Molte grazie.
Robert hue,

1
Spiegazione molto completa. Migliore della risposta accettata.
Nilambar Sharma,

1
@Nilambar La risposta accettata è la versione tl; dr e perfettamente bene :)
kaiser

oggetti di scena per scavare in questo @kaiser - più intuizioni di quanto mi sarei mai aspettato su una questione così banale
serraosays

1
Questa risposta è migliore della spiegazione dei documenti WP.
Ian,

10

Non usare the_date(), invece usathe_time() .

the_date restituisce solo la data, the_time restituisce la data + l'ora. Non so il motivo per cui wordpress non restituirà più di una data quandothe_date viene utilizzato in un ciclo. Ma ha a che fare con il fatto che il valore è lo stesso. Se si utilizza the_timeil valore non è mai lo stesso, quindi restituisce sempre il valore. Quindi puoi stampare qualcosa del genere<?php the_time('F j, Y'); ?>

Questo link dal codice spiega come the_date funzioni molto meglio di me.


1

Bruto forzalo.

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

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


0

Si presenta solo una volta perché è così che funzionerebbe un diario. Mostrerebbe la data in alto e tu scriveresti le tue voci sotto di essa. Uso questo codice per visualizzarne le date per ogni post usando the_time.

<?php the_time(get_option('date_format')); ?>

Per maggiori informazioni ho scritto un tutorial qui: Perché la funzione the_date () in WordPress appare solo una volta sul primo post


Nota: se desideri promuovere il tuo prodotto / blog, devi rivelare la tua affiliazione , altrimenti la tua risposta potrebbe essere contrassegnata come spam. Si prega di leggere Come non essere uno spammer
DavidPostill
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.