Le message n'affiche pas la date s'il y en a un autre avec la même date

19

J'ai un type de message personnalisé "appuyez sur". et fait un modèle de page les messages de requêtes de ce type. Les messages sont censés afficher leur date de publication, mais s'il y a plusieurs messages avec la même date, seul le premier message affiche la date et les autres ne le font pas. Existe-t-il un moyen d'afficher la date de chaque publication?

entrez la description de l'image ici

<?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(); ?>
Jaeeun Lee
la source

Réponses:

40

J'ai rencontré un problème similaire dans le passé parce que j'ai modifié ma fonction de date. Et puis les messages affichaient la date si seulement chaque message avait une date différente sinon il revenait vide.

Essayez d'ajouter à la <?php echo get_the_date(); ?>place.

Robert hue
la source
26

Pourquoi ça ne se voit pas?

Lorsque vous regardez la source de la the_date()fonction, vous remarquerez alors deux globales:

global $currentday, $previousday;

Et puis il y a une règle s'il y a une date à afficher ... ou pas. Le contrôle est similaire à celui effectué avec is_new_day():

if ( $currentday != $previousday ) {

    // show date

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

Comme vous pouvez le voir, le $previousdayse règle instantanément sur $currentday;. Il est donc répété une fois. Juste après cela, les deux jours sont identiques et la vérification échouera. C'est la raison pour laquelle votre premier message l'affiche, mais les autres ne le montrent pas.

Pourquoi ça se voit?

Si vous vous demandez pourquoi il affiche alors plus d'une date, après que le global se soit eucalisé, alors vous devrez y jeter un œilsetup_postdata() . Cette fonction est appelée par the_post();et est responsable de tout configurer pour un seul poste dans la boucle.

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

        // your loop stuff here
    }
}

Les internes de setup_postdata()sont assez faciles à comprendre (du moins à ce que les globaux ont défini):

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

Ainsi, la partie mobile est par $previousdayrapport à laquelle le $currentdayglobal est défini et vérifié. Et à moins qu'il n'y ait un nouveau jour , the_date()n'affichera rien.

Réglez simplement vos messages sur des jours totalement différents et tout à coup, vous verrez la date apparaître sur chaque message.

Quelle est l'idée derrière ça?

En fait, l'idée est assez simple et présente depuis la v0.7.1 - c'est du moins ce que dit le phpDocBlock: Pourquoi voudriez-vous afficher la date de chaque publication dans une archive? Une archive ressemble à ceci:

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

Vous n'êtes pas d'accord avec ça? Eh bien, vous utilisez simplement une fonction qui était censée être quelque chose de totalement différent.

Pourquoi le get_the_date()travail et comment utiliser la bonne façon

Il n'est pas affecté par le if / else dans la the_date()fonction (la vérification globale). Il n'a pas non plus de filtre. Comment y remédier? Facile:

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

Cela ajoute tous les rappels attachés au the_datefiltre à votre sortie personnalisée. Il utilise également le date_formatparamètre d'option par défaut par défaut - qui est également utilisé par the_date(). Et cela évite tout beforeet les aftervaleurs - encore une fois, exactement comme la the_date()fonction.

kaiser
la source
1
Merci kaiser. Cela explique pourquoi parfois il ne parvient pas à imprimer la date. Merci beaucoup.
Robert hue
1
Explication très complète. Meilleure que la réponse acceptée.
Nilambar Sharma
1
@Nilambar La réponse acceptée est la version tl; dr et parfaitement bien :)
kaiser
accessoires pour creuser dans ce @kaiser - plus d'informations que je ne m'y attendais sur un problème aussi banal
serraosays
1
Cette réponse est meilleure que l'explication des documents WP.
Ian
10

N'utilisez pas, utilisez the_date()plutôt the_time().

the_date renvoie uniquement la date, the_time renvoie la date + l'heure. Je ne connais pas la raison pour laquelle wordpress ne retournera pas plus d'une date lorsqu'il the_dateest utilisé dans une boucle. Mais cela a à voir avec le fait que la valeur est la même. Si vous utilisez the_timela valeur n'est jamais la même, elle renvoie donc toujours la valeur. Vous pouvez donc imprimer quelque chose comme<?php the_time('F j, Y'); ?>

Ce lien du codex, explique comment the_date fonctionne beaucoup mieux que moi.

gdaniel
la source
1

Brute le force.

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

A fonctionné pour moi, affiche la date complète, l'heure pour chaque message, que ce soit la même date ou non.

Sheba Tech
la source
0

Il n'apparaît qu'une seule fois parce que c'est ainsi qu'un journal fonctionnerait. Il afficherait la date en haut et vous écririez vos entrées en dessous. J'utilise ce code pour afficher les dates de chaque publication en utilisant the_time.

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

Pour plus d'informations, j'ai écrit un tutoriel à ce sujet ici: Pourquoi la fonction the_date () dans WordPress n'apparaît qu'une seule fois sur le premier message

Jonny Jordan
la source
Veuillez noter que si vous souhaitez promouvoir votre propre produit / blog, vous devez divulguer votre affiliation , sinon votre réponse peut être signalée comme spam. Veuillez lire Comment ne pas être un spammeur
DavidPostill